在激活开发人员工具之前,使用JS的网站在IE9中不起作用

时间:2011-11-11 14:26:48

标签: javascript internet-explorer-9

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

我点击F12打开开发人员工具,以便我可以调试我的问题,一切都能立即完美!

更糟糕的是,如果我关闭浏览器,启动它,首先打开Dev Tools并访问该网站,一切都按预期工作。

所以我甚至无法调试这个问题,因为Dev Tools修复了它! Dev Tools可以做些什么让事情发挥作用?它是否改变了UA(我做了一些jQuery.browser检测)?它对doctype有用吗?

修改

我的所有控制台日志记录都包含在以下包装器实用程序函数中:

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

我可以尝试任何想法或建议。如果我找到解决方案,我会在这里发帖。

8 个答案:

答案 0 :(得分:34)

我很欣赏我在这里参加聚会的时间已经很晚了,但是我已经找到了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);
        }
    }
})();

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

如果在console可用时立即推送数据会很好,但这比设置自定义setInterval侦听器要便宜。

更新功能(2012年10月1日)

我已更新此脚本供我自己使用,并认为我会分享它。它有一些有价值的改进:

  • 正常使用console.log(),即不再需要使用非标准log()
  • 支持多个参数,例如console.log('foo', 'bar')
  • 您还可以使用console.errorconsole.warnconsole.info(虽然将其输出为console.log
  • 脚本每1000毫秒检查一次本地console并在找到时输出缓冲区

我认为通过这些改进,这已成为IE9的一个非常可靠的垫片。的 Check out the GitHub repo here

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

答案 1 :(得分:13)

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

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

答案 2 :(得分:2)

我已经通过以下方式破解了它

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

这是。

中的第一个脚本元素

答案 3 :(得分:2)

其他大多数解决方案都应该运行得很好,但是如果你不关心在控制台不可用时捕获日志消息的话,这里只有一个短的内容。

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

这使您仍然可以直接使用本机console.log函数,而不是每次都包装它或有条件。

答案 4 :(得分:1)

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

您提供的代码:

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

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

答案 5 :(得分:1)

我使用的console.log包装器不足以检测IE9中的控制台。这是包含from a related question on SE的包装器:

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

function log(msg){
    try {
        console.log(msg);
    } catch (error) { }
}

对控制台对象可用性的正确测试将是: if (typeof console === "undefined" || typeof console.log === "undefined")

答案 6 :(得分:0)

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

答案 7 :(得分:0)

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

var somevar;
if (somevar)
 //do code

这是有效的,因为somevar将解析为undefined。但是,如果你检查一个窗口属性,例如。 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);
 }
}