IE9是否支持console.log,是一个真正的function?
在哪些情况下是在Internet Explorer 9中定义的window.console.log
?
即使定义了window.console.log.apply
, window.console.log.apply
和window.console.log.call
也是未定义的。 为什么是这样?
[IE8的相关问题:IE8 中console.log发生了什么事? ]
在Internet Explorer 9(和8)中, console
对象仅在为特定选项卡打开开发人员工具时才公开。 如果您隐藏该选项卡的开发人员工具窗口,则console
对象将保持显示您导航到的每个页面。 如果您打开一个新选项卡,则还必须打开该选项卡的开发人员工具才能公开console
对象。
console
对象不是任何标准的一部分,是文档对象模型的扩展。 像其他的DOM对象一样,它被认为是一个宿主对象,并不需要从Object
inheritance,也不需要从Function
inheritance它的方法,就像本地的ECMAScript函数和对象一样。 这就是在这些方法中apply
和call
未定义的原因。 在IE 9中,大多数DOM对象都被改进为从本机ECMAScripttypesinheritance。 由于开发人员工具被认为是IE的一个扩展(虽然是一个内置的扩展),但他们显然没有得到与DOM其余部分相同的改进。
对于它的价值,你仍然可以在console
方法上用一些bind()
方法来使用一些Function.prototype
方法:
var log = Function.prototype.bind.call(console.log, console); log.apply(console, ["this", "is", "a", "test"]); //-> "thisisatest"
这个console.log问题的一个简单的解决scheme是在你的JS代码的开头定义下面的代码:
if (!window.console) window.console = {}; if (!window.console.log) window.console.log = function () { };
这适用于所有浏览器中的我。 当debugging器不活动时,这将为console.log创build一个虚拟函数。 当debugging器处于活动状态时,方法console.log被定义并正常执行。
我知道这是一个非常古老的问题,但感觉这增加了如何处理控制台问题的有价值的select。 在调用控制台之前放置下面的代码*(这是你的第一个脚本)。
// 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
console.log仅在控制台打开时定义。 如果您想在代码中检查它,请确保在窗口属性中检查它
if (window.console) console.log(msg)
这会在IE9中引发exception,并且无法正常工作。 不要这样做
if (console) console.log(msg)
在阅读Marc Cliament上面的评论文章之后,我已经将我的多用途跨浏览器console.logfunction改为如下所示:
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); } } }
怎么样…
console = { log : function(text) { alert(text); } }
我想提到的是,如果您在所有版本的Windows上closures了开发人员工具并使用console.log,则IE9不会引发错误。 在XP上,但是在Windows 7上却没有。 所以,如果你放弃了对WinXP的支持,你可以直接使用console.log。