Поддерживает ли IE9 console.log и является ли это реальной функцией? - PullRequest
205 голосов
/ 29 марта 2011

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

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

[Схожий вопрос для IE8: Что случилось с console.log в IE8? .]

Ответы [ 7 ]

297 голосов
/ 29 марта 2011

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

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

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

var log = Function.prototype.bind.call(console.log, console);
log.apply(console, ["this", "is", "a", "test"]);
//-> "thisisatest"
165 голосов
/ 07 марта 2012

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

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

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

13 голосов
/ 06 августа 2014

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

// 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 голосов
/ 05 февраля 2013

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

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

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

if (console) 
    console.log(msg)
6 голосов
/ 18 октября 2012

Прочитав статью из комментария Марка Клиамента выше, я теперь изменил свою универсальную кросс-браузерную функцию 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);
        }
    }
}
0 голосов
/ 12 октября 2016

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

0 голосов
/ 31 июля 2012

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

console = { log : function(text) { alert(text); } }
...