Javascript 带有JS的网站不';在开发者工具激活之前,不要在IE9中工作

Javascript 带有JS的网站不';在开发者工具激活之前,不要在IE9中工作,javascript,internet-explorer-9,Javascript,Internet Explorer 9,我正在开发一个复杂的网站,它大量利用jQuery和许多脚本。在加载站点时,我的脚本都无法工作(尽管我可以确认其他脚本运行正常)。我不会在SE上发布这样一个蹩脚的问题,除了一件事: 当我点击F12打开开发工具以便调试我的问题时,一切都立即完美地工作 更糟糕的是,如果我关闭浏览器,启动它,首先打开开发工具并访问站点,一切都会按预期进行 所以我甚至不能调试这个该死的问题,因为开发工具可以修复它!开发工具能做些什么使事情正常工作?它是否改变了UA(我执行了一些jQuery.browser检测)?它对do

我正在开发一个复杂的网站,它大量利用jQuery和许多脚本。在加载站点时,我的脚本都无法工作(尽管我可以确认其他脚本运行正常)。我不会在SE上发布这样一个蹩脚的问题,除了一件事:

当我点击F12打开开发工具以便调试我的问题时,一切都立即完美地工作

更糟糕的是,如果我关闭浏览器,启动它,首先打开开发工具并访问站点,一切都会按预期进行

所以我甚至不能调试这个该死的问题,因为开发工具可以修复它!开发工具能做些什么使事情正常工作?它是否改变了UA(我执行了一些jQuery.browser检测)?它对doctype有什么作用吗

编辑

所有my console日志都包装在以下包装实用程序函数中:

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

欢迎提出任何我可以尝试的想法或建议。如果我找到了解决方案,我会在这里发布。

如果您有多个并行脚本文件,可能在打开/关闭开发工具的情况下以不同的顺序加载/执行这些文件。

您有控制台调用,在IE中,如果开发工具未打开,这些调用将失败。一个简单的修复方法是将任何控制台调用封装在函数中,如:

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

我发现简单地使用
console&&console.log('foo','bar','baz')
比使用包装函数方便得多

您提供的代码:

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

关闭开发工具时将为IE生成错误,因为
控制台
将未定义。

我使用的console.log包装器不足以检测IE9中的控制台。以下是有效的包装器:

控制台对象可用性的适当测试是:
if(typeof console==“undefined”| typeof console.log==“undefined”)

我很感激我来晚了,但我有一个IE9的解决方案,它有点不同

(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);
        }
    }
})();

我用下面的方法破解了它

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

(功能(){
如果(控制台类型==“未定义”){
控制台={
日志:函数(){}
}
}
})();

这是中的第一个脚本元素。

大多数其他解决方案都应该工作得很好,但是如果您不关心在控制台不可用时捕获日志消息,那么这里有一个简短的单行代码

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

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

我已经多次遇到过这个问题。基本上,对于变量,我们这样做是为了检查它们是否有效

var somevar;
if (somevar)
 //do code
这是因为somevar将解析为未定义。但如果您正在检查窗口属性,例如。窗口控制台

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

您在其他浏览器中尝试过吗?您在js中有
控制台
调用吗?在所有其他浏览器中都有效。还有IE8和7为什么在
控制台不存在时抛出错误?这将终止IE的代码。我在
logError
块中抛出一个错误,因为我只对致命错误使用它,如果开发人员因为控制台被隐藏而看不到错误,我希望停止执行。所以那部分是合法的。实际上,我将从我的示例中删除它,因为它从未被调用过(考虑到目前我的脚本中没有致命错误!)我以为我已经完成了这样一个包装器。但我会再检查一遍。很好的建议。事实上,你在钱的问题上是对的,那是一个console.log问题。然而,您的包装器在IE9中不是一个充分的检查(尽管它在IE7和IE8中一直有效)。查看我的答案。这对我有效,但我必须使用
window.console
,因为
console
不起作用。这个解决方案在我的情况下不起作用(IE9)。我刚刚删除了所有对控制台的调用。真有趣。我会检查一下。你上面的代码在IE9中也会失败,尽管它在IE8和IE7中也能正常工作。很好的封装解决方案+1我不敢相信我到目前为止还没有接受这个答案。谢谢大家!@Liam,为垫片准备一个nuget软件包怎么样?令人恼火的是(每次功能检测都应该获胜),这是在强制不兼容模式下降级IE9的情况下对我有效的唯一解决方案。
var somevar;
if (somevar)
 //do code
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);
 }
}