javascript - working - ie11 developer tools




«console»-неопределенная ошибка для Internet Explorer (14)

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

console.log("...");

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

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

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


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

В моих сценариях я либо использую стенографию:

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

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


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


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

Для отладки в IE проверьте этот log4javascript


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

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

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


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


Контур консоли в 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: () => { },
    }
};

Обнаружена аналогичная проблема с запуском 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);
    }

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

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

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


Пытаться

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

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

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


Я использую console.log только в своем коде. Таким образом, я включаю очень короткий 2 лайнер

var console = console || {};
console.log = console.log || function(){};

console = console || { 
    debug: function(){}, 
    log: function(){}
    ...
}




ie-developer-tools