在Internet Explorer中,Javascript会执行两次

8
我最近遇到了一个问题,使用Internet Explorer(目前版本9)时,延迟加载的javascript会执行两次。在Firefox和Chrome上可以正常工作。以下是我的代码:

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();
}

作为替代,您可能喜欢 head.js JS加载器。 - Barry Kaye
这不是解决方案,因为我不想加载比必要更多的脚本。 - mayrs
1个回答

2

试试这个

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"); }

以下内容摘自http://msdn.microsoft.com/en-us/library/ie/hh180173(v=vs.85).aspx

对于你来说,需要理解的是...

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();
}

你的解决方案没有起作用,当我使用它时仍然执行了两次。 - mayrs
你能否更新你的问题并附上正在执行的脚本吗?我不能在任一组代码中复制(在ie8中,我当前正在安装ie9的vm),这个问题。http://jsfiddle.net/3n1gm4/V9nMk/9/ - tastybytes
1
好的,在我更改了代码中的一些延迟后,它实际上起作用了!我认为延迟本身存在错误,而不是注入函数。接受了你的答案。感谢你的帮助! - mayrs
2
@junior,为了让代码正常工作,做了哪些更改? - B5A7
@mearde 请看一下我的初始问题,我在帖子底部添加了可工作的代码。 - mayrs
很好,它能正常工作了...但是为什么?IE到底做了什么来搞砸它? - Alkanshel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接