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

Posted

技术标签:

【中文标题】IE9是不是支持console.log,它是一个真正的功能吗?【英文标题】:Does IE9 support console.log, and is it a real function?IE9是否支持console.log,它是一个真正的功能吗? 【发布时间】:2011-07-25 06:46:32 【问题描述】:

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

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

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

【问题讨论】:

查看这篇关于 IE8-9 控制台对象/函数错综复杂的精彩文章:whattheheadsaid.com/2011/04/… 另见'console' is undefined error for internet explorer @MarcCliment 链接已失效 @chakeda 我讨厌这种情况发生,这是来自网络存档的链接: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 其余部分相同的改进。

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

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

【讨论】:

Firebug 的console 对象也是如此。 我可以不自豪地说,在我为 Web 开发的这些年里,我认为所有主流浏览器都支持 console.log。我刚刚花了一天时间弄清楚为什么 IE9 不喜欢我的脚本,现在我知道了原因——它在第一步就有一个 console.log。无法调试,因为打开调试模式会使此错误立即消失:P 感谢您的澄清!! 昨天遇到了同样的问题。安装DebugBar 碰巧帮助我更快,因为它没有定义控制台对象。因此,当我隐藏 IE 控制台而不是 DebugBar 时,我从后者收到一条消息,指出存在 javascript 错误(未定义控制台)。 您应该在 IE @f055 上第一次遇到问题时检查错误日志 Internet 选项 -> 高级 -> 显示有关每个脚本错误的通知。 Web 开发人员应始终在 IE 中勾选此项。这会通知您有关控制台的信息,或者未定义日志功能...无法准确记住该消息。【参考方案2】:

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

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

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

【讨论】:

更多信息和更强大的控制台替换(包括其他控制台方法)在这里:***.com/questions/8002116/… @ZachL:具体是哪一个? 我的回答有一种方法:***.com/a/15771110/363701。另请查看:github.com/paulmillr/console-polyfill/blob/master/index.js【参考方案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-boilerplate/blob/v5.0.0/dist/js/plugins.js

【讨论】:

【参考方案4】:

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

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

【讨论】:

Function.prototype.apply.call(console.log, console, arguments); @Victor 它绝对应该是唯一一个被接受的答案!【参考方案6】:

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

【讨论】:

【参考方案7】:

怎么样...

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

【讨论】:

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

以上是关于IE9是不是支持console.log,它是一个真正的功能吗?的主要内容,如果未能解决你的问题,请参考以下文章

console.log.apply 在 IE9 中不起作用

Console.log IE9 问题

JS之void

undefined和void

IE10 console.log 不工作

判断是否是一个数组?