为什么JavaScript只有在IE中打开一次开发人员工具后才能工作?

IE9 Bug - JavaScript只有在打开一次开发人员工具后才能工作。

我们的网站为用户提供免费的pdf下载,并具有简单的“输入密码下载”功能。但是,它在Internet Explorer中根本不起作用。

您可以在此示例中亲眼看到。

下载通行证是“makeuseof”。在任何其他浏览器中,它都可以正常工作。在 IE 中,这两个按钮都不执行任何操作。

我发现最奇怪的是,如果您使用F12打开和关闭开发人员工具栏,它突然开始工作。

我们已经尝试了兼容模式等,没有什么区别。

如何在Internet Explorer中完成这项工作?


答案 1

听起来你的javascript中可能有一些调试代码。

您描述的体验是包含或任何其他功能的典型代码。console.log()console

仅当打开开发人员工具栏时,才会激活该对象。在此之前,调用控制台对象将导致它被报告为 。打开工具栏后,控制台将存在(即使工具栏随后关闭),因此您的控制台调用将起作用。consoleundefined

有几种解决方案:

最明显的一个是遍历代码,删除对 的引用。无论如何,你都不应该在生产代码中留下这样的东西。console

如果要保留控制台引用,可以将它们包装在语句或其他一些条件语句中,这些语句在尝试调用控制台对象之前检查控制台对象是否存在。if()


答案 2

HTML5样板有一个很好的预制代码,用于修复控制台问题:

// Avoid `console` errors in browsers that lack a console.
(function() {
    var method;
    var noop = function () {};
    var methods = [
        'assert', 'clear', 'count', 'debug', 'dir', 'dirxml', 'error',
        'exception', 'group', 'groupCollapsed', 'groupEnd', 'info', 'log',
        'markTimeline', 'profile', 'profileEnd', 'table', 'time', 'timeEnd',
        'timeStamp', 'trace', 'warn'
    ];
    var length = methods.length;
    var console = (window.console = window.console || {});

    while (length--) {
        method = methods[length];

        // Only stub undefined methods.
        if (!console[method]) {
            console[method] = noop;
        }
    }
}());

正如@plus在评论中指出的那样,最新版本可在其GitHub页面上找到