스크립트를 강제로 다시로드하고 다시 실행하는 방법은 무엇입니까?


78

제 3 자 (뉴스 피드)에서 스크립트를로드하는 페이지가 있습니다. src스크립트 의 URL은로드 할 때 동적으로 할당됩니다 (타사 코드 당).

<div id="div1287">
    <!-- dynamically-generated elements will go here. -->
</div>

<script id="script0348710783" type="javascript/text">
</script>

<script type="javascript/text">
    document.getElementById('script0348710783').src='http://oneBigHairyURL';
</script>

http://oneBigHairyURL그런 다음 로드 된 스크립트 는 뉴스 피드의 다양한 항목과 예쁜 형식 등을 사용하여 요소를 만들고로드합니다 div1287(ID "div1287"이 전달되어 http://oneBigHairyURL스크립트가 콘텐츠를로드 할 위치를 알 수 있음).

유일한 문제는 한 번만로드한다는 것입니다. n 초마다 다시로드 (따라서 새 콘텐츠 표시)하고 싶습니다.

그래서 나는 이것을 시도 할 것이라고 생각했습니다.

<div id="div1287">
    <!-- dynamically-generated elements will go here. -->
</div>

<script id="script0348710783" type="javascript/text">
</script>

<script type="javascript/text">
    loadItUp=function() {
        alert('loading...');
        var divElement = document.getElementById('div1287');
        var scrElement = document.getElementById('script0348710783');

        divElement.innerHTML='';
        scrElement.innerHTML='';
        scrElement.src='';
        scrElement.src='http://oneBigHairyURL';
        setTimeout(loadItUp, 10000);
    };
    loadItUp();
</script>

경고가 표시되고 div가 지워지지 만 동적으로 생성 된 HTML이 다시로드되지 않습니다.

내가 뭘 잘못하고 있는지 아십니까?


동일한 URL을 반복해서로드하려고하기 때문에 브라우저가 js를 다시 다운로드하기를 원한다는 것을 브라우저가 이해하는지 모르겠습니다. 아마 똑같이보고 신경 쓰지 않을 것입니다. src를 변경할 때 캐싱 기술을 시도하십시오.scrElement.src='http://oneBigHairyURL?v=2'; //auto-increment this value
Matt K

@Matt K. 예, 내가 이것을 시도했지만 아무 소용이 없다고 게시 했어야했습니다. 원래 게시물의 일부가 아니 어서 죄송합니다.
Jonathan M

@JonathanM 나는 같은 일에 갇혀있어, 해결책을 찾았습니까? 버전 추가가 작동하지 않습니다.
Parth

1
@ Dr..Net, 선택한 답변이 저에게 효과적이었습니다.
Jonathan M

@JonathanM은 새 스크립트 태그를 생성하여 작동합니다. 동일한 태그를로드하고 'src'속성 값만 변경하는 것은 어떻습니까?
Parth

답변:


74

(재)로드 할 스크립트와 함께 <head>에 새 스크립트 태그를 추가하는 것은 어떻습니까? 아래와 같이 :

<script>
   function load_js()
   {
      var head= document.getElementsByTagName('head')[0];
      var script= document.createElement('script');
      script.src= 'source_file.js';
      head.appendChild(script);
   }
   load_js();
</script>

요점은 새 스크립트 태그를 삽입하는 것입니다. 결과없이 이전 태그를 제거 할 수 있습니다. 캐싱 문제가있는 경우 쿼리 문자열에 타임 스탬프를 추가해야 할 수 있습니다.


22
캐시 문제의 경우, 가장 좋은 점은 URL에 타임 스탬프를 추가하는 것입니다'hello.js?cachebuster='+ new Date().getTime()
후안 멘데스

@Juan Mendes, 뉴스 피드를 다시로드해야하기 때문에 맞습니다. 재실행 만 필요하고 변경되지 않는 스크립트와 같이 새로운 불필요한로드가 느려지는 경우에만 캐시가 필요한 경우에만 건너 뛰십시오.

41

다음은 Kelly와 유사하지만 동일한 소스를 가진 기존 스크립트를 제거하고 jQuery를 사용하는 방법입니다.

<script>
    function reload_js(src) {
        $('script[src="' + src + '"]').remove();
        $('<script>').attr('src', src).appendTo('head');
    }
    reload_js('source_file.js');
</script>

HTML5부터는 'type'속성이 더 이상 스크립트에 필요하지 않습니다. ( http://www.w3.org/html/wg/drafts/html/master/scripting-1.html#the-script-element )


1
큰!! 많은 검색을 한 후에 많은 도움이됩니다. 감사.
Md. Salahuddin 2014 년

3
새 JS를 추가 할 수 있지만 이전 JS를 제거 할 수는 없습니다. 원본 스크립트의 모든 리스너 등은 스크립트 태그를 제거하더라도 여전히 활성 상태입니다.
user984003

9

DOM에서 제거한 다음 다시 삽입 해 보셨습니까?

방금했는데 작동하지 않습니다. 그러나 새 스크립트 태그를 만들고 기존 스크립트 태그의 내용을 복사 한 다음 추가하면 잘 작동합니다.

내 예 http://jsfiddle.net/mendesjuan/LPFYB/ 참조

var scriptTag = document.createElement('script');
scriptTag.innerText = "document.body.innerHTML += 'Here again ---<BR>';";
var head = document.getElementsByTagName('head')[0];
head.appendChild(scriptTag);

setInterval(function() {
    head.removeChild(scriptTag);
    var newScriptTag = document.createElement('script');
    newScriptTag.innerText = scriptTag.innerText;
    head.appendChild(newScriptTag);
    scriptTag = newScriptTag;    
}, 1000);

스크립트가 매번 변경 될 것으로 예상하면 작동하지 않습니다. Kelly의 제안에 따라 이전 스크립트 태그를 제거하고 (DOM을 슬림하게 유지하기 위해 결과에 영향을주지 않음) 동일한 src 및 캐시 버스터가있는 새 스크립트 태그를 다시 삽입해야합니다.


4

Luke의 대답에 약간의 조정,

 function reloadJs(src) {
    src = $('script[src$="' + src + '"]').attr("src");
    $('script[src$="' + src + '"]').remove();
    $('<script/>').attr('src', src).appendTo('head');
}

다음과 같이 부릅니다.

reloadJs("myFile.js");

경로 관련 문제가 없습니다.


1
.appendTo('head')몸 대신 해야하지 않습니까?
Jonathan M

@JonathanM 우리는 보통 본문 끝에 스크립트를 보관합니다. 이것을 게시 할 때 이것은 나를 위해 일했습니다. 필요한 경우 머리에 추가 할 수도 있습니다.
Maleen Abewardana

1
이것은 하나입니다

3

이 함수를 사용하여 일부 단어가 포함 된 모든 스크립트 요소를 찾고 새로 고칩니다.

function forceReloadJS(srcUrlContains) {
  $.each($('script:empty[src*="' + srcUrlContains + '"]'), function(index, el) {
    var oldSrc = $(el).attr('src');
    var t = +new Date();
    var newSrc = oldSrc + '?' + t;

    console.log(oldSrc, ' to ', newSrc);

    $(el).remove();
    $('<script/>').attr('src', newSrc).appendTo('head');
  });
}

forceReloadJS('/libs/');
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>


0

늦었 음을 알고 있지만 제 대답을 공유하고 싶습니다. 내가 한 일은 HTML 파일에 de script의 태그를 저장하고 ID가있는 div의 Index 파일에 스크립트를 잠그는 것입니다.

<div id="ScriptsReload"><script src="js/script.js"></script></div>

새로 고침하고 싶을 때 방금 사용했습니다.

$("#ScriptsReload").load("html_with_scripts_tags.html", "", function(
    response,
    status,
    request
  ) {

  });
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.