4

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

如何使 JavaScript 在浏览器打开后运行 onload?这只是IE9的错误吗?

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

这是我用来运行脚本 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
4

4 回答 4

14

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

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

这正是我所面临的。

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

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

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

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

现在,我没有心情为了在 IE 中测试它而注释掉我所有的 console.log 语句。所以,这就是我所做的。在我的 document.ready jquery 函数的顶部,我编写了这段代码。

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

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

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

于 2012-10-16T22:29:00.370 回答
3

您需要弄清楚代码是否根本没有运行,即从未进入您的函数,或者它是否在函数内的某些特定行上失败。IE9 是否显示任何警告或 js 错误?

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

如果它从未进入您的函数,那么您需要查看更高的位置,即进行调用的位置。

于 2012-06-09T13:53:42.497 回答
3

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

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

于 2013-01-22T14:57:23.873 回答
2

好吧,我想通了。它与 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');
        }
    }
}
于 2012-06-09T15:54:48.843 回答