Чи підтримує 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? .]


3
Перегляньте цей чудовий пост про тонкощі об'єкта / функції консолі IE8-9
Marc Climent


@MarcCliment посилання мертва
chakeda

@chakeda Я ненавиджу, коли це відбувається, є посилання з веб-архіву: web.archive.org/web/20140625085155/http://whattheheadsaid.com/…
Marc Climent

Відповіді:


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
Zach Lysobey

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

1
У деяких випадках це може бути прохідним рішенням, але ви фактично не вирішили питання.
pswg
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.