如果您的代码中有console.log
个语句,Internet Explorer将抛出JavaScript错误(至少在我们的Intranet用户安装的IE7中)。
我在大多数开发测试中使用Firefox主要是因为Firebug提供的功能(我使用了大量的控制台语句)但我还需要在IE中进行测试。
如果我将以下内容添加到我的JavaScript中,则不会抛出错误。
var debugging = false;
if (typeof console == "undefined")
var console = { log: function() {} };
问题是如果调试模式为false,我想触发一个事件。如果我创建一个函数来测试调试是否为false并执行操作(此时只是一个警报),但是当我尝试执行以下操作时,我收到IE错误,指出控制台未定义。
var debugging = false; // or true
if (typeof console == "undefined")
var console = { log: function() {consoleMsg()} };
function consoleMsg() {
if(!debugging) {
alert('Console.log event in Production Code');
}
如果有人可以帮助我修改我的代码,提供一种更好的方法来帮助我实现目标,或者指导我一个资源来教育我自己,我会非常感激。
答案 0 :(得分:137)
你不必跳过所有这些箍。在使用之前,只需检查控制台是否存在。
所以,而不是:
console.log('foo');
使用:
window.console && console.log('foo');
......你不会有任何错误。
或者,您可以在脚本顶部检查它,如果它未定义,只需用空函数填充它:
// At the top of your script:
if ( ! window.console ) console = { log: function(){} };
// If you use other console methods, add them to the object literal above
// Then, anywhere in your script:
console.log('This message will be logged, but will not cause an error in IE7');
要获得更强大的解决方案,请使用这段代码(取自twitter的源代码):
// 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;
}
}
}());
答案 1 :(得分:5)
'console'本身需要是一个函数,以及'log'。所以:
if(typeof(console) === 'undefined') {
console = function(){};
console.log = function(){consoleMsg()};
}
答案 2 :(得分:2)
您是否尝试过try-catch
:
var debugging = false; // or true
try {
console.log();
} catch(ex) {
/*var*/ console = { log: function() {consoleMsg()} };
}
答案 3 :(得分:1)
(function(debug) {
var console;
function wrapConsoleMethod(fnName) {
if(fnName in console)
console[ fnName ] = function(fn) {
return function() {
if(debug)
return fn.apply(console, arguments);
else
alert('Console event in Production Code');
};
}(console[ fnName ]);
else
; // fn not in console
};
if(!('console' in window))
window.console = {
log : function() {}
// ...
};
console = window.console;
wrapConsoleMethod('log');
// ...
})(true /* debug */);
console.log('test');