出于某种原因,当第一次启动浏览器时,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
答案 0 :(得分:14)
我遇到了与你完全相同的问题。在我开始幻灯片放映之前,我想要确保预先加载了一组图像。我正在利用
$(window).load(function(){
//All my code
});
这正是我所面对的。
我花了几天时间才弄明白我做错了什么。
问题出在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');
}
}
}