在开发工具被激活之前,带有JS的网站在IE9中不起作用

我正在开发一个复杂的网站,严重利用jQuery和一些脚本。 在网站的加载,我的脚本没有任何工作(虽然我可以确认其他脚本运行良好)。 我不会在SE这里发表这样一个蹩脚的问题,除了一件事:

当我打开F12来打开开发工具,所以我可以debugging我的问题,一切都立即完美!

更糟的是,如果我closures浏览器,启动它,首先打开开发工具,并访问网站,一切都按预期工作。

所以我甚至不能debugging这个问题,因为Dev Tools修复了这个问题! Dev Tools可以做些什么使事情发挥作用? 它会改变UA(我做一些jQuery.browser检测)? 它是否做一些doctype?

编辑

我所有的控制台日志logging都包装在下面的包装实用程序function中:

function log(msg){ if (console){ console.log(msg); } } 

任何想法或build议,我可以尝试将是受欢迎的。 如果我find解决scheme,我会在这里发布。

我很欣赏我在这里的晚会很晚,但我有一个IE9的解决scheme,有点不同。

 (function() { var temp_log = []; function log() { if (console && console.log) { for (var i = 0; i < temp_log.length; i++) { console.log.call(window, temp_log[i]); } console.log.call(window, arguments); } else { temp_log.push(arguments); } } })(); 

基本上,而不是console.log你使用log 。 如果console.log存在,那么它将正常工作,否则它会将日志条目存储在数组中,并将其输出到console可用的下一个log中。

如果在console可用时尽快推送数据,那将是非常好的,但这比设置自定义setInterval侦听器要便宜。

更新的function(2012年10月1日)

我已经更新了这个脚本供我自己使用,并认为我会分享它。 它有几个值得改进的地方:

  • 使用console.log()像正常一样,即不再需要使用非标准的log()
  • 支持多个参数,例如console.log('foo', 'bar')
  • 你也可以使用console.errorconsole.warnconsole.info (尽pipe把它们输出为console.log
  • 脚本每1000毫秒检查一次本地console并在find时输出缓冲区

我认为,通过这些改进,这已经成为IE9的一个非常坚实的基础。 看看这里的GitHub回购 。

 if (!window.console) (function() { var __console, Console; Console = function() { var check = setInterval(function() { var f; if (window.console && console.log && !console.__buffer) { clearInterval(check); f = (Function.prototype.bind) ? Function.prototype.bind.call(console.log, console) : console.log; for (var i = 0; i < __console.__buffer.length; i++) f.apply(console, __console.__buffer[i]); } }, 1000); function log() { this.__buffer.push(arguments); } this.log = log; this.error = log; this.warn = log; this.info = log; this.__buffer = []; }; __console = window.console = new Console(); })(); 

你有控制台调用,在IE中这些将会失败,如果开发工具没有打开。 一个简单的解决方法是将任何控制台调用包装在如下函数中:

 function log(msg) { if(console) console.log(msg); } 

我用下面的方法破解了它

 <script type="text/javascript"> (function () { if (typeof console == "undefined") { console = { log : function () {} } } })(); </script> 

这是第一个脚本元素。

大多数其他的解决scheme应该工作得很好,但是如果你不关心在控制台不可用的情况下捕获日志消息,这里是一个简短的一行。

 // Stub hack to prevent errors in IE console = window.console || { log: function() {} }; 

这使您仍然可以直接使用本地console.log函数,而不是用任何东西包装它或每次都有一个条件。

我发现使用console && console.log('foo', 'bar', 'baz')而不是使用包装函数更方便。

您提供的代码:

 function logError(msg){ if (console) { console.log(msg); } else { throw new Error(msg); } } 

当开发工具closures时,会为IE产生一个错误,因为console将是未定义的。

我使用的console.log包装不足以检测IE9中的控制台。 以下是SE上相关问题的包装:

 function logError(msg){ try { console.log(msg); } catch (error) { throw new Error(msg); } } function log(msg){ try { console.log(msg); } catch (error) { } } 

对控制台对象的可用性的适当testing将是: if (typeof console === "undefined" || typeof console.log === "undefined")

如果您有多个并行脚本文件,则可能是开发人员工具以不同的顺序加载/执行文件。

我遇到过这个问题很多次了。 基本上我们用variables来检查它们是否有效

 var somevar; if (somevar) //do code 

这工作,因为somevar将解决未定义。 但是,如果你检查一个窗口属性为例。 window.console。

 if (console) <---- this throws an exception 

你不能做同样的检查。 浏览器以不同的方式对待它。 基本上只做这个

 if (window.console) <---- will NOT throw an exception if undefined //some code 

这将和第一个例子一样。 所以你需要改变你的代码

 function log(msg){ if (window.console){ console.log(msg); } }