【问题标题】:IE9 not running javascript onloadIE9 没有运行 javascript onload
【发布时间】:2012-06-13 06:08:21
【问题描述】:

由于某种原因,当浏览器第一次启动该会话时,IE9 没有运行我的 JavaScript 代码 onload。它似乎只在用户刷新页面后运行 onload 。当调试控制台打开时,它也会运行 JavaScript。

如何使 JavaScript 在浏览器打开后运行加载?这只是IE9的bug吗?

我将重申这一点,以便您理解:如果您在启动新的浏览器会话后访问该站点,则代码不会运行。如果您在新选项卡中打开网站、重新加载页面或打开调试控制台,代码确实会运行

这是我用来运行我的脚本 onload 的函数(在 NORMAL 浏览器中运行良好):

(function (i) {
  var u = navigator.userAgent;
  var e = /*@cc_on!@*/
  false;
  var st = setTimeout;
  if (/webkit/i.test(u)) {
    st(function () {
      var dr = document.readyState;
      if (dr == "loaded" || dr == "complete") {
        i()
      } else {
        st(arguments.callee, 10);
      }
    }, 10);
  } else if ((/mozilla/i.test(u) && !/(compati)/.test(u)) || (/opera/i.test(u))) {
    document.addEventListener("DOMContentLoaded", i, false);
  } else if (e) {
    (function () {
      var t = document.createElement('doc:rdy');
      try {
        t.doScroll('left');
        i();
        t = null;
      } catch (e) {
        st(arguments.callee, 0);
      }
    })();
  } else {
    window.onload = i;
  }
})(init); //init is the function to call onload

【问题讨论】:

  • 作为一个好的 javascript 提示,始终使用特征检测而不是浏览器检测。看到这段代码,我的眼睛很痛。您可以使用 jQuery 解决您遇到的大多数跨浏览器问题。 api.jquery.com/ready在ie8下能用吗?
  • 我拒绝使用 jQuery。我会坚持手工编码谢谢。我对实际使用 JavaScript 感兴趣,而不是库。这段代码真的不是问题,我也在某个地方发现它认为它可以解决我的问题(它没有)。主要的一点是,当你重新加载页面或打开调试控制台时它可以正常工作,但当你第一次启动浏览器并转到该站点时它就不行了——这没有任何意义!
  • 你能评论你的代码吗?我不明白你在做什么。您将 false 分配给“e”变量,然后在“else if (e)”中使用它。这是什么意思?
  • @caligula:这是确定 IE 的技巧。 IE 支持注释前面包含否定的!
  • 如果你绝对坚持不使用 jQuery 那么 window.onload 无论如何都不应该在 IE9 中使用,而是你应该使用 window.addEventListener( "load", doLoad, false );看到这个:msdn.microsoft.com/en-us/library/ie/cc197055(v=vs.85).aspx

标签: javascript internet-explorer-9


【解决方案1】:

我遇到了与您完全相同的问题。我有一组图像,我想确保在开始幻灯片放映之前预先加载这些图像。我正在使用

$(window).load(function(){
    //All my code
});

这正是我所面临的。

  • 当我在 IE 中复制并粘贴 URL 时,onload 事件似乎没有触发。
  • 如果我使用 F12 打开控制台,然后在浏览器中输入 URL 并按下回车键,一切似乎都正常。
  • 现在我至少打开了一次控制台,
    • 如果我关闭控制台然后重新加载页面,onload 就会触发。
    • 如果我键入 URL 然后按 Enter,则 onload 正在触发。

我花了几天时间才真正弄清楚我做错了什么。

问题出在 console.log 语句上。在我的代码中的很多地方,我做了很多控制台日志记录。甚至我使用的插件之一 - jplayer 在代码中的某处都有一条未注释的控制台消息。

问题是,除非您在 IE 中至少打开一次控制台,否则控制台对象不可用。这意味着代码将在它遇到的第一个 console.log 处失败。

现在,为了在 IE 中进行测试,我没有心情将我的所有 console.log 语句注释掉。所以,这就是我所做的。在我的 document.ready jquery 函数的顶部,我编写了这个小 sn-p 代码。

if(!window.console){
    console={};
    console.log = function(){};
}

它的主要作用是创建一个虚拟的 console.log 函数占位符,以便代码可以在 IE 中运行,但只有当 console.log 是您在代码中使用的唯一控制台函数时,它才会起作用,或者在你的插件中。

只有我的 2 美分。在这个问题上拉我头发的时间比我愿意承认的要长。我希望这至少对某人有用。

【讨论】:

  • 感谢,console.log 破坏了我在 IE 中的代码,将其注释掉并修复了它
  • 作为一个仍然被 IE9 维护诅咒的人,我感谢你找到这个
【解决方案2】:

您需要确定代码是否根本无法运行,即永远不会进入您的函数,或者如果它在函数内的某些特定行上失败。 IE9是否显示任何警告或js错误?

最简单的做法是在代码中粘贴一堆 alert() 语句,以查看它在哪里停止并缩小到该行。

如果它从未进入你的函数,那么你需要往高处看,在哪里进行调用。

【讨论】:

  • 显然没有人在听我的。如果您在启动新的浏览器会话后访问该站点,则代码不会运行。如果您在新选项卡中打开网站、重新加载页面或打开调试控制台,代码确实会运行。
  • 如果代码没有运行,那一定是你调用它的方式,而不是你粘贴的sn-p。你能显示调用这个函数的代码吗?
  • 没有调用它的代码,它在加载 javascript 时运行,然后确定何时加载文档以调用我的 init 函数。这是您可以达到的最高水平。
  • 如果这是最高级别,那么 init 来自哪里?
  • 太糟糕了。你能发送完整的设置吗?只有 init 函数没有运行还是执行甚至没有到达 onload 包装器的内部工作?如果一切都是线性执行的,我不明白为什么这有时会起作用而有时不起作用。
【解决方案3】:

只是一个小提示;当您使用任何调试关键字(如 console.log)或任何相关内容时,当且仅当调试器未打开(使用 F12)时,IE9 才会转义此 JS 函数

实际上我不知道还有什么导致问题,但对我来说,我的问题是“console.log”这个词,而调试器在 IE9 中没有打开......我知道这已经是一个已回答的问题,但我觉得它需要被知道。

【讨论】:

    【解决方案4】:

    好的,我想通了。这与 IE 处理 IF 语句的一些奇怪方式有关。

    在我的 init 函数中,我有两个 IF 语句,一个检查变量是否存在,然后记录该变量的值。另一个检查相同变量的值是否等于任意字符串。

    删除第一个 IF 语句后,似乎一切正常。我还决定使用不同的 onload 函数,如下所示:

    if (document.addEventListener) {
        document.addEventListener('DOMContentLoaded', init, true);
    } else if (document.all && !window.opera){ //Crude test for IE
    //Define a "blank" external JavaScript tag
        document.write('<script type="text/javascript" id="contentloadtag" defer="defer" src="javascript:void(0)"><\/script>');
        var contentloadtag=document.getElementById("contentloadtag");
        contentloadtag.onreadystatechange=function(){
            if (this.readyState=="complete") {
                init();
                //ie('open');
            }
        }
    }
    

    【讨论】:

    • 虽然这适用于 IE 9,但我更喜欢使用 jQuery(contentloadtag).ready(init);,它更具可读性和健壮性。
    • 但我不使用 jQuery。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-27
    • 2016-05-28
    • 2016-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多