【问题标题】:How to force a script reload and re-execute?如何强制脚本重新加载并重新执行?
【发布时间】:2012-03-09 23:10:28
【问题描述】:

我有一个页面正在加载来自第三方的脚本(新闻提要)。脚本的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 重新加载到它。

知道我做错了什么吗?

【问题讨论】:

  • 我不知道浏览器是否理解您希望它再次下载 js,因为您试图一遍又一遍地加载相同的 url。它可能认为它是相同的并且不打扰。更改 src 时尝试缓存技术:scrElement.src='http://oneBigHairyURL?v=2'; //auto-increment this value
  • @Matt K. 是的,我应该发帖说我已经尝试过了,但无济于事。抱歉,它不是原始帖子的一部分。
  • @JonathanM 我被困在同一件事上,你找到解决方案了吗?添加版本不起作用。
  • @Dr..Net,选择的答案对我有用。
  • @JonathanM 通过生成新的脚本标签,它确实有效。加载相同的标签但只是改变'src'属性的值怎么样?

标签: javascript html feed script-tag


【解决方案1】:

如何将一个新的脚本标签添加到

并带有要(重新)加载的脚本?如下所示:
<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>

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

【讨论】:

  • 对于缓存问题,最好在url上加个时间戳'hello.js?cachebuster='+ new Date().getTime()
  • @Juan Mendes,这是正确的,因为必须再次加载新闻提要。仅在需要缓存时才跳过它,以防只需要重新运行并且新的不必要的负载会减慢速度,例如不会更改的脚本。
【解决方案2】:

这是一种类似于 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)

【讨论】:

  • 太棒了!!经过大量搜索后,它对我有很大帮助。谢谢。
  • 你可以添加新的JS,但你不能摆脱旧的。即使您删除其脚本标签,原始脚本中的任何侦听器等仍将处于活动状态。
【解决方案3】:

您是否尝试过将其从 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 的建议,删除旧的 script 标签(只是为了保持 DOM 纤细,不会影响结果)并重新插入一个具有相同 src 的新 script 标签,加上一个 cachebuster。

【讨论】:

    【解决方案4】:

    对卢克的回答稍作调整,

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

    并称之为,

    reloadJs("myFile.js");
    

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

    【讨论】:

    • 不应该是.appendTo('head')而不是正文吗?
    • @JonathanM 我们通常将脚本放在正文的末尾。当我发布这个时,这对我有用。如果需要,我认为您也可以附加到头部。
    • 这是一个
    【解决方案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>

    【讨论】:

      【解决方案6】:

      我知道这为时已晚,但我想分享我的答案。 我所做的是将脚本的标签保存在 HTML 文件中, 将我的索引文件上的脚本锁定在一个带有 id 的 div 中,就像这样。

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

      当我想刷新时,我就使用了。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-07-28
        • 1970-01-01
        • 2020-08-21
        • 2022-01-20
        • 2016-02-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多