【问题标题】:Javascript executes twice in Internet ExplorerJavascript 在 Internet Explorer 中执行两次
【发布时间】:2012-05-30 13:59:51
【问题描述】:

我目前遇到了一个问题,即延迟加载的 javascript 将使用 Internet Explorer 执行两次 - 并且仅 Internet Explorer(当前版本 9)。火狐和铬的作品。这是我的代码:

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

我已经找到this posting 并根据它更改了我的代码,但仍然执行我的脚本两次。你们有什么想法吗?

编辑:这是我的解决方案

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 加载器。
  • 这不是解决方案,因为我不想加载不必要的脚本。

标签: javascript jquery internet-explorer jquery-deferred


【解决方案1】:

试试这个

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

【讨论】:

  • 没有用,我用你的解决方案还是执行了两次。
  • 你能用正在执行的脚本更新你的问题吗?我无法复制任何一组代码的问题(在 ie8 中,当前在我的 vm 上安装 ie9)。 jsfiddle.net/3n1gm4/V9nMk/9
  • 好吧,在我更改了代码中的一些延迟后,它实际上起作用了!我认为 deferred 本身而不是注入函数存在错误。接受了你的回答。感谢您的帮助!
  • @junior 为了使代码正常工作,做了哪些更改?
  • @mearde 请看一下我最初的问题,我在帖子底部添加了工作代码。
猜你喜欢
  • 2011-03-01
  • 2012-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-16
  • 1970-01-01
  • 2010-10-06
相关资源
最近更新 更多