在Internet Explorer 9中定义了window.console.log的情况是什么?

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

[有关IE8的问题:IE8中console.log发生了什么?。]

评论

查看有关IE8-9控制台对象/功能的复杂性的精彩文章:whattheheadsaid.com/2011/04/…

另请参阅“控制台”是Internet Explorer的未定义错误

@MarcCliment链接已死

@chakeda我讨厌这种情况发生,有Web存档中的链接:web.archive.org/web/20140625085155/http://whattheheadsaid.com/…

#1 楼

在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"


评论


Firebug的控制台对象也是如此。

– Marcel Korpel
2011年3月29日13:36

我可以骄傲地说,在我为Web开发的多年中,我假设console.log受所有主要浏览器的支持。我只是花了一天的时间来弄清为什么IE9不喜欢我的脚本,现在我知道了为什么-第一步就有了console.log。不能调试,因为打开调试模式使该错误立即消失了:P感谢您的澄清!

– f055
2012年7月16日在22:00

昨天有同样的问题。安装DebugBar可以帮助我更快,因为它没有定义控制台对象。因此,当我隐藏IE控制台而不是DebugBar时,我从后者收到一条消息,提示存在JavaScript错误(未定义控制台)。

–西蒙·欧格斯特(Simon A. Eugster)
2012-09-28 5:21



您应该在IE @ f055上第一次遇到问题时就已经检查了错误日志

–幸运的阿里
2014年1月17日在5:21



Internet选项->高级->显示有关每个脚本错误的通知。 Web开发人员应始终将此内容保留在IE中。这会通知您有关控制台的信息,或者未定义日志功能……无法准确记住该消息。

–赛斯花
2014年2月7日在19:20

#2 楼

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

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


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

评论


更多信息,以及更强大的控制台替代品(包括其他控制台方法),请参见:stackoverflow.com/questions/8002116/…

– Zach Lysobey
2013年6月13日19:15

@ZachL:具体是哪一个?

– hakre
15年8月11日在8:41

我的回答有一种方法:stackoverflow.com/a/15771110/363701。还要检查一下:github.com/paulmillr/console-polyfill/blob/master/index.js

– Zach Lysobey
15年8月11日在14:09

#3 楼

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

// 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-样板/blob/v5.0.0/dist/js/plugins.js

#4 楼

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

if (window.console)
    console.log(msg)


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

if (console) 
    console.log(msg)


#5 楼

在阅读完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);
        }
    }
}


评论


Just Function.prototype.apply.call(console.log,控制台,参数);

–维克多
13-10-29在9:52

@Victor绝对应该是唯一被接受的答案!

–帕维尔·弗兰科夫(Pavel Frankov)
15年3月11日在12:41

#6 楼

我想提到的是,如果您在所有版本的Windows上都关闭了开发人员工具的情况下使用console.log,则IE9不会引发错误。在XP上可以,但是在Windows 7上则不能。
因此,如果您一般放弃了对WinXP的支持,则可以直接使用console.log。

#7 楼

怎么样...

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


评论


在某些情况下,这可能是一个可行的解决方法,但是您实际上并未解决此问题。

– p.s.w.g
15年1月19日在21:49