IE9没有运行javascript onload

时间:2012-06-09 13:25:22

标签: javascript internet-explorer-9

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

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

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

这是我用来运行脚本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 个答案:

答案 0 :(得分:14)

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

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

这正是我所面对的。

  • 当我在IE中复制并粘贴URL时,onload事件似乎没有触发。
  • 如果我使用F12打开控制台,然后通过浏览器中的URL并按下回车键,那么一切似乎都在运行。
  • 现在我至少打开了一次控制台,
    • 如果我关闭了控制台然后重新加载了页面,那么onload就会被解雇。
    • 如果我输入了网址,然后按了回车键,那么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美分。在这个问题上拉我的头发的时间超过了我承认的时间。我希望这对至少某人有用。

答案 1 :(得分:3)

你需要弄清楚代码是否根本不运行,即。永远不会进入您的功能,或者如果它在您的功能中的某个特定线路上失败。 IE9是否显示任何警告或js错误?

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

如果它从未进入你的功能,那么你需要在更高的位置进行调用。

答案 2 :(得分:3)

只是一个小小的音符;当您使用任何调试关键字(如console.log)或任何相关的东西时,当且仅当调试器未启用时(使用F12),IE9才会转义此JS函数

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

答案 3 :(得分: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');
        }
    }
}