我正在尝试以编程方式在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)存储最后修改的资源,除非我从控制台重新加载它。
您应该在使用脚本之前等待脚本加载。可以使用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);
};
如果您只是在重新加载之前删除脚本标记的最后一个实例,那么应该强制它重新加载。
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')
}