Javascript在Internet Explorer中执行两次
我目前遇到了一个问题,一个延迟加载的javascript将使用internet explorer执行两次,并且只使用internet explorer(当前版本9)。Firefox和chrome都可以使用。这是我的密码:Javascript在Internet Explorer中执行两次,javascript,jquery,internet-explorer,jquery-deferred,Javascript,Jquery,Internet Explorer,Jquery Deferred,我目前遇到了一个问题,一个延迟加载的javascript将使用internet explorer执行两次,并且只使用internet explorer(当前版本9)。Firefox和chrome都可以使用。这是我的密码: injectExternalJavaScript: function(fileUrl) { return jQuery.Deferred(function(deferred) { var script = document.createElement('
injectExternalJavaScript: function(fileUrl) {
return jQuery.Deferred(function(deferred) {
var script = document.createElement('script');
script['src'] = fileUrl;
script['type'] = 'text/javascript';
var head = document.getElementsByTagName("head")[0];
var done = false;
// Attach handlers for all browsers
script['onload'] = script['onreadystatechange'] = function() {
if (!done && (!this.readyState || this.readyState === "loaded" || this.readyState === 'complete')) {
done = true;
script['onload'] = script['onreadystatechange'] = null;
head.removeChild(script);
deferred.resolve();
}
};
head.appendChild(script);
}).promise();
}
我已经找到并根据它修改了我的代码,但ie仍然在执行我的脚本两次。你们有什么想法吗
编辑:这是我的解决方案
injectExternalJavaScript: function(fileUrl) {
return jQuery.Deferred(function(deferred) {
var script = document.createElement('script');
script['src'] = fileUrl;
script['type'] = 'text/javascript';
var head = document.getElementsByTagName("head")[0];
var done = false;
// Attach handlers for all browsers
var cb = function() {
if (!done && (!this.readyState || this.readyState === "loaded" || this.readyState === 'complete')) {
done = true;
script['onload'] = script['onreadystatechange'] = null;
head.removeChild(script);
deferred.resolve();
}
}
if (script.addEventListener) {
script.addEventListener('load', cb, false);
} else {
script['onreadystatechange'] = cb;
}
head.appendChild(script);
}).promise();
}
试试这个
s = document.createElement("script");
s.src="myscript.js";
if(s.addEventListener) {
s.addEventListener("load",callback,false);
}else if(s.readyState) {
s.onreadystatechange = callback;
}
document.body.appendChild(s);
function callback() { console.log("loaded"); }
取自
对你来说是
injectExternalJavaScript: function(fileUrl) {
return jQuery.Deferred(function(deferred) {
var script = document.createElement('script');
script['src'] = fileUrl;
script['type'] = 'text/javascript';
var head = document.getElementsByTagName("head")[0];
var done = false;
// Attach handlers for all browsers
var cb = function() {
if (!done && (!this.readyState || this.readyState === "loaded" || this.readyState === 'complete')) {
done = true;
script['onload'] = script['onreadystatechange'] = null;
head.removeChild(script);
deferred.resolve();
}
};
if ( script.addEventListener ) {
script.addEventListener('load',cb, false);
} else {
script.onreadystatechange = cb;
}
head.appendChild(script);
}).promise();
}
作为替代方案,您可能会喜欢JS加载器。这不是解决方案,因为我不想加载任何超出需要的脚本。不起作用,在使用您的解决方案时仍执行两次。您能用正在执行的脚本更新您的问题吗?我无法复制(在ie8中,当前在我的vm上安装ie9)这两组代码的问题。好吧,在我改变了代码中的一些延迟后,它实际上起作用了!我认为延迟函数本身存在缺陷,而不是注入函数。我接受了你的回答。谢谢你的帮助@junior为了使代码正常工作,做了哪些更改?@mearde请看一下我最初的问题,我在帖子底部添加了正常工作的代码。