Тестирование операторов console.log в IE
Возможный дубликат:
'console' - ошибка undefined для интернет-браузера
Если в вашем коде есть операторы console.log
, Internet Explorer будет генерировать ошибку JavaScript (по крайней мере, в IE7, что и было установлено нашими интрасетными пользователями).
Я использую Firefox для большинства своих тестов разработки в основном из-за функциональности Firebug (где я использую множество консольных операторов), но мне также нужно протестировать в IE.
если я добавлю следующее к моему JavaScript, ошибка не будет выбрана.
var debugging = false;
if (typeof console == "undefined")
var console = { log: function() {} };
Проблема в том, что я хотел бы вызвать событие, если режим отладки ложный. Если я создаю функцию для проверки того, является ли отладка ложным и выполняет действие (на данный момент только предупреждение), но когда я пытаюсь сделать следующее, я получаю сообщение об ошибке 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');
}
Если кто-то может помочь мне исправить мой код, предложите лучший способ помочь мне достичь своей цели или направить меня к ресурсу, чтобы выучить себя, я был бы очень благодарен.
Ответы
Ответ 1
Вам не нужно прыгать через все эти обручи. Просто проверьте, существует ли консоль перед ее использованием.
Итак, вместо:
console.log('foo');
Использование:
window.console && console.log('foo');
... и вы не получите никаких ошибок.
Кроме того, вы можете просто проверить его в верхней части вашего script, а если он undefined, просто заполните его пустой функцией:
// 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;
}
}
}());
Ответ 2
'console' сама должна быть функцией, а также 'log'. Итак:
if(typeof(console) === 'undefined') {
console = function(){};
console.log = function(){consoleMsg()};
}
Ответ 3
Пробовал ли вы try-catch
:
var debugging = false; // or true
try {
console.log();
} catch(ex) {
/*var*/ console = { log: function() {consoleMsg()} };
}
Ответ 4
(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');