Как принудительно перезагрузить и перезагрузить script?
У меня есть страница, загружающая script из третьей стороны (лента новостей). URL src
для script назначается динамически при загрузке (на сторонний код).
<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>
script, загруженный из http://oneBigHairyURL
, затем создает и загружает элементы с различными материалами из ленты новостей, с довольно форматированием и т.д. в div1287
(идентификатор "div1287" передается в http://oneBigHairyURL
, поэтому script знает, где загрузить содержимое).
Единственная проблема заключается в том, что она загружает только один раз. Я бы хотел, чтобы он перезагружал (и таким образом отображал новый контент) каждые 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 не перезагружается.
Любая идея, что я делаю неправильно?
Ответы
Ответ 1
Как добавить новый тег сценария в <head> со сценарием (re) load? Что-то вроде ниже:
<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>
Главное - вставить новый тег скрипта - вы можете удалить старый без последствий. Возможно, вам потребуется добавить временную метку к строке запроса, если у вас есть проблемы с кешированием.
Ответ 2
Здесь метод, похожий на Kelly, но удалит все ранее существовавшие script с тем же источником и использует 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)
Ответ 3
Вы пытались удалить его из DOM, а затем снова вставить его?
Я просто сделал, что не работает. Однако, создавая новый тег script и копируя содержимое существующего тега script, а затем добавляя его, работает хорошо.
См. мой пример 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);
Это не сработает, если вы ожидаете, что script будет меняться каждый раз, что я считаю вашим делом. Вы должны следовать предложению Келли, просто удалите старый тег script (просто для того, чтобы сохранить DOM slim, это не повлияет на результат) и повторно вставьте новый тег script с тем же src, а также с кеш файлом.
Ответ 4
Небольшая настройка ответа Люка,
function reloadJs(src) {
src = $('script[src$="' + src + '"]').attr("src");
$('script[src$="' + src + '"]').remove();
$('<script/>').attr('src', src).appendTo('head');
}
и называть это как,
reloadJs("myFile.js");
Это не будет иметь никаких проблем, связанных с путем.
Ответ 5
Используйте эту функцию, чтобы найти все элементы скрипта, содержащие какое-то слово, и обновить их.
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>