2012-03-09 1 views
42

У меня есть страница, загружающая скрипт с третьей стороны (лента новостей). URL-адрес src для сценария назначается динамически при загрузке (на сторонний код).Как принудительно перезагрузить и перезапустить сценарий?

<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 (Ид «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> 

Я получаю предупреждение, то ДИВ очищает, но не динамически не генерируется HTML перезагружается к нему.

Любая идея, что я делаю неправильно?

+0

Я не знаю, понимает ли браузер, что вы хотите, чтобы он снова загрузил js, так как вы пытаетесь загрузить один и тот же URL снова и снова. он, вероятно, считает это одним и тем же и не беспокоит. попробуйте метод кэширования при изменении src: 'scrElement.src = 'http: // oneBigHairyURL?v = 2' ; // auto-increment this value' –

+0

@Matt K. Да, я должен был опубликовать, что я пробовал это, но безрезультатно. Извините, это не было частью оригинального сообщения. –

+0

@JonathanM Я застрял на одном и том же, вы нашли решение? Добавление версии не работает. – Parth

ответ

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()' –

+0

га, справа, хороший звонок – Kelly

+0

Это так полезно. Молодец, Келли. –

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); 

Это не будет работать, если вы ожидаете, что скрипт менять каждый раз, что я считаю, это ваше дело. Вы должны следовать предложению Келли, просто удалите старый тег сценария (просто чтобы уменьшить размер DOM, это не повлияет на результат) и снова вставьте новый тег сценария с тем же src, а также с кешью.

26

Вот такой метод, который похож на Kelly, но удалит любой существующий скрипт с тем же источником и использует jQuery.

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

Обратите внимание, что атрибут 'type' больше не нужен для скриптов с HTML5. (http://www.w3.org/html/wg/drafts/html/master/scripting-1.html#the-script-element)

+1

Отличный !! Это помогает мне много после многих поисков. Благодарю. –

+0

Вы можете добавить новый JS, но вы не можете избавиться от старого. Любые слушатели и т. Д. Из исходного сценария будут по-прежнему жить, даже если вы удалите его тег скрипта. – user984003

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 ('head')' вместо тела? –

+0

@JonathanM Мы обычно держим наш сценарий в конце тела. Когда я публиковал это, это сработало для меня. Я думаю, вы также можете приложить голову, если это необходимо. –

Смежные вопросы