'console' - неопределенная ошибка для Internet Explorer

Я использую Firebug, и у меня есть такие утверждения, как:

console.log("...");

на моей странице. В IE8 (возможно, и в более ранних версиях) я получаю ошибки сценария, в которых говорится, что «консоль» не определена. Я попытался разместить это вверху своей страницы:

<script type="text/javascript">
    if (!console) console = {log: function() {}};
</script>

все же я получаю ошибки. Есть ли способ избавиться от ошибок?


person user246114    schedule 24.07.2010    source источник
comment
Используйте typeof в своем if, это позволит избежать неопределенных ошибок: if(typeof console === "undefined") { var console = { log: function (logMsg) { } }; }   -  person Flak DiNenno    schedule 05.02.2013
comment
console.log () работает только тогда, когда открыт инструмент IE dev (да, IE паршивый). см. stackoverflow.com/questions/7742781/   -  person Adrien Be    schedule 16.07.2013
comment
Лучший ответ на этот вопрос - stackoverflow.com/a/16916941/2274855   -  person Vinícius Moraes    schedule 19.11.2013
comment
см. github.com/h5bp/html5-boilerplate/blob/master /js/plugins.js   -  person Aprillion    schedule 27.11.2013
comment
Ссылка @Aprillion не работает, используйте вместо нее эту: github .com / h5bp / html5-шаблон / blob / master / src / js / plugins.js.   -  person Alfred Bez    schedule 22.10.2015
comment
В любом случае использование консольного журналирования в продакшене - плохая идея, по крайней мере, запах кода. Вы можете случайно раскрыть конфиденциальные данные пользователя. Я использую Sonar для обнаружения любых console.log операторов и вынуждаю меня удалить их перед переходом в производство.   -  person Justus Romijn    schedule 16.11.2015


Ответы (20)


Пытаться

if (!window.console) console = ...

На неопределенную переменную нельзя ссылаться напрямую. Однако все глобальные переменные являются атрибутами с тем же именем глобального контекста (window в случае браузеров), и доступ к неопределенному атрибуту возможен.

Или используйте if (typeof console === 'undefined') console = ..., если вы хотите избежать волшебной переменной window, см. ответ @Tim Down.

person kennytm    schedule 24.07.2010
comment
Чтобы кто-нибудь еще этим воспользовался, поместите <script type="text/javascript"> if (!window.console) console = {log: function() {}}; </script> вверху страницы! Спасибо, Кенни. - person windowsgm; 03.07.2012
comment
А как насчет var console = console || { log: function() {} }; - person devlord; 31.10.2012
comment
@lorddev Чтобы использовать это сокращение, вам нужно включить window: var console = window.console || { log: function() {} }; - person jlengstorf; 23.01.2013
comment
Блин ... вы создаете хороший веб-сайт, разрабатывая его для своего любимого браузера. В конце вы тратите 4-5 ЧАСОВ на то, чтобы сделать его совместимым со всеми другими СОВРЕМЕННЫМИ браузерами, а затем вы тратите 4-5 ДНЕЙ на его совместимость с IE. - person Israel; 28.05.2013
comment
Проблема с этим ответом заключается в том, что если вы используете другое имя, например debug, warn, count с браузером, в котором отсутствует консоль, будет выдано исключение, посмотрите, как это лучше сделать stackoverflow.com/a/16916941/2274855 - person Vinícius Moraes; 04.06.2013
comment
К вашему сведению, приведенный выше код, опубликованный killianmcc, просто предотвращает ошибку, но фактическая функция console.log() абсолютно ничего не делает. - person Alex W; 09.09.2013
comment
@lorddev, который повлияет только на локальную область консоли. Вам необходимо изменить window.log, чтобы повлиять на другие файлы сценария, которые выходят за пределы локальной области. - person Petrus Theron; 29.12.2013
comment
Фу! Я просто хотел бы сказать, что это будет работать только в том случае, если вы владеете данной страницей и можете ее изменять. Это не помогает, если ваш код находится во встроенном элементе управления в стороннем приложении, которое вы не контролируете, которое запускает неизвестный браузер, находящийся вне вашего контроля. - person Michael; 08.12.2020

Вставьте следующее в верхнюю часть вашего 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 (и других отсутствующих методов).

РЕДАКТИРОВАТЬ: Я заметил, что HTML5 Boilerplate использует аналогичный код в своих js / plugins.js файл, если вы ищете решение, которое (вероятно) будет постоянно обновляться.

person Peter Tseng    schedule 11.12.2012
comment
Почему за этот ответ так мало голосов? Это самый полный из размещенных здесь. - person mavilein; 03.04.2013
comment
Из-за даты. Абсолютно согласен с правильными рабочими решениями. Думаю, эту тему нужно модерировать. Простите за плохой английский. - person woto; 07.04.2013
comment
Полностью завершено, за исключением того, что он не будет пытаться перенаправить ведение журнала в функцию журнала (если она есть), поэтому все журналы будут потеряны - person Christophe Roussy; 24.05.2013
comment
Чтобы уточнить, например, если console.debug не определено, перенаправить его на console.log вместо noop? - person Peter Tseng; 25.05.2013
comment
Когда именно это произойдет? Этот код должен определять только те элементы, которые еще не определены. - person Peter Tseng; 21.08.2013
comment
@honyovk это не правильно. Этот код не переопределяет существующие методы. Вместо этого он заглушает любой несуществующий метод в текущей реализации консоли, чтобы ничего не делать при вызове. Например, если бы в Firefox был метод console.highfive(), а в Chrome - нет, этот код определил бы console.highfive = function() {};, поэтому вызов console.highfive(user); в Chrome ничего не сделает, но все равно будет выполняться, как задумано в Firefox. В IE каждый метод был бы заглушен. - person John Kary; 22.11.2013
comment
Также см. Аналогичное решение под названием firebugx.js, расположенное здесь: code.google.com/p/fbug/source/browse/branches/firebug1.2/lite/ - person Roberto; 11.03.2014
comment
Последняя строка должна быть:} ()); - person stefgosselin; 09.05.2015
comment
Я думаю, что в любом случае - (function () {...} ()) или (function () {...}) () - на самом деле работает - person Peter Tseng; 11.05.2015

Другой альтернативой является оператор typeof:

if (typeof console == "undefined") {
    this.console = {log: function() {}};
}

Еще одна альтернатива - использовать библиотеку журналов, такую ​​как мой собственный log4javascript.

person Tim Down    schedule 24.07.2010
comment
Однако было бы неплохо заменить необъявленное присвоение правильным объявлением. - person kangax; 25.07.2010
comment
Вы имеете в виду использование var? Здесь это только запутает. Или вы имеете в виду назначение window.console, а не console? - person Tim Down; 25.07.2010
comment
Используя var. Зачем здесь что-то путать? - person kangax; 25.07.2010
comment
Помещение var внутри блока if сбивает с толку и выглядит ошибкой. Это также изменяет природу console независимо от того, выполняется ли блок if, потому что переменная всегда объявляется. Я согласен с тем, что неявное присвоение глобальной переменной, как я здесь, также выглядит ошибкой, но это меняет поведение только тогда, когда console не определено. Ни то, ни другое не идеально. - person Tim Down; 25.07.2010
comment
Проблема с пропуском var при присвоении console - как в этом примере - даже не настолько, чтобы это выглядело как ошибка. Прежде всего, IE DOM имеет досадную особенность, когда необъявленное присвоение выдает ошибку, если идентификатор совпадает с идентификатором одного из элементов в документе. Во-вторых, что более важно, в строгом режиме ES5 undecl. присвоение на самом деле является преднамеренной ошибкой ReferenceError. Учитывая, что строгий режим является более или менее будущим направлением языка, по соображениям совместимости undecl. назначений лучше избегать. Но если нужно, this.console=.. - это альт. вариант. - person kangax; 25.07.2010
comment
Что касается безумия загрязнения глобальной области IE DOM, я знаю об этом, но мы уже знаем, что консоль не определена, по крайней мере, в момент запуска кода. Пункт ES5 хороший: я еще не начал все время думать о ES5. Лично я бы все равно не стал использовать этот код и вместо этого создал бы оболочку вокруг консоли. - person Tim Down; 25.07.2010
comment
Привет, Тим. Я вижу, вы изменили console = ... на this.console = .... Отлично, я изменил свой голос. - person kangax; 26.07.2010
comment
Ах да, спасибо. Интересно, мог ли это быть ты? Я ждал, пока мы закончим обсуждение, прежде чем менять его; точка ES5 решила это, но я не был уверен, что вы все еще отстаиваете var console вместо this.console. - person Tim Down; 26.07.2010
comment
Я лично использую var console = ... и this.console = ... как взаимозаменяемые. Позвольте мне также отметить, что объявление переменной не меняет природу существующей переменной (или, если быть точным, свойства объекта переменной). Если console уже является глобальным свойством, var console, выполняемый в глобальном коде, по сути, не работает. Вот почему if (typeof console == 'undefined') { var console = ... } вообще не меняет console, если он уже объявлен. Альтернативная версия - var console; if (typeof console == 'undefined') { console = .. }, но это тоже может сбивать с толку :) - person kangax; 26.07.2010
comment
OK. Ты прав. Очевидно, что использование var console изменило бы природу свойства console, которое было добавлено к глобальному объекту позже, но это был не тот момент, который мы обсуждали ранее. Спасибо. - person Tim Down; 26.07.2010
comment
Какая запутанная дискуссия. +1 к оригинальному ответу. Если бы я мог дать +2, я бы дал ссылку на ваш собственный log4javascript. Спасибо OP! - person Jay Taylor; 03.07.2011
comment
Неожиданный тип. Используйте '===' для прямого сравнения с undefined. - person yckart; 07.09.2012
comment
@yckart: Нет. typeof гарантированно вернет строку, а "undefined" - это строка. Когда два операнда имеют один и тот же тип, == и === указываются для выполнения точно таких же шагов. Использование typeof x == "undefined" - надежный способ проверить, является ли x неопределенным в любой области и в любой среде, совместимой с ECMAScript 3. - person Tim Down; 07.09.2012
comment
Также, чтобы быть строгим, следует использовать ===. Это единственный стопроцентно строгий ответ, в котором говорится, что! Window.console будет вызывать ошибки в некоторых браузерах. if (typeof (var) === undefined) и фигурные скобки - правильный строгий синтаксис для этой операции. - person Hugh Wood; 12.02.2013
comment
@HughWood: == и === в этом случае точно эквивалентны, потому что оба операнда гарантированно являются строками, поэтому нет объективного преимущества использования ===. Также typeof является оператором, а не функцией, поэтому скобки не нужны. - person Tim Down; 12.02.2013
comment
@TimDown Извините, я не понял, код не строгий, === сделает его строгим и пройдет линтинг, надеюсь, это проясняет, что я имел в виду - person Hugh Wood; 12.02.2013
comment
@HughWood: Достаточно справедливо, если строгие методы соответствуют субъективному представлению Дугласа Крокфорда о хорошей практике. Стандартизация === - неплохая идея, но ни там, где это необходимо, == не используется. Как вы уже догадались, я считаю JSLint чрезмерно самоуверенным. - person Tim Down; 12.02.2013
comment
@TimDown Я думаю, что на этот раз Крокфорд прав, но я все же хотел бы проверить это в сравнении с интерпретаторами браузера на любые различия в реальном мире, но это уже другая тема. - person Hugh Wood; 12.02.2013
comment
@HughWood: Что ж, в спецификации ECMAScript шаги для == и === точно такие же, когда операнды одного типа, и ни один тест, который я видел, не показал каких-либо существенных различий в производительности между ними для таких случаев. - person Tim Down; 13.02.2013

Для более надежного решения используйте этот фрагмент кода (взятый из исходного кода 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;
        }
    }
}());
person Vinícius Moraes    schedule 04.06.2013

В своих сценариях я использую сокращение:

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 () {});
person iblamefish    schedule 24.07.2010
comment
Ошибка синтаксиса. Почему не просто if(!console) {console = {} ; console.log = function(){};} - person Meekohi; 22.02.2012
comment
Или не просто !window.console && (window.console = { log: function () { } }); - person Maksim Vi.; 04.10.2012

Вы можете использовать console.log(), если у вас открыто Developer Tools в IE8, а также вы можете использовать текстовое поле Console на вкладке скрипта.

person Community    schedule 26.10.2011
comment
Это нехорошо, если вы забудете промыть код консоли. Ошибка в IE8 помешает вашему JS-коду работать - person yunzen; 30.08.2012

Основываясь на двух предыдущих ответах автора

и документация для

Вот лучшая реализация проблемы, то есть, если существует console.log, который действительно существует, он заполняет пробелы для несуществующих методов через 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];
            }
        }
    })();
person TWiStErRob    schedule 24.07.2013
comment
Я не уверен, нужен ли нам methods.hasOwnProperty(method) && в цикле for. - person TWiStErRob; 24.07.2013
comment
Я уверен, что вам это действительно нужно. - person ErikE; 08.10.2013
comment
Провел быстрый тест в консоли Chrome: > x = { a: 1, b: 2} - ›Object {a: 1, b: 2} и for(var f in x) {console.log(f + " " + x[f]);} 'end' -› a 1 b 2 "end". Таким образом, у созданного анонимного объекта нет дополнительных свойств, и methods создается только перед циклом for. Можно ли взломать вышеперечисленное? - person TWiStErRob; 08.10.2013
comment
да. var x = { a: 1, b: 2}; Object.prototype.surprise = 'I\'m in yer objectz'; for (var f in x) {console.log(f, x[f]);} Вы никогда не знаете, что библиотека сделала с объектами в цепочке наследования объекта, с которым вы работаете. Таким образом, такие инструменты качества javascript, как jshint и jslint, рекомендуют использовать hasOwnProperty. - person ErikE; 09.10.2013

В IE9, если консоль не открыта, этот код:

alert(typeof console);

покажет "объект", но этот код

alert(typeof console.log);

вызовет исключение TypeError, но не вернет неопределенное значение;

Итак, гарантированная версия кода будет выглядеть примерно так:

try {
    if (window.console && window.console.log) {
        my_console_log = window.console.log;
    }
} catch (e) {
    my_console_log = function() {};
}
person bonbonez    schedule 17.08.2012

Я использую в своем коде только console.log. Поэтому я включаю очень короткие 2 вкладыша

var console = console || {};
console.log = console.log || function(){};
person Ruben Decrop    schedule 08.10.2013
comment
Как это работает ... Я не вижу ни одной строки console.log, напечатанной в браузере IE, я тестировал с 2 разными системами, в которых 1 - console.log работает, а 2 системы - нет. Я пробовал в обоих, но не смог увидеть никаких журналов в обеих системах. - person kiran; 13.09.2016

Заметили, что 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)

person Roberto    schedule 11.03.2014

Я использую fauxconsole; Я немного изменил CSS, чтобы он выглядел лучше, но работал очень хорошо.

person Stijn Geukens    schedule 16.11.2011

Для отладки в IE ознакомьтесь с этим log4javascript

person Praveen    schedule 22.02.2013
comment
Это здорово, тем более что моя консоль IE8 ничего не выводит. - person Firsh - justifiedgrid.com; 20.05.2013
comment
@Firsh Спасибо за ваши комментарии. - person Praveen; 21.05.2013
comment
Я искал здесь комментарий по другому вопросу, в котором говорилось «бесстыдная самореклама», или я не знаю - похоже - кто-то сказал, что создал этот сценарий, это вы? Я уже закрыл эту вкладку. В любом случае это действительно отличный инструмент и очень полезен для моего проекта. - person Firsh - justifiedgrid.com; 22.05.2013
comment
@Firsh Я не создавал этот скрипт, я такой же человек, как и вы, получил пользу от использования инструмента. - person Praveen; 22.05.2013

Для IE8 или поддержки консоли, ограниченной console.log (без отладки, трассировки и т. Д.), Вы можете сделать следующее:

  • Если console ИЛИ console.log undefined: Создайте фиктивные функции для функций консоли (трассировка, отладка, журнал, ...)

    window.console = { debug : function() {}, ...};

  • В противном случае, если console.log определен (IE8) И console.debug (любой другой) не определен: перенаправьте все функции ведения журнала в console.log, это позволяет сохранить эти журналы!

    window.console = { debug : window.console.log, ...};

Не уверен в поддержке assert в различных версиях IE, но любые предложения приветствуются. Также разместил здесь этот ответ: Как я могу использовать ведение журнала консоли в Internet Explorer?

person Christophe Roussy    schedule 09.04.2013

Заглушка консоли в 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: () => { },
    }
};
person gdbdable    schedule 04.05.2017

Вы можете использовать приведенную ниже информацию, чтобы получить дополнительную степень страховки, которая обеспечивает покрытие всех базовых требований. Использование typeof в первую очередь позволит избежать undefined ошибок. Использование === также гарантирует, что имя типа на самом деле является строкой «undefined». Наконец, вы захотите добавить параметр в сигнатуру функции (я выбрал logMsg произвольно) для обеспечения согласованности, поскольку вы передаете все, что хотите напечатать на консоли, в функцию журнала. Это также обеспечит точность intellisense и позволит избежать каких-либо предупреждений / ошибок в вашей JS-совместимой среде IDE.

if(!window.console || typeof console === "undefined") {
  var console = { log: function (logMsg) { } };
}
person Flak DiNenno    schedule 04.02.2013

Иногда консоль будет работать в IE8 / 9, но иногда не работает. Это неустойчивое поведение зависит от того, открыты ли у вас инструменты разработчика, и описано в вопросе stackoverflow Поддерживает ли IE9 console.log и является ли это реальной функцией ?

person Anon    schedule 29.01.2014

Обнаружена аналогичная проблема с запуском console.log в дочерних окнах в IE9, созданная функцией window.open.

Кажется, что в этом случае консоль определена только в родительском окне и не определена в дочерних окнах, пока вы не обновите их. То же самое относится к дочерним элементам дочерних окон.

Я решаю эту проблему, помещая журнал в следующую функцию (ниже фрагмент модуля)

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);
    }
person Max Venediktov    schedule 07.05.2014

После того, как возникло так много проблем с этой штукой (трудно отладить ошибку, поскольку, если вы откроете консоль разработчика, ошибка больше не будет!), Я решил сделать избыточный код, чтобы никогда больше не беспокоиться об этом:

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

Лично я использую только console.log и console.error, но этот код обрабатывает все другие функции, как показано в сети разработчиков Mozzila: https://developer.mozilla.org/en-US/docs/Web/API/console. Просто поместите этот код в верхнюю часть своей страницы, и с этим навсегда покончено.

person Hoffmann    schedule 30.08.2013

Вы можете использовать console.log (...) непосредственно в Firefox, но не в IE. В IE вам нужно использовать window.console.

person Mohit Kumar    schedule 27.07.2010
comment
console.log и window.console.log относятся к одной и той же функции в любом браузере, который даже удаленно совместим с ECMAscript. Последний вариант рекомендуется использовать, чтобы избежать случайного затенения локальной переменной глобального объекта консоли, но это не имеет абсолютно никакого отношения к выбору браузера. console.log отлично работает в IE8, и, AFAIK, в IE6 / 7 вообще нет возможности ведения журнала. - person Tgr; 26.10.2010

person    schedule
comment
caveat emptor: это должно быть определено на глобальном уровне, где this относится к window. - person Sgnl; 22.12.2017