'console' - ошибка undefined для Internet Explorer
Я использую Firebug и имею некоторые утверждения вроде:
console.log("...");
на моей странице. В IE8 (возможно, более ранние версии) я получаю ошибки script, говорящие, что "console" - undefined. Я попытался поставить это в верхней части моей страницы:
<script type="text/javascript">
if (!console) console = {log: function() {}};
</script>
все-таки я получаю ошибки. Любой способ избавиться от ошибок?
Ответы
Ответ 1
Try
if (!window.console) console = ...
Переменная undefined не может быть передана напрямую. Однако все глобальные переменные являются атрибутами одного и того же имени глобального контекста (window
в случае браузеров), и доступ к атрибуту undefined прекрасен.
Или используйте if (typeof console === 'undefined') console = ...
, если вы хотите избежать волшебной переменной window
, см. @Tim Down answer.
Ответ 2
Вставьте следующее вверху вашего JavaScript (перед использованием консоли):
/**
* Protect window.console method calls, e.g. console is not defined on IE
* unless dev tools are open, and IE doesn't define console.debug
*
* Chrome 41.0.2272.118: debug,error,info,log,warn,dir,dirxml,table,trace,assert,count,markTimeline,profile,profileEnd,time,timeEnd,timeStamp,timeline,timelineEnd,group,groupCollapsed,groupEnd,clear
* Firefox 37.0.1: log,info,warn,error,exception,debug,table,trace,dir,group,groupCollapsed,groupEnd,time,timeEnd,profile,profileEnd,assert,count
* Internet Explorer 11: select,log,info,warn,error,debug,assert,time,timeEnd,timeStamp,group,groupCollapsed,groupEnd,trace,clear,dir,dirxml,count,countReset,cd
* Safari 6.2.4: debug,error,log,info,warn,clear,dir,dirxml,table,trace,assert,count,profile,profileEnd,time,timeEnd,timeStamp,group,groupCollapsed,groupEnd
* Opera 28.0.1750.48: debug,error,info,log,warn,dir,dirxml,table,trace,assert,count,markTimeline,profile,profileEnd,time,timeEnd,timeStamp,timeline,timelineEnd,group,groupCollapsed,groupEnd,clear
*/
(function() {
// Union of Chrome, Firefox, IE, Opera, and Safari console methods
var methods = ["assert", "cd", "clear", "count", "countReset",
"debug", "dir", "dirxml", "error", "exception", "group", "groupCollapsed",
"groupEnd", "info", "log", "markTimeline", "profile", "profileEnd",
"select", "table", "time", "timeEnd", "timeStamp", "timeline",
"timelineEnd", "trace", "warn"];
var length = methods.length;
var console = (window.console = window.console || {});
var method;
var noop = function() {};
while (length--) {
method = methods[length];
// define undefined methods as noops to prevent errors
if (!console[method])
console[method] = noop;
}
})();
Обертка закрытия функции - это охват переменных, чтобы не определять какие-либо переменные. Это защищает как от undefined console
, так и от undefined console.debug
(и других отсутствующих методов).
EDIT: Я заметил, что HTML5 Boilerplate использует аналогичный код в файле js/plugins.js, если вы ищете решение, которое (вероятно) будет обновлено.
Ответ 3
Другой альтернативой является оператор typeof
:
if (typeof console == "undefined") {
this.console = {log: function() {}};
}
Еще одна альтернатива - использовать библиотеку протоколирования, такую как мой собственный log4javascript.
Ответ 4
Для более надежного решения используйте этот фрагмент кода (взятый из исходного кода 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;
}
}
}());
Ответ 5
В моих сценариях я либо использую стенографию:
window.console && console.log(...) // only log if the function exists
или, если это невозможно или возможно отредактировать каждую строку console.log, я создаю поддельную консоль:
// check to see if console exists. If not, create an empty object for it,
// then create and empty logging function which does nothing.
//
// REMEMBER: put this before any other console.log calls
!window.console && (window.console = {} && window.console.log = function () {});
Ответ 6
Вы можете использовать console.log()
, если вы открыли Developer Tools
в IE8, а также можете использовать текстовое поле Console
на вкладке script.
Ответ 7
if (typeof console == "undefined") {
this.console = {
log: function() {},
info: function() {},
error: function() {},
warn: function() {}
};
}
Ответ 8
В IE9, если консоль не открыта, этот код:
alert(typeof console);
отобразит "объект", но этот код
alert(typeof console.log);
будет вызывать исключение TypeError, но не возвращать значение undefined;
Таким образом, гарантированная версия кода будет выглядеть примерно так:
try {
if (window.console && window.console.log) {
my_console_log = window.console.log;
}
} catch (e) {
my_console_log = function() {};
}
Ответ 9
Основываясь на двух предыдущих ответах
и документация для
Здесь лучше всего выполнить эту проблему, имея в виду, что существует консоль, которая фактически существует, и заполняет пробелы для несуществующих методов с помощью console.log.
Например, для IE6/7 вы можете заменить ведение журнала предупреждением (глупым, но работает), а затем включить ниже монстра (я назвал его console.js):
[Не стесняйтесь удалять комментарии по своему усмотрению, я оставил их для справки, минимизатор может решить их):
<!--[if lte IE 7]>
<SCRIPT LANGUAGE="javascript">
(window.console = window.console || {}).log = function() { return window.alert.apply(window, arguments); };
</SCRIPT>
<![endif]-->
<script type="text/javascript" src="console.js"></script>
и console.js:
/**
* Protect window.console method calls, e.g. console is not defined on IE
* unless dev tools are open, and IE doesn't define console.debug
*/
(function() {
var console = (window.console = window.console || {});
var noop = function () {};
var log = console.log || noop;
var start = function(name) { return function(param) { log("Start " + name + ": " + param); } };
var end = function(name) { return function(param) { log("End " + name + ": " + param); } };
var methods = {
// Internet Explorer (IE 10): http://msdn.microsoft.com/en-us/library/ie/hh772169(v=vs.85).aspx#methods
// assert(test, message, optionalParams), clear(), count(countTitle), debug(message, optionalParams), dir(value, optionalParams), dirxml(value), error(message, optionalParams), group(groupTitle), groupCollapsed(groupTitle), groupEnd([groupTitle]), info(message, optionalParams), log(message, optionalParams), msIsIndependentlyComposed(oElementNode), profile(reportName), profileEnd(), time(timerName), timeEnd(timerName), trace(), warn(message, optionalParams)
// "assert", "clear", "count", "debug", "dir", "dirxml", "error", "group", "groupCollapsed", "groupEnd", "info", "log", "msIsIndependentlyComposed", "profile", "profileEnd", "time", "timeEnd", "trace", "warn"
// Safari (2012. 07. 23.): https://developer.apple.com/library/safari/#documentation/AppleApplications/Conceptual/Safari_Developer_Guide/DebuggingYourWebsite/DebuggingYourWebsite.html#//apple_ref/doc/uid/TP40007874-CH8-SW20
// assert(expression, message-object), count([title]), debug([message-object]), dir(object), dirxml(node), error(message-object), group(message-object), groupEnd(), info(message-object), log(message-object), profile([title]), profileEnd([title]), time(name), markTimeline("string"), trace(), warn(message-object)
// "assert", "count", "debug", "dir", "dirxml", "error", "group", "groupEnd", "info", "log", "profile", "profileEnd", "time", "markTimeline", "trace", "warn"
// Firefox (2013. 05. 20.): https://developer.mozilla.org/en-US/docs/Web/API/console
// debug(obj1 [, obj2, ..., objN]), debug(msg [, subst1, ..., substN]), dir(object), error(obj1 [, obj2, ..., objN]), error(msg [, subst1, ..., substN]), group(), groupCollapsed(), groupEnd(), info(obj1 [, obj2, ..., objN]), info(msg [, subst1, ..., substN]), log(obj1 [, obj2, ..., objN]), log(msg [, subst1, ..., substN]), time(timerName), timeEnd(timerName), trace(), warn(obj1 [, obj2, ..., objN]), warn(msg [, subst1, ..., substN])
// "debug", "dir", "error", "group", "groupCollapsed", "groupEnd", "info", "log", "time", "timeEnd", "trace", "warn"
// Chrome (2013. 01. 25.): https://developers.google.com/chrome-developer-tools/docs/console-api
// assert(expression, object), clear(), count(label), debug(object [, object, ...]), dir(object), dirxml(object), error(object [, object, ...]), group(object[, object, ...]), groupCollapsed(object[, object, ...]), groupEnd(), info(object [, object, ...]), log(object [, object, ...]), profile([label]), profileEnd(), time(label), timeEnd(label), timeStamp([label]), trace(), warn(object [, object, ...])
// "assert", "clear", "count", "debug", "dir", "dirxml", "error", "group", "groupCollapsed", "groupEnd", "info", "log", "profile", "profileEnd", "time", "timeEnd", "timeStamp", "trace", "warn"
// Chrome (2012. 10. 04.): https://developers.google.com/web-toolkit/speedtracer/logging-api
// markTimeline(String)
// "markTimeline"
assert: noop, clear: noop, trace: noop, count: noop, timeStamp: noop, msIsIndependentlyComposed: noop,
debug: log, info: log, log: log, warn: log, error: log,
dir: log, dirxml: log, markTimeline: log,
group: start('group'), groupCollapsed: start('groupCollapsed'), groupEnd: end('group'),
profile: start('profile'), profileEnd: end('profile'),
time: start('time'), timeEnd: end('time')
};
for (var method in methods) {
if ( methods.hasOwnProperty(method) && !(method in console) ) { // define undefined methods as best-effort methods
console[method] = methods[method];
}
}
})();
Ответ 10
Я использую console.log только в своем коде. Таким образом, я включаю очень короткий 2 лайнер
var console = console || {};
console.log = console.log || function(){};
Ответ 11
Отметил, что OP использует Firebug с IE, поэтому предположите Firebug Lite. Это напуганная ситуация, когда консоль определяется в IE, когда открывается окно отладчика, но что происходит, когда Firebug уже запущен? Не уверен, но, возможно, метод "firebugx.js" может быть хорошим способом протестировать в этой ситуации:
Источник:
https://code.google.com/p/fbug/source/browse/branches/firebug1.2/lite/firebugx.js?r=187
if (!window.console || !console.firebug) {
var names = [
"log", "debug", "info", "warn", "error", "assert",
"dir","dirxml","group","groupEnd","time","timeEnd",
"count","trace","profile","profileEnd"
];
window.console = {};
for (var i = 0; i < names.length; ++i)
window.console[names[i]] = function() {}
}
(обновленные ссылки 12/2014)
Ответ 12
// a simple
if(console) {
console.log("blah blah blah ...");
}
/*
* use .error() to attach error handlers and whenever
* an error occurs it will automatically logged to the console
* by jquery if you are using one
* whenever an error occurs, see bellow.
*/
$('jQuery_selector').error(function(){
// and your error handling code here
});
Для справки .error() посетите http://api.jquery.com/error/
Ответ 13
Я использую fauxconsole; Я немного изменил CSS, чтобы он выглядел лучше, но работает очень хорошо.
Ответ 14
Для отладки в IE ознакомьтесь с этим log4javascript
Ответ 15
Для поддержки IE8 или консоли, ограниченных console.log(нет отладки, трассировки,...), вы можете сделать следующее:
-
Если консоль OR console.log undefined: создайте фиктивные функции для
функции консоли (трассировка, отладка, журнал,...)
window.console = {
debug : function() {}, ...};
-
Иначе, если console.log определен (IE8) И console.debug(любой другой) не определен: перенаправлять все функции ведения журнала на console.log, это позволяет сохранить эти журналы!
window.console = {
debug : window.console.log, ...};
Не уверен в поддержке поддержки в различных версиях IE, но любые предложения приветствуются. Также выложил этот ответ здесь: Как использовать консольное ведение журнала в Internet Explorer?
Ответ 16
console = console || {
debug: function(){},
log: function(){}
...
}
Ответ 17
Вы можете использовать ниже, чтобы предоставить дополнительную степень страхования, что у вас есть все основания. Использование typeof
сначала позволит избежать ошибок undefined
. Использование ===
также гарантирует, что имя типа на самом деле является строкой "undefined". Наконец, вам нужно добавить параметр в подпись функции (я выбрал logMsg
произвольно), чтобы обеспечить согласованность, поскольку вы передаете все, что хотите напечатать на консоли, функции журнала. Это также обеспечивает точность intellisense и позволяет избежать любых предупреждений/ошибок в вашей JS-среде IDE.
if(!window.console || typeof console === "undefined") {
var console = { log: function (logMsg) { } };
}
Ответ 18
Иногда консоль будет работать в IE8/9, но сбой в другое время. Это неустойчивое поведение зависит от того, открываются ли инструменты разработчика и описывается в вопросе stackoverflow Поддерживает ли IE9 консоль .log и является ли она реальной функцией?
Ответ 19
Обнаружена аналогичная проблема с запуском console.log в дочерних окнах в IE9, созданная функцией window.open.
Похоже, что в этом случае консоль определяется только в родительском окне и undefined в дочерних окнах, пока вы не обновите их. То же самое касается детей дочерних окон.
Я рассматриваю эту проблему, обернув журнал следующей функцией (ниже - фрагмент модуля)
getConsole: function()
{
if (typeof console !== 'undefined') return console;
var searchDepthMax = 5,
searchDepth = 0,
context = window.opener;
while (!!context && searchDepth < searchDepthMax)
{
if (typeof context.console !== 'undefined') return context.console;
context = context.opener;
searchDepth++;
}
return null;
},
log: function(message){
var _console = this.getConsole();
if (!!_console) _console.log(message);
}
Ответ 20
Консоль консоли в TypeScript:
if (!window.console) {
console = {
assert: () => { },
clear: () => { },
count: () => { },
debug: () => { },
dir: () => { },
dirxml: () => { },
error: () => { },
group: () => { },
groupCollapsed: () => { },
groupEnd: () => { },
info: () => { },
log: () => { },
msIsIndependentlyComposed: (e: Element) => false,
profile: () => { },
profileEnd: () => { },
select: () => { },
time: () => { },
timeEnd: () => { },
trace: () => { },
warn: () => { },
}
};
Ответ 21
После стольких проблем с этой штукой (трудно отладить ошибку, так как если вы откроете консоль разработчика, ошибка больше не будет!) Я решил сделать код переполнения, чтобы никогда больше не беспокоиться об этом:
if (typeof window.console === "undefined")
window.console = {};
if (typeof window.console.debug === "undefined")
window.console.debug= function() {};
if (typeof window.console.log === "undefined")
window.console.log= function() {};
if (typeof window.console.error === "undefined")
window.console.error= function() {alert("error");};
if (typeof window.console.time === "undefined")
window.console.time= function() {};
if (typeof window.console.trace === "undefined")
window.console.trace= function() {};
if (typeof window.console.info === "undefined")
window.console.info= function() {};
if (typeof window.console.timeEnd === "undefined")
window.console.timeEnd= function() {};
if (typeof window.console.group === "undefined")
window.console.group= function() {};
if (typeof window.console.groupEnd === "undefined")
window.console.groupEnd= function() {};
if (typeof window.console.groupCollapsed === "undefined")
window.console.groupCollapsed= function() {};
if (typeof window.console.dir === "undefined")
window.console.dir= function() {};
if (typeof window.console.warn === "undefined")
window.console.warn= function() {};
Personaly Я использую только console.log и console.error, но этот код обрабатывает все другие функции, как показано в Mozzila Developer Network: https://developer.mozilla.org/en-US/docs/Web/API/console.
Просто поставьте этот код в верхней части страницы, и вы будете навсегда с этим.
Ответ 22
Вы можете использовать console.log(...) непосредственно в Firefox, но не в IE. В IE вы должны использовать window.console.