javascript 如何强制重新加载脚本并重新执行?

wljmcqd8  于 2023-04-10  发布在  Java
关注(0)|答案(7)|浏览(220)

我有一个页面正在从第三方(新闻提要)加载脚本。脚本的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中(在http://oneBigHairyURL中传递ID“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被重新加载到它。
知道我哪里做错了吗?

puruo6ea

puruo6ea1#

如何添加一个新的脚本标记到脚本(重新)加载?类似于下面的内容:

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

主要的一点是插入一个新的脚本标记--您可以删除旧的标记而不会产生任何后果。如果您有缓存问题,您可能需要向查询字符串添加一个时间戳。

68bkxrlz

68bkxrlz2#

这里有一个类似于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)

gk7wooem

gk7wooem3#

创建一个新的script标记并复制现有script标记的内容,然后添加它,效果很好。

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的建议,删除旧的script标记(只是为了保持DOM的精简,它不会影响结果),并重新插入一个具有相同src的新script标记,外加一个cachebuster。

oknwwptz

oknwwptz4#

卢克的回答有个小改动

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

并称之为

reloadJs("myFile.js");

这将不会有任何路径相关的问题。

xesrikrc

xesrikrc5#

使用此函数查找包含某个单词的所有脚本元素并刷新它们。

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>
jyztefdp

jyztefdp6#

使用PipesJS,我可以将其稀释为

<dyn insert="here" id="clickity" ajax="url">Click for refresh</dyn>
 <!-- <dyn> is a dynamic linker in PipesJS -->
 <article id="here"></article>

您将使用此状态来影响与JS源代码相同的文章。
所以用

<script id="here"></script>

将在此作用域中执行与<article>相同的操作。它将填充innerHTML。
如果需要,请在<head>标记上使用id。
你可以插入抢占式函数并与PipesJS一起使用它们。你也可以使用在调用之后的函数。
如果您更愿意使用计时器,则可以通过创建

setInterval(function(input) { document.getElementById("clickity").click(); }, 3000);

setInterval()对象。3000以毫秒为单位。
你可以在这里看到PipesJS

pxy2qtax

pxy2qtax7#

我知道这有点晚了,但是我想分享我的答案,我所做的是把脚本的标签保存在一个HTML文件中,把我的索引文件中的脚本,用一个id锁在一个div中,类似这样。

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

当我想刷新的时候,我就用了。

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

  });

相关问题