Поддерживает ли IE9 консоль .log и является ли она реальной функцией?
В каких обстоятельствах window.console.log
определяется в Internet Explorer 9?
Даже если window.console.log
определено, window.console.log.apply
и window.console.log.call
undefined. Почему это?
[Связанный вопрос для IE8: Что случилось с console.log в IE8?.]
Ответы
Ответ 1
В Internet Explorer 9 (и 8) объект console
открывается только при открытии инструментов разработчика для определенной вкладки. Если вы скрываете окно инструментов разработчика для этой вкладки, объект console
остается открытым для каждой страницы, на которую вы переходите. Если вы откроете новую вкладку, вы также должны открыть инструменты разработчика для этой вкладки, чтобы объект console
отображался.
Объект console
не является частью какого-либо стандарта и является расширением для объектной модели документа. Как и другие объекты DOM, он считается объектом-хозяином и не требуется наследовать от Object
, а также его методы из Function
, как и функции ECMAScript и объекты. По этой причине apply
и call
являются undefined для этих методов. В 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.log является определение следующего в начале вашего JS-кода:
if (!window.console) window.console = {};
if (!window.console.log) window.console.log = function () { };
Это работает для меня во всех браузерах. Это создает фиктивную функцию для console.log, когда отладчик неактивен. Когда отладчик активен, метод console.log определяется и выполняется нормально.
Ответ 3
Я знаю, что это очень старый вопрос, но чувствую, что это добавляет ценную альтернативу решению проблемы с консолью. Поместите следующий код перед любым вызовом на консоль. * (Так что ваш первый script).
// 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
Ответ 4
console.log определяется только при открытии консоли. Если вы хотите проверить это в своем коде, убедитесь, что вы проверяете его в свойстве окна
if (window.console)
console.log(msg)
это вызывает исключение в IE9 и не будет работать корректно. Не делайте этого
if (console)
console.log(msg)
Ответ 5
Прочитав статью из комментария Marc Cliament выше, я теперь изменил свою универсальную кросс-браузерную консоль .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);
}
}
}
Ответ 6
Как насчет...
console = { log : function(text) { alert(text); } }
Ответ 7
Я хотел бы упомянуть, что IE9 не вызывает ошибку, если вы используете console.log с инструментами разработчика, закрытыми во всех версиях Windows. В XP это происходит, но в Windows 7 это не так.
Поэтому, если вы отказались от поддержки WinXP в целом, вы отлично используете console.log.