在Chrome中以编程方式重新加载JavaScript资源

问题描述 投票:1回答:2

我正在尝试以编程方式在Chrome中重新加载javascript资源,如果我从控制台运行它,那么它工作正常,但如果我把它放入代码中以在事件被触发后重新加载,那么资源不会改变。问题是什么?

我用这个重载器:

var docHeadObj = document.getElementsByTagName("head")[0];
var dynamicScript = document.createElement("script");
dynamicScript.type = "text/javascript";
dynamicScript.src = 'js/resource.js';
docHeadObj.appendChild(dynamicScript);

这是事件处理程序:

obj.onclick(function(){
    var docHeadObj = document.getElementsByTagName("head")[0];
    var dynamicScript = document.createElement("script");
    dynamicScript.type = "text/javascript";
    dynamicScript.src = 'js/resource.js';
    docHeadObj.appendChild(dynamicScript);
});

在两种情况下,新的和正确的<script>元素被附加到<head>并且在网络选项卡上下载资源,但是在第二个情况下,资源永远不会改变。

编辑:

我更接近问题了。如果我在资源中有这个代码将被重新加载alert("aaa");我打开应用程序然后在执行点击事件后,我得到一个3'a'字母的警报。然后我将字母数减少到2,重新加载资源,执行点击事件,然后我再次看到3'a'字母。然后我将字母数减少到1,保存并单击,然后我看到2'a'字母。所以它似乎是Chrome(以及FF)存储最后修改的资源,除非我从控制台重新加载它。

javascript google-chrome
2个回答
0
投票

您应该在使用脚本之前等待脚本加载。可以使用onload事件为动态脚本实现

function loadScript(url, callback) {
    var docHeadObj = document.getElementsByTagName("head")[0];
    var dynamicScript = document.createElement("script");
    dynamicScript.type = "text/javascript";
    dynamicScript.src = url;

    // bind the event to the callback function
    dynamicScript.onreadystatechange = callback; //for ie<9
    dynamicScript.onload = callback;

    // Fire the loading
    docHeadObj.appendChild(dynamicScript);
}


var testJQuery = function () {
    console.log($(this));
};

var obj = document.getElementById("test");
obj.onclick = function () {
    loadScript("//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js", testJQuery);

};

Working example on fiddle


0
投票

如果您只是在重新加载之前删除脚本标记的最后一个实例,那么应该强制它重新加载。

function load(link, id) {
    var exists = document.getElementById(id)
    if(exists){
        exists.parentNode.removeChild(exists);
    }
    var script = document.createElement('script');
    script.src = link;
    script.id = id;
    document.body.appendChild(script);
}
obj.onclick = function(){
    load('js/resource.js','dynamicScript')
}
© www.soinside.com 2019 - 2024. All rights reserved.