IE9未在加载时运行javascript

IE9未在加载时运行javascript,javascript,internet-explorer-9,Javascript,Internet Explorer 9,出于某种原因,IE9在浏览器第一次启动会话时没有运行我的JavaScript代码onload。它似乎只在用户刷新页面后才运行onload。当调试控制台打开时,它还将运行JavaScript 如何使JavaScript在浏览器打开后在加载时运行?这只是IE9的一个bug吗 我将重申这一点,以便您理解:如果您在启动新的浏览器会话后访问该站点,则代码不会运行。如果在新选项卡中打开站点,或重新加载页面,或打开调试控制台,则代码不会运行 下面是我用来运行脚本onload的函数(在普通浏览器中工作正常):

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

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

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

下面是我用来运行脚本onload的函数(在普通浏览器中工作正常):


您需要弄清楚代码是否根本不运行,也就是说,从未进入您的函数,或者它是否在函数中的某一行失败。IE9是否显示任何警告或js错误

最简单的方法是在代码中插入一组alert()语句,以查看其停止位置,并缩小到该行


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

好的,我找到了答案。这与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');
        }
    }
}
if(document.addEventListener){
document.addEventListener('DOMContentLoaded',init,true);
}else如果(document.all&&!window.opera){//IE的原始测试
//定义一个“空白”外部JavaScript标记
文件。写(“”);
var contentloadtag=document.getElementById(“contentloadtag”);
contentloadtag.onreadystatechange=函数(){
if(this.readyState==“complete”){
init();
//即(“开放”);
}
}
}

我的问题与您的问题完全相同。我有一组图像,我想确保在开始幻灯片放映之前已经预装好。我在利用

$(window).load(function(){
    //All my code
});
这正是我所面临的

  • 当我在IE中复制并粘贴URL时,onload事件似乎没有触发
  • 如果我使用F12打开控制台,然后通过浏览器中的URL并按enter键,那么一切似乎都正常工作
  • 现在我至少打开了控制台一次,
    • 如果我关闭控制台,然后重新加载页面,则会触发onload
    • 如果我键入URL,然后按enter键,则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美分。我在这个问题上发火的时间比我愿意承认的要长。我希望这至少对某些人有用。

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


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

作为一个好的javascript技巧,始终使用功能检测,而不是浏览器检测。看到这个代码我的眼睛很痛。通过使用jQuery,您可以解决遇到的大多数跨浏览器问题。它在ie8中工作吗?我拒绝使用jQuery。我会坚持手工编码,谢谢。我感兴趣的是实际使用JavaScript,而不是库。这段代码真的不是问题所在,而且我在某处发现它,认为它可以解决我的问题(它没有)。主要的一点是,当您重新加载页面或打开调试控制台时,它可以正常工作,但当您第一次启动浏览器并访问站点时,它就不能正常工作了——这毫无意义!你能评论你的代码吗?我不明白你在干什么。将false赋值给“e”变量,然后在“else if(e)”中使用它。这是什么意思?@caligula:这是确定IE的一个技巧。IE支持前面包含否定
的注释。如果您坚持不使用jQuery,那么无论如何IE9中都不应该使用window.onload,而是应该使用window.addEventListener(“load”,doLoad,false);看这个:显然没有人在听我说话。如果在启动新浏览器会话后转到该站点,则代码不会运行。如果您在新选项卡中打开站点,或重新加载页面,或打开调试控制台,则代码确实会运行。如果代码未运行,则一定是您调用它的方式造成的,而不是您粘贴的代码段。可以显示调用此函数的代码吗?没有调用此函数的代码,它在加载javascript时运行,然后确定何时加载文档以调用my init函数。这是你能达到的最高点。如果
if(!window.console){
    console={};
    console.log = function(){};
}