IE9是否支持console.log,它是真正的功能吗?

时间:2011-03-29 13:03:05

标签: javascript logging internet-explorer-9

在哪些情况下,Internet Explorer 9中定义了window.console.log

即使定义了window.console.logwindow.console.log.applywindow.console.log.call也未定义。这是为什么?

[IE8的相关问题:What happened to console.log in IE8?。]

7 个答案:

答案 0 :(得分:297)

在Internet Explorer 9(和8)中,console对象仅在为特定选项卡打开开发人员工具时公开。如果隐藏该选项卡的开发人员工具窗口,则导航到的每个页面都会显示console对象。如果打开新选项卡,则还必须打开该选项卡的开发人员工具,以便公开console对象。

console对象不是任何标准的一部分,是文档对象模型的扩展。与其他DOM对象一样,它被视为主机对象,不需要从Object继承,也不需要从Function继承,就像本机ECMAScript函数和对象一样。这就是applycall在这些方法上未定义的原因。在IE 9中,大多数DOM对象都得到了改进,可以从本机ECMAScript类型继承。由于开发人员工具被认为是IE的扩展(虽然是内置扩展),但他们显然没有得到与其他DOM相同的改进。

对于它的价值,你仍然可以在Function.prototype方法上使用一些console方法,只需bind()一点魔法:

var log = Function.prototype.bind.call(console.log, console);
log.apply(console, ["this", "is", "a", "test"]);
//-> "thisisatest"

答案 1 :(得分:165)

这个console.log问题的一个简单解决方案是在JS代码的开头定义以下内容:

if (!window.console) window.console = {};
if (!window.console.log) window.console.log = function () { };

这适用于所有浏览器。当调试器未激活时,这将为console.log创建一个虚函数。当调试器处于活动状态时,方法console.log已定义并正常执行。

答案 2 :(得分:13)

我知道这是一个非常古老的问题,但我觉得这为如何处理控制台问题增添了一个有价值的选择。在调用console。之前放置以下代码。*(所以你的第一个脚本)。

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

<强>参考:
https://github.com/h5bp/html5-boilerplate/blob/v5.0.0/dist/js/plugins.js

答案 3 :(得分:10)

console.log仅在控制台打开时定义。如果要在代码中检查它,请确保在窗口属性

中检查它
if (window.console)
    console.log(msg)

这会在IE9中引发异常,无法正常工作。不要这样做

if (console) 
    console.log(msg)

答案 4 :(得分:6)

在阅读上面Marc Cliament的评论文章后,我现在将我的通用跨浏览器console.log功能改为:

function log()
{
    "use strict";

    if (typeof(console) !== "undefined" && console.log !== undefined)
    {
        try
        {
            console.log.apply(console, arguments);
        }
        catch (e)
        {
            var log = Function.prototype.bind.call(console.log, console);
            log.apply(console, arguments);
        }
    }
}

答案 5 :(得分:0)

我想提一下,如果您使用console.log并在所有版本的Windows上关闭开发人员工具,IE9不会引发错误。在XP上它确实如此,但在Windows 7上它并没有。 因此,如果你放弃了对WinXP的支持,你可以直接使用console.log。

答案 6 :(得分:-1)

怎么样......

console = { log : function(text) { alert(text); } }