在IE8中console.log发生了什么?

根据这个post,它是在testing版,但它不是在发布?

更好的回退是这样的:

var alertFallback = true; if (typeof console === "undefined" || typeof console.log === "undefined") { console = {}; if (alertFallback) { console.log = function(msg) { alert(msg); }; } else { console.log = function() {}; } }
var alertFallback = true; if (typeof console === "undefined" || typeof console.log === "undefined") { console = {}; if (alertFallback) { console.log = function(msg) { alert(msg); }; } else { console.log = function() {}; } } 

console.log仅在您打开开发工具(F12将其打开和closures)之后才可用。 有趣的是,打开它之后,你可以closures它,然后通过console.log调用,然后在你重新打开时看到它们。 我认为这是一个错误,可能是固定的,但我们会看到。

我可能会使用像这样的东西:

 function trace(s) { if ('console' in self && 'log' in console) console.log(s) // the line below you might want to comment out, so it dies silent // but nice for seeing when the console is available or not. else alert(s) } 

甚至更简单:

 function trace(s) { try { console.log(s) } catch (e) { alert(s) } } 

这是我对各种答案的看法。 我想实际上看到logging的消息,即使我没有打开IE浏览器控制台,所以我把它们推到我创build的console.messages数组中。 我还添加了一个函数console.dump()来方便查看整个日志。 console.clear()将清空消息队列。

这个解决scheme还“处理”了其他控制台方法(我相信这些方法都来自Firebug Console API )

最后,这个解决scheme是IIFE的forms,所以不会污染全球范围。 回退函数参数在代码的底部定义。

我把它放在每个页面上包含的主JS文件中,然后忘记它。

 (function (fallback) { fallback = fallback || function () { }; // function to trap most of the console functions from the FireBug Console API. var trap = function () { // create an Array from the arguments Object var args = Array.prototype.slice.call(arguments); // console.raw captures the raw args, without converting toString console.raw.push(args); var message = args.join(' '); console.messages.push(message); fallback(message); }; // redefine console if (typeof console === 'undefined') { console = { messages: [], raw: [], dump: function() { return console.messages.join('\n'); }, log: trap, debug: trap, info: trap, warn: trap, error: trap, assert: trap, clear: function() { console.messages.length = 0; console.raw.length = 0 ; }, dir: trap, dirxml: trap, trace: trap, group: trap, groupCollapsed: trap, groupEnd: trap, time: trap, timeEnd: trap, timeStamp: trap, profile: trap, profileEnd: trap, count: trap, exception: trap, table: trap }; } })(null); // to define a fallback function, replace null with the name of the function (ex: alert) 

一些额外的信息

var args = Array.prototype.slice.call(arguments);arguments Object创build一个数组。 这是必需的,因为参数不是一个真正的数组 。

trap()是任何API函数的默认处理程序。 我将parameter passing给message以便获取传递给任何API调用的参数的日志(而不仅仅是console.log )。

编辑

我添加了一个额外的数组console.raw捕获参数完全传递给trap() 。 我意识到args.join(' ')是将对象转换为string"[object Object]" ,这有时可能是不可取的。 谢谢bfontaine的build议 。

值得注意的是,IE8中的console.log并不是一个真正的Javascript函数。 它不支持applycall方法。

假设你不关心后备提醒,这里有一个更简洁的方法来解决Internet Explorer的缺点:

 var console=console||{"log":function(){}}; 

我真的很喜欢“orange80”发布的方法。 这是优雅的,因为你可以设置一次,忘记它。

其他的方法要求你做一些不同的事情console.log()每次调用除console.log()以外的东西),这只是要求麻烦…我知道我最终会忘记。

我已经更进了一步,将代码封装在一个实用函数中,只要在任何日志logging之前,就可以在JavaScript的开始处调用一次。 (我将其安装在我公司的事件数据路由器产品中,这将有助于简化新pipe理界面的跨浏览器devise。)

 /** * Call once at beginning to ensure your app can safely call console.log() and * console.dir(), even on browsers that don't support it. You may not get useful * logging on those browers, but at least you won't generate errors. * * @param alertFallback - if 'true', all logs become alerts, if necessary. * (not usually suitable for production) */ function fixConsole(alertFallback) { if (typeof console === "undefined") { console = {}; // define it if it doesn't exist already } if (typeof console.log === "undefined") { if (alertFallback) { console.log = function(msg) { alert(msg); }; } else { console.log = function() {}; } } if (typeof console.dir === "undefined") { if (alertFallback) { // THIS COULD BE IMPROVED… maybe list all the object properties? console.dir = function(obj) { alert("DIR: "+obj); }; } else { console.dir = function() {}; } } } 

如果你对所有的console.log调用都是“undefined”,那可能意味着你还有一个旧的firebuglite加载(firebug.js)。 它将覆盖所有IE8的console.log的有效function,尽pipe它们确实存在。 无论如何,这是我发生的事情。

检查覆盖控制台对象的其他代码。

缺less控制台的浏览器的最佳解决scheme是:

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

有这么多答案。 我的解决scheme是:

 globalNamespace.globalArray = new Array(); if (typeof console === "undefined" || typeof console.log === "undefined") { console = {}; console.log = function(message) {globalNamespace.globalArray.push(message)}; } 

简而言之,如果console.log不存在(或者在这种情况下,未打开),则将日志存储在全局名称空间Array中。 通过这种方式,您不会被数百万次提醒所困扰,您仍然可以在开发者控制台打开或closures的情况下查看日志。

 if(window.console &&'function'=== typeof window.console.log){
     window.console.log(O);
 }

这里是我的“IE请不要崩溃”

 typeof console=="undefined"&&(console={});typeof console.log=="undefined"&&(console.log=function(){}); 

我在github上发现了这个:

 // usage: log('inside coolFunc', this, arguments); // paulirish.com/2009/log-a-lightweight-wrapper-for-consolelog/ window.log = function f() { log.history = log.history || []; log.history.push(arguments); if (this.console) { var args = arguments, newarr; args.callee = args.callee.caller; newarr = [].slice.call(args); if (typeof console.log === 'object') log.apply.call(console.log, console, newarr); else console.log.apply(console, newarr); } }; // make it safe to use console.log always (function(a) { function b() {} for (var c = "assert,count,debug,dir,dirxml,error,exception,group,groupCollapsed,groupEnd,info,log,markTimeline,profile,profileEnd,time,timeEnd,trace,warn".split(","), d; !! (d = c.pop());) { a[d] = a[d] || b; } })(function() { try { console.log(); return window.console; } catch(a) { return (window.console = {}); } } ()); 

我从上面使用Walter的方法(请参阅: https : //stackoverflow.com/a/14246240/3076102 )

我在这里find了一个解决scheme,在https://stackoverflow.com/a/7967670中正确显示对象。;

这意味着陷阱function变成:

 function trap(){ if(debugging){ // create an Array from the arguments Object var args = Array.prototype.slice.call(arguments); // console.raw captures the raw args, without converting toString console.raw.push(args); var index; for (index = 0; index < args.length; ++index) { //fix for objects if(typeof args[index] === 'object'){ args[index] = JSON.stringify(args[index],null,'\t').replace(/\n/g,'<br>').replace(/\t/g,'&nbsp;&nbsp;&nbsp;'); } } var message = args.join(' '); console.messages.push(message); // instead of a fallback function we use the next few lines to output logs // at the bottom of the page with jQuery if($){ if($('#_console_log').length == 0) $('body').append($('<div />').attr('id', '_console_log')); $('#_console_log').append(message).append($('<br />')); } } } 

我希望这是有帮助的:-)

它在IE8中工作。 按F12打开IE8的开发工具。

 >>console.log('test') LOG: test 

我喜欢这个方法(使用jQuery的文档准备)…它可以让你使用控制台,甚至在ie …只有catch是你需要重新加载页面,如果你打开ie的开发工具后的页面加载…

通过考虑所有的function可能会变得更加轻松,但我只使用日志,所以这就是我所做的。

 //one last double check against stray console.logs $(document).ready(function (){ try { console.log('testing for console in itcutils'); } catch (e) { window.console = new (function (){ this.log = function (val) { //do nothing }})(); } }); 

这里是一个版本,当开发者工具被打开时,它们将login到控制台,而不是在closures时。

 (function(window) { var console = {}; console.log = function() { if (window.console && (typeof window.console.log === 'function' || typeof window.console.log === 'object')) { window.console.log.apply(window, arguments); } } // Rest of your application here })(window) 

在html中制作你自己的控制台…. ;-)这可以打印,但你可以从下面开始:

 if (typeof console == "undefined" || typeof console.log === "undefined") { var oDiv=document.createElement("div"); var attr = document.createAttribute('id'); attr.value = 'html-console'; oDiv.setAttributeNode(attr); var style= document.createAttribute('style'); style.value = "overflow: auto; color: red; position: fixed; bottom:0; background-color: black; height: 200px; width: 100%; filter: alpha(opacity=80);"; oDiv.setAttributeNode(style); var t = document.createElement("h3"); var tcontent = document.createTextNode('console'); t.appendChild(tcontent); oDiv.appendChild(t); document.body.appendChild(oDiv); var htmlConsole = document.getElementById('html-console'); window.console = { log: function(message) { var p = document.createElement("p"); var content = document.createTextNode(message.toString()); p.appendChild(content); htmlConsole.appendChild(p); } }; }