Поддерживает ли IE9 console.log и является ли это реальной функцией?

209

При каких обстоятельствах window.console.logопределяется в Internet Explorer 9?

Даже когда window.console.logэто определено window.console.log.applyи window.console.log.callне определено. Почему это?

[Связанный вопрос для IE8: что случилось с console.log в IE8? .]

mloughran
источник
3
Прочтите этот замечательный пост о тонкостях консольного объекта / функции IE8-9
Марк Климент
@MarcCliment ссылка мертва
chakeda
@chakeda Я ненавижу, когда это происходит, есть ссылка из веб-архива: web.archive.org/web/20140625085155/http://whattheheadsaid.com/…
Марк Климент,

Ответы:

299

В Internet Explorer 9 (и 8) consoleобъект открывается только тогда, когда инструменты разработчика открыты для определенной вкладки. Если вы скрываете окно инструментов разработчика для этой вкладки, consoleобъект остается открытым для каждой страницы, на которую вы переходите. Если вы открываете новую вкладку, вы также должны открыть инструменты разработчика для этой вкладки, чтобы consoleобъект был доступен.

consoleОбъект не является частью любого стандарта и является продолжением к модели объекта документа. Как и другие объекты DOM, он считается хост-объектом и не обязан наследоваться Object, равно как и его методы Function, как это делают нативные функции и объекты ECMAScript. Это причина applyи callне определены в этих методах. В IE 9 большинство объектов DOM были улучшены для наследования от собственных типов ECMAScript. Поскольку инструменты разработчика считаются расширением IE (хотя и встроенным расширением), они явно не получили тех же улучшений, что и остальная часть DOM.

Для чего бы это ни стоило, вы все равно можете использовать некоторые Function.prototypeметоды в consoleметодах с небольшим количеством bind()волшебства:

var log = Function.prototype.bind.call(console.log, console);
log.apply(console, ["this", "is", "a", "test"]);
//-> "thisisatest"
Энди Э
источник
2
То же самое относится и к consoleобъекту Firebug .
Марсель Корпель
150
Я с гордостью могу сказать, что в течение многих лет, которые я разрабатывал для Интернета, я предполагал, что console.log поддерживается всеми основными браузерами. Я просто потратил день на то, чтобы понять, почему IE9 не нравится мой скрипт, и теперь я знаю, почему - у него был console.log на самом первом этапе. Невозможно отладить, так как включение режима отладки заставило эту ошибку исчезнуть в одно мгновение: P Спасибо за разъяснения !!
f055
2
Была такая же проблема вчера. Установка DebugBar помогла мне быстрее, так как он не определяет консольный объект. Поэтому, когда я спрятал консоль IE, но не DebugBar, я получил сообщение от последнего, что произошла ошибка JavaScript (консоль не определена).
Саймон Эугстер
Вы должны были проверить журнал ошибок в самый первый раз, когда проблема пришла к вам в IE @ f055
Lucky Ali
7
Свойства обозревателя -> Дополнительно -> Показать уведомление о каждой ошибке скрипта. Веб-разработчики должны всегда оставлять это отмеченным в IE. Это сообщило бы вам о консоли или о том, что функция журнала не определена ... не может точно запомнить сообщение.
Сет Флауэрс
166

Простое решение этой проблемы console.log - определить следующее в начале вашего кода JS:

if (!window.console) window.console = {};
if (!window.console.log) window.console.log = function () { };

Это работает для меня во всех браузерах. Это создает фиктивную функцию для console.log, когда отладчик не активен. Когда отладчик активен, метод console.log определен и выполняется нормально.

Майкл Эриксон
источник
8
Дополнительная информация и более надежные замены консоли (включая другие методы консоли) здесь: stackoverflow.com/questions/8002116/…
Zach Lysobey
@ZachL: какие именно в бетоне?
Хакре
Мой ответ имеет один подход: stackoverflow.com/a/15771110/363701 . Также проверьте это: github.com/paulmillr/console-polyfill/blob/master/index.js
Зак Лисобей,
13

Я знаю, что это очень старый вопрос, но чувствую, что это добавляет ценную альтернативу решения проблемы с консолью. Поместите следующий код перед любым вызовом консоли. * (Так что ваш самый первый скрипт).

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

Ссылка:
https://github.com/h5bp/html5-boilerplate/blob/v5.0.0/dist/js/plugins.js

Стивен Андерсон
источник
10

console.log определяется только когда консоль открыта. Если вы хотите проверить это в своем коде, убедитесь, что вы проверите это в свойстве окна

if (window.console)
    console.log(msg)

это вызывает исключение в IE9 и не будет работать правильно. Не делай этого

if (console) 
    console.log(msg)
Джон
источник
6

Прочитав статью из комментария Марка Клиамента выше, я изменил свою универсальную кросс-браузерную функцию console.log:

function log()
{
    "use strict";

    if (typeof(console) !== "undefined" && console.log !== undefined)
    {
        try
        {
            console.log.apply(console, arguments);
        }
        catch (e)
        {
            var log = Function.prototype.bind.call(console.log, console);
            log.apply(console, arguments);
        }
    }
}
Джеймс Форд
источник
1
ПростоFunction.prototype.apply.call(console.log, console, arguments);
Виктор
@Victor, это определенно должен быть единственный принятый ответ!
Павел Франков
0

Я хотел бы отметить, что IE9 не вызывает ошибку, если вы используете console.log с инструментами разработчика, закрытыми на всех версиях Windows. На XP это так, а на Windows 7 - нет. Так что, если вы вообще отказались от поддержки WinXP, вы можете напрямую использовать console.log.

Паоло Миони
источник
-1

Как насчет...

console = { log : function(text) { alert(text); } }
Ceilingfish
источник
1
В некоторых случаях это может быть приемлемым решением, но вы на самом деле не ответили на этот вопрос.
PSWG