console.log.apply不能在IE9中工作

看起来我已经重新发明了轮子,但不知何故,这不是在Internet Explorer 9中工作,但在IE6中。

function debug() if(!window.console) { window.console = { log: function() { /* do something */ } }; } console.log.apply(console, arguments); } 

相关: 应用()问题的JavaScript

F12debugging器告诉我这个“对象”(console.log)不支持“apply”方法。 它甚至不被认为是一个function? 任何其他的指针或想法?

我最近回答的第二部分也回答了这个问题。 我不认为这是一个重复的,为了方便起见,我把它粘贴在这里:

控制台对象不是任何标准的一部分,是文档对象模型的扩展。 像其他的DOM对象一样,它被认为是一个宿主对象,并不需要从Objectinheritance,也不需要从Functioninheritance它的方法,就像本地的ECMAScript函数和对象一样。 这就是在这些方法中应用和调用未定义的原因。 在IE 9中,大多数DOM对象都被改进为从本机ECMAScripttypesinheritance。 由于开发人员工具被认为是IE的一个扩展(虽然是一个内置的扩展),但他们显然没有得到与DOM其余部分相同的改进。

对于什么是值得的,你仍然可以在控制台方法上用一些bind()方法来使用一些Function.prototype方法:

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

所以你可以用相同的方式修复IE 9的所有console方法:

 if (Function.prototype.bind && window.console && typeof console.log == "object"){ [ "log","info","warn","error","assert","dir","clear","profile","profileEnd" ].forEach(function (method) { console[method] = this.bind(console[method], console); }, Function.prototype.call); } 

这将使用调用“主机”function的本地函数replace“主机”函数。 您可以通过在代码中包含Function.prototype.bindArray.prototype.forEach的兼容性实现,或者重写上面的代码片段来合并这些方法使用的技术,从而在Internet Explorer 8中使用它。

也可以看看

  • Internet Explorer 9有问题的控制台对象 – 我的博客whattheheadsaid.com
  • console.log typeof是“对象”,而不是“function” – Microsoft Connect(需要真实帐户)

Paul爱尔兰人也是这样做的。 它比上面的一些答案简单,但使日志总是输出一个数组(即使只有一个参数传入):

 // usage: log('inside coolFunc',this,arguments); // http://paulirish.com/2009/log-a-lightweight-wrapper-for-consolelog/ window.log = function(){ log.history = log.history || []; // store logs to an array for reference log.history.push(arguments); if(this.console){ console.log( Array.prototype.slice.call(arguments) ); } }; 

IE的几个主机对象函数并不是真正的JavaScript函数,所以没有applycall 。 (例如alert )。

所以你必须这样做:

 function debug() var index; if(!window.console) { window.console = { log: function() { /* do something */ } }; } for (index = 0; index < arguments.length; ++index) { console.log(arguments[index]); } } 

我遇到了同样的IE麻烦,并为此做了一个例程。 它不像所有上述实现那样花哨,但是它可以在所有现代浏览器中使用。

我testing了Firefox(Firebug),IE 7,8,9 Chrome和Opera。 它利用了邪恶的EVAL,但你只想在开发中进行debugging。 之后,您将用debug = function () {};replace代码debug = function () {};

所以在这里。

问候,汉斯

 (function(ns) { var msgs = []; // IE compatiblity function argtoarr (args,from) { var a = []; for (var i = from || 0; i<args.length; i++) a.push(args[i]); return a; } function log(arg) { var params = "", format = "", type , output, types = { "number" : "%d", "object" : "{%o}", "array" : "[%o]" }; for (var i=0; i<arg.length; i++) { params += (params ? "," : "")+"arg["+i+"]"; type = types[toType(arg[i])] || "%s"; if (type === "%d" && parseFloat(arg[i]) == parseInt(arg[i], 10)) type = "%f"; format += (format ? "," : "")+type; } // opera does not support string format, so leave it out output = "console.log("+(window.opera ? "" : "'%f',".replace("%f",format))+"%p);".replace("%p",params); eval(output); } ns.debug = function () { msgs.push(argtoarr(arguments)); if (console !== undefined) while (msgs.length>0) log(msgs.shift()); } })(window); 

哎呀忘了我的toType函数,在这里。

 function toType(obj) { if (obj === undefined) return "undefined"; if (obj === null) return "null"; var m = obj.constructor; if (!m) return "window"; m = m.toString().match(/(?:function|\[object)\s*([az|AZ|0-9|_|@]*)/); return m[1].toLowerCase(); } 

好的,当你这样写的时候,它是有效的:

 function debug() if(!window.console) { window.console = {}; console.log = function() { /* do something */ }; } console.log.apply(console, arguments); } 

奇怪的行为…但如果你这样写'console.log'被认为是一个函数。

我来这个问题的原因是,我试图为特定的模块“辛辣”console.log函数,所以我有更多的本地化和有见地的debugging信息通过玩一点参数,IE 9打破了它。

@Andy E的答案很棒,帮助我了解了很多有关应用的见解。 我只是不采取相同的方法来支持IE9,所以我的解决scheme是只在“现代浏览器”(即现代意味着任何浏览器行为,我期望= =)运行控制台

 var C = function() { var args = Array.prototype.slice.call(arguments); var console = window.console; args[0] = "Module X: "+args[0]; if( typeof console == 'object' && console.log && console.log.apply ){ console.log.apply(console, args); } }; 

尝试:

 function log(type) { if (typeof console !== 'undefined' && typeof console.log !== 'undefined' && console[type] && Function.prototype.bind) { var log = Function.prototype.bind.call(console[type], console); log.apply(console, Array.prototype.slice.call(arguments, 1)); } } log('info', 'test', 'pass'); log('error', 'test', 'fail'); 

适用于logdebuginfowarnerrorgroupgroupEnd