2012-03-09 117 views
42

我有一個從第三方加載腳本的頁面(新聞提要)。在加載時(每個第三方代碼)動態分配腳本的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加載的腳本,然後創建和(ID爲「div1287」在http://oneBigHairyURL傳遞負荷元素與來自新聞源的各種東西,有漂亮的格式化等進入div1287所以腳本知道在哪裏加載內容)。

唯一的問題是,它只加載一次。我希望它每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重新加載它。

任何想法,我做錯了嗎?

+0

我不知道瀏覽器是否理解你想讓它再次下載js,因爲你試圖一遍又一遍地加載相同的url。它可能認爲它是一樣的,並不打擾。嘗試更改src時的緩存技術:scrElement.src ='http:// oneBigHairyURL?V = 2' ; //自動遞增此value' – 2012-03-09 23:22:06

+0

@馬特K.是的,我應該已經發布,我已經試過了,但都無濟於事。對不起,它不是原始帖子的一部分。 – 2012-03-12 19:51:34

+0

@JonathanM我被困在同樣的事情,你找到一個解決方案?添加版本不起作用。 – Parth 2015-10-02 06:38:52

回答

44

如何使用腳本(重新)加載新腳本標記到< head>?如下所示:

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

要點是插入一個新的腳本標記 - 您可以刪除舊的腳本標記,而不會產生任何後果。如果您有緩存問題,您可能需要爲查詢字符串添加時間戳。

+12

對於緩存問題,最好的辦法是添加一個時間戳到URL''hello.js?cachebuster ='+ new Date()。getTime()' – 2012-03-09 23:36:37

+0

哈,對,很好打電話 – Kelly 2012-03-09 23:41:56

+0

這太好用了。凱莉幹得好。 – 2017-11-25 13:20:33

5

你有沒有嘗試從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,再加上一個緩存。

26

下面是一個類似於凱利的方法,但會刪除任何已有的腳本,並使用相同的源代碼,並使用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

太棒了!經過大量搜索後,它可以幫助我很多。謝謝。 – 2014-10-30 11:35:58

+0

你可以添加新的JS,但你無法擺脫舊的。即使您刪除其腳本標記,原始腳本中的任何聽衆等仍將保持有效。 – user984003 2016-08-23 12:09:35

1

小的調整,盧克的回答,

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

,並這樣稱呼它,

relaodJs("myFile.js"); 

這不會有任何路徑相關的問題。

+1

應該不會吧'.appendTo(「頭」)'代替的身體嗎? – 2016-03-23 23:06:50

+0

@JonathanM我們通常將腳本保留在主體的末尾。當我發佈這個,這爲我工作。如果需要,我認爲你也可以追加頭腦。 – 2016-03-24 15:25:25