Что случилось с console.log в IE8?

Согласно этот пост, он был в бета-версии, но это не в релизе?

Ответы

Ответ 1

Еще лучше для резервного копирования:


   var alertFallback = true;
   if (typeof console === "undefined" || typeof console.log === "undefined") {
     console = {};
     if (alertFallback) {
         console.log = function(msg) {
              alert(msg);
         };
     } else {
         console.log = function() {};
     }
   }

Ответ 2

console.log доступен только после того, как вы открыли Инструменты для разработчиков (F12 для его открытия и закрытия). Забавно, что после того, как вы его открыли, вы можете закрыть его, а затем поместить в него сообщения console.log, и это будет видно при его повторном открытии. Я думаю, что это ошибка, и может быть исправлена, но мы увидим.

Я, вероятно, просто буду использовать что-то вроде этого:

function trace(s) {
  if ('console' in self && 'log' in console) console.log(s)
  // the line below you might want to comment out, so it dies silent
  // but nice for seeing when the console is available or not.
  else alert(s)
}

и даже проще:

function trace(s) {
  try { console.log(s) } catch (e) { alert(s) }
}

Ответ 3

Это мой ответ на различные ответы. Я действительно хотел просмотреть зарегистрированные сообщения, даже если бы я не открывал консоль IE при их запуске, поэтому я нажимаю их в массив console.messages, который я создаю. Я также добавил функцию console.dump(), чтобы облегчить просмотр всего журнала. console.clear() пустет очередь сообщений.

Эти решения также "обрабатывают" другие методы консоли (которые, как я полагаю, исходят из API консоли Firebug)

Наконец, это решение находится в форме IIFE, поэтому оно не загрязняет глобальную область. Аргумент функции возврата задается в нижней части кода.

Я просто отбрасываю его в моем основном JS файле, который включен на каждую страницу, и забыл об этом.

(function (fallback) {    

    fallback = fallback || function () { };

    // function to trap most of the console functions from the FireBug Console API. 
    var trap = function () {
        // create an Array from the arguments Object           
        var args = Array.prototype.slice.call(arguments);
        // console.raw captures the raw args, without converting toString
        console.raw.push(args);
        var message = args.join(' ');
        console.messages.push(message);
        fallback(message);
    };

    // redefine console
    if (typeof console === 'undefined') {
        console = {
            messages: [],
            raw: [],
            dump: function() { return console.messages.join('\n'); },
            log: trap,
            debug: trap,
            info: trap,
            warn: trap,
            error: trap,
            assert: trap,
            clear: function() { 
                  console.messages.length = 0; 
                  console.raw.length = 0 ;
            },
            dir: trap,
            dirxml: trap,
            trace: trap,
            group: trap,
            groupCollapsed: trap,
            groupEnd: trap,
            time: trap,
            timeEnd: trap,
            timeStamp: trap,
            profile: trap,
            profileEnd: trap,
            count: trap,
            exception: trap,
            table: trap
        };
    }

})(null); // to define a fallback function, replace null with the name of the function (ex: alert)

Дополнительная информация

Строка var args = Array.prototype.slice.call(arguments); создает массив из объекта arguments. Это необходимо, потому что аргументы на самом деле не являются массивом.

trap() является обработчиком по умолчанию для любой из функций API. Я передаю аргументы message, чтобы вы получили журнал аргументов, которые были переданы любому вызову API (а не только console.log).

Изменить

Я добавил дополнительный массив console.raw, который захватывает аргументы точно так же, как передано trap(). Я понял, что args.join(' ') преобразовывает объекты в строку "[object Object]", которая иногда может быть нежелательной. Спасибо bfontaine за предложение .

Ответ 4

Стоит отметить, что console.log в IE8 не является истинной функцией Javascript. Он не поддерживает методы apply или call.

Ответ 5

Предполагая, что вы не заботитесь о резервном предупреждении, вот еще более краткий способ устранения недостатков Internet Explorer:

var console=console||{"log":function(){}};

Ответ 6

Мне очень нравится подход, который размещает "orange80". Это изящно, потому что вы можете установить его один раз и забыть.

Другие подходы требуют, чтобы вы делали что-то другое (каждый раз вызывайте что-то, отличное от простого console.log()), которое просто требует неприятностей... Я знаю, что я в конце концов забуду.

Я сделал еще один шаг, обернув код в функцию утилиты, которую вы можете вызывать один раз в начале вашего javascript, где угодно до тех пор, пока он не будет вести запись. (Я устанавливаю это в свой продукт маршрутизатора событий компании. Это упростит кросс-браузерный дизайн нового интерфейса администратора.)

/**
 * Call once at beginning to ensure your app can safely call console.log() and
 * console.dir(), even on browsers that don't support it.  You may not get useful
 * logging on those browers, but at least you won't generate errors.
 * 
 * @param  alertFallback - if 'true', all logs become alerts, if necessary. 
 *   (not usually suitable for production)
 */
function fixConsole(alertFallback)
{    
    if (typeof console === "undefined")
    {
        console = {}; // define it if it doesn't exist already
    }
    if (typeof console.log === "undefined") 
    {
        if (alertFallback) { console.log = function(msg) { alert(msg); }; } 
        else { console.log = function() {}; }
    }
    if (typeof console.dir === "undefined") 
    {
        if (alertFallback) 
        { 
            // THIS COULD BE IMPROVED… maybe list all the object properties?
            console.dir = function(obj) { alert("DIR: "+obj); }; 
        }
        else { console.dir = function() {}; }
    }
}

Ответ 7

Если вы получаете "undefined" для всех ваших вызовов console.log, это, вероятно, означает, что вы все еще загрузили старый firebuglite (firebug.js). Он переопределит все допустимые функции IE8 console.log, даже если они существуют. Во всяком случае, это случилось со мной.

Проверьте, что другой код переопределяет объект консоли.

Ответ 8

Лучшим решением для любого браузера, у которого нет консоли, является:

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

Ответ 9

Есть так много ответов. Мое решение для этого было:

globalNamespace.globalArray = new Array();
if (typeof console === "undefined" || typeof console.log === "undefined") {
    console = {};
    console.log = function(message) {globalNamespace.globalArray.push(message)};   
}

Короче говоря, если console.log не существует (или в этом случае не открывается), сохраните журнал в глобальном массиве пространств имен. Таким образом, вас не беспокоят миллионы предупреждений, и вы можете просматривать свои журналы с открытой или закрытой консолью разработчика.

Ответ 10

if (window.console && 'function' === typeof window.console.log) {
    window.console.log(o);
}

Ответ 11

Вот мой "IE, пожалуйста, не сработайте"

typeof console=="undefined"&&(console={});typeof console.log=="undefined"&&(console.log=function(){});

Ответ 12

Я нашел это на github:

// usage: log('inside coolFunc', this, arguments);
// paulirish.com/2009/log-a-lightweight-wrapper-for-consolelog/
window.log = function f() {
    log.history = log.history || [];
    log.history.push(arguments);
    if (this.console) {
        var args = arguments,
            newarr;
        args.callee = args.callee.caller;
        newarr = [].slice.call(args);
        if (typeof console.log === 'object') log.apply.call(console.log, console, newarr);
        else console.log.apply(console, newarr);
    }
};

// make it safe to use console.log always
(function(a) {
    function b() {}
    for (var c = "assert,count,debug,dir,dirxml,error,exception,group,groupCollapsed,groupEnd,info,log,markTimeline,profile,profileEnd,time,timeEnd,trace,warn".split(","), d; !! (d = c.pop());) {
        a[d] = a[d] || b;
    }
})(function() {
    try {
        console.log();
        return window.console;
    } catch(a) {
        return (window.console = {});
    }
} ());

Ответ 13

Я использую подход Уолтера сверху (см. fooobar.com/questions/7088/...)

Я смешиваю в решении, которое я нашел здесь fooobar.com/questions/8050/..., чтобы правильно показывать объекты.

Это означает, что функция ловушки становится:

function trap(){
    if(debugging){
        // create an Array from the arguments Object           
        var args = Array.prototype.slice.call(arguments);
        // console.raw captures the raw args, without converting toString
        console.raw.push(args);
        var index;
        for (index = 0; index < args.length; ++index) {
            //fix for objects
            if(typeof args[index] === 'object'){ 
                args[index] = JSON.stringify(args[index],null,'\t').replace(/\n/g,'<br>').replace(/\t/g,'&nbsp;&nbsp;&nbsp;');
            }
        }
        var message = args.join(' ');
        console.messages.push(message);
        // instead of a fallback function we use the next few lines to output logs
        // at the bottom of the page with jQuery
        if($){
            if($('#_console_log').length == 0) $('body').append($('<div />').attr('id', '_console_log'));
            $('#_console_log').append(message).append($('<br />'));
        }
    }
} 

Я надеюсь, что это полезно: -)

Ответ 14

Он работает в IE8. Откройте инструменты разработчика IE8, нажав F12.

>>console.log('test')
LOG: test

Ответ 15

Мне нравится этот метод (с использованием jquery doc ready)... он позволяет использовать консоль даже в том, что... только catch - это то, что вам нужно перезагрузить страницу, если вы откроете ie dev tools после загрузки страницы...

он может быть более простым, учитывая все функции, но я использую только журнал, так что это то, что я делаю.

//one last double check against stray console.logs
$(document).ready(function (){
    try {
        console.log('testing for console in itcutils');
    } catch (e) {
        window.console = new (function (){ this.log = function (val) {
            //do nothing
        }})();
    }
});

Ответ 16

Вот версия, которая будет записываться на консоль, когда инструменты разработчика открыты, а не когда они закрыты.

(function(window) {

   var console = {};
   console.log = function() {
      if (window.console && (typeof window.console.log === 'function' || typeof window.console.log === 'object')) {
         window.console.log.apply(window, arguments);
      }
   }

   // Rest of your application here

})(window)

Ответ 17

Создайте собственную консоль в html....;-) Это может быть наложено, но вы можете начать с:

if (typeof console == "undefined" || typeof console.log === "undefined") {
    var oDiv=document.createElement("div");
    var attr = document.createAttribute('id'); attr.value = 'html-console';
    oDiv.setAttributeNode(attr);


    var style= document.createAttribute('style');
    style.value = "overflow: auto; color: red; position: fixed; bottom:0; background-color: black; height: 200px; width: 100%; filter: alpha(opacity=80);";
    oDiv.setAttributeNode(style);

    var t = document.createElement("h3");
    var tcontent = document.createTextNode('console');
    t.appendChild(tcontent);
    oDiv.appendChild(t);

    document.body.appendChild(oDiv);
    var htmlConsole = document.getElementById('html-console');
    window.console = {
        log: function(message) {
            var p = document.createElement("p");
            var content = document.createTextNode(message.toString());
            p.appendChild(content);
            htmlConsole.appendChild(p);
        }
    };
}