IE8'deki console.log'a ne oldu?


254

Bu gönderiye göre beta sürümündeydi, ancak sürümde değil mi?


65
console.log olduğunu IE8 orada, ama consolenesne açık DevTools'un kadar oluşturulmaz. Bu nedenle, çağrılması console.log, örneğin geliştirici araçlarını açma şansınız olmadan sayfa yüklemesinde meydana gelirse hataya neden olabilir. Kazanan cevabı burada daha ayrıntılı olarak açıklamaktadır.
SDC

Yanıtlar:


229

Yedek için daha iyi olan şudur:


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


71
Bu çok pratik değildir - console.log () 'a yapılan her çağrı için uyarı veren bir web sitesinde nasıl hata ayıklayabilirsiniz? Kodunuzda log () için 10'dan fazla çağrınız varsa ne olur? Msg bir nesne ise ne olur? Walter'ın cevabı bir başlangıç ​​noktası olarak çok daha mantıklı.
Prekasik

7
@Precastic: İnsanlar tarayıcıyı kullanmayı bırakacaklar: P
Amogh Talpallikar

Bkz yorumumu Mister Lucky'nin yanıta.
Daniel Schilling

1
göze batmayan (kusurlu olsa da) alternatif bir geri dönüş, document.title öğesini ayarlamaktır. En azından tarayıcıyı kalıcı bir uyarı ile kilitlemiyor.
brennanyoung

257

console.log yalnızca Geliştirici Araçlarını açtıktan sonra kullanılabilir (F12'yi açmak ve kapatmak için). Komik olan şey, açtıktan sonra onu kapatabilir ve yine de console.log çağrıları ile gönderebilirsiniz ve yeniden açtığınızda görüneceklerdir. Bunun bir çeşit hata olduğunu ve düzeltilebileceğini düşünüyorum, ama göreceğiz.

Muhtemelen böyle bir şey kullanacağım:

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

ve daha da basit:

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

11
Her iki durumda da $ other-browers bulamayabilir ve bu nedenle bir JavaScript hatasıyla öleceğinden console.log'u körü körüne çağırmamalısınız. +1
Kent Fredric

8
muhtemelen yayınlanmadan önce izleri kapatmak istersiniz;)
Kent Fredric

2
Geliştirici araçları açık olmadan oturum açmamak mantıklıdır, ancak sessizce başarısız olmaktan ziyade bir istisna atmak, buradaki gerçek kafa karıştırıcı karardır.
ehdv

4
Kaydırma console.log gibi bir dezavantajı işaret etmek istiyorum ... artık günlük kaydınızın nereden geldiğini görmeyeceksiniz. Bazen çok yararlı buluyorum, üstte her konsol satırının kodunuzdaki aynı konumdan kaynaklanması yanlış görünüyor.
Martin Westin

2
alertşeytan. Bazı kodlar uyarılar kullanıldığında farklı davranır çünkü belge odağı kaybeder, hataların teşhis edilmesini daha da zorlaştırır veya daha önce olmadığı yerlerde hata oluşturur. Ayrıca, yanlışlıkla console.logüretim kodunuzda bir bırakırsanız , iyi huyludur (patlamamış olduğu varsayılarak) - konsola sessizce giriş yapar. Yanlışlıkla alertüretim kodunuzda bir kod bırakırsanız , kullanıcı deneyimi bozulur.
Daniel Schilling

56

Bu benim çeşitli cevapları benim almam. Ben aslında onlar ateşlendiğinde IE konsolu açık olmasa bile, kayıtlı mesajları görmek istedim, bu yüzden onları console.messagesoluşturmak bir dizi içine itmek . Ayrıca console.dump()tüm günlüğü görüntülemeyi kolaylaştıran bir işlev ekledim . console.clear()ileti kuyruğunu boşaltır.

Bu çözümler aynı zamanda diğer Konsol yöntemlerini "işler" (ki bunların hepsinin Firebug Konsol API'sinden geldiğini düşünüyorum )

Son olarak, bu çözüm bir IIFE biçimindedir , bu nedenle küresel kapsamı kirletmez. Yedek işlev argümanı kodun altında tanımlanır.

Sadece her sayfada bulunan ana JS dosyama bırakıyorum ve unutuyorum.

(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)

Bazı ekstra bilgiler

Çizgi, var args = Array.prototype.slice.call(arguments);Nesneden bir Dizi oluşturur arguments. Bu gereklidir çünkü argümanlar gerçekte bir Array değildir .

trap()API işlevlerinden herhangi biri için varsayılan bir işleyicidir. Ben argüman geçmemize messageherhangi API çağrısı (sadece geçirildi argümanlar bir günlük olsun ki console.log).

Düzenle

console.rawBağımsız değişkenleri tam olarak aktarıldığı gibi yakalayan bir dizi ekledim trap(). Ben bazen istenmeyen olabilir args.join(' ')dize nesneleri dönüştürmek olduğunu fark ettim "[object Object]". Teşekkür bfontaine için öneri .


4
+1 Bu anlamlı olmaya başlayan tek çözümdür. Sen hangi dünyada olurdu değil açıkça konsola gönderiyor mesajları görmek istiyorum!
Prekasik

Mükemmel cevap. Bahsettiğiniz IIFE makalesini gerçekten beğendim, muhtemelen şimdiye kadar okuduğum en iyilerden biri. Eğer bu iki hatları için amacının ne olduğunu ayrıntılı olarak söyleyebilir misiniz acaba trapfonksiyonu: var args = Array.prototype.slice.call(arguments); var message = args.join(' ');? Neden bu argümanları mesaja iletiyorsun?
user1555863

1
@ user1555863 Sorularınızı yanıtlamak için cevabımı güncelledim, kodun altındaki bölüme bakın.
Walter Stabosz

1
Sanırım "console.clear ()" fonksiyonunuzun ikinci satırında "console.row.length = 0" yerine "console.raw.length = 0" yazmalıdır.
Steve J

52

console.logIE8'de gerçek bir Javascript işlevi olmadığını belirtmek gerekir . applyVeya callyöntemlerini desteklemez .


3
+1 Bu, bu sabah yaptığım kesin hata. Console.log için argümanlar uygulamaya çalışıyorum ve IE8 benden nefret ediyor.
Bernhard Hofmann

Microsoft, "İnsanların konsol nesnesinin üzerine yazmasına izin vermemizin güvenli olmadığını" söylüyor: /
Tom Roggero

1
Bunu kullanmak console.log=Function.prototype.bind.call(console.log,console);için kullanıyorum .
mowwwalker

1
IE8'de yok bind.
katspaugh

44

Uyarmak için bir geri dönüşü umursamadığınızı varsayarsak, Internet Explorer'ın eksikliklerini gidermenin daha da kısa bir yolu var:

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

+1 Kodumu anonim bir işlevde belirlediğim için, konsolu böyle bir değişkene yerleştirmek benim için en iyi çözüm. Diğer kütüphanelerde devam eden başka bir konsol çengeline müdahale etmeme yardımcı olur.
Codesleuth

2
Geliştirici araçları açılır açılmaz günlüğe kaydetmeye başlamak istiyorsunuz. Bu çözümü uzun ömürlü bir kapsama koyarsanız (örn. İç işlevleri geri arama olarak kaydeder), sessiz geri dönüşü kullanmaya devam eder.
Beni Cherniavsky-Paskin

+ 1 / -1 = 0: +1, çünkü çözüm daha çok console.logs dosyasının IE'de bir siteyi kırmasını önlemeye dayalı olmalıdır - hata ayıklamak için kullanılmaz ... Hata ayıklamak istiyorsanız, f12 tuşuna basın ve konsolu açın: ) -1 çünkü konsolun üzerine yazmadan önce var olup olmadığını kontrol etmelisiniz.
1nfiniti

Bazı IE eklentileri console ve console.log'u tanımlar, ancak boş nesneler olarak işlevler tanımlamaz.
Lilith River

24

"Orange80" tarafından yayınlanan yaklaşımı gerçekten seviyorum. Zarif çünkü bir kez ayarlayıp unutabilirsiniz.

Diğer yaklaşımlar, farklı bir şey yapmanızı gerektirir ( console.log()her seferinde sade bir şey çağırın ), bu sadece sorun ister… Nihayetinde unutacağımı biliyorum.

Ben bir adım daha, herhangi bir günlük kayıt olduğu sürece herhangi bir yerde, javascript başlangıcında bir kez çağırabilirsiniz bir yardımcı program işlevine sarın. (Bunu şirketimin etkinlik veri yönlendirici ürününe yüklüyorum. Yeni yönetici arayüzünün tarayıcılar arası tasarımını basitleştirmeye yardımcı olacak.)

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

1
Sevindim sevindim :-) Ben bahsettiğim kesin nedeni için kullanın - b / c iyi bir güvenlik. Bazı "console.log" ifadelerini geliştirme için kodunuza koymak ve bunları daha sonra kaldırmayı unutmak çok kolaydır. En azından bunu yaparsanız ve console.log'u kullandığınız her dosyanın üstüne koyarsanız, sitenin, console.log'da başarısız oldukları b / c müşterilerin tarayıcılarında asla kırılmayacaksınız. Beni daha önce kurtardım! Güzel gelişmeler, btw :-)
jpswain

1
"Çıkarması çok kolay ... onları kaldırmayı unut". Her zaman geçici hata ayıklama günlüğü ile yaptığım yararlı bir şey, boş bir yorum ile kod önekidir, /**/console.log("...");bu nedenle geçici kodu aramak ve bulmak kolaydır.
Lawrence Dol

8

Tüm console.log çağrılarınıza "tanımsız" yazarsanız, muhtemelen eski bir firebuglite yüklü (firebug.js) olduğu anlamına gelir. Var olsa bile IE8'nin console.log dosyasının tüm geçerli işlevlerini geçersiz kılar. Zaten başıma gelen de buydu.

Konsol nesnesini geçersiz kılan diğer kodu kontrol edin.


5

Konsolu olmayan tüm tarayıcılar için en iyi çözüm:

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

1
Bu, console.group veya console.GroupCollapsed kullanılarak günlüğe kaydedilen nesnelerin veya dizelerin tamamen kaybolacağı göze batan bir sorun var. Bu gereksizdir, varsa konsol.log ile eşlenmelidir.
Ben

3

Çok fazla cevap var. Bunun için benim çözümüm şuydu:

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

Kısacası, console.log yoksa (veya bu durumda açılmazsa), günlüğü global bir ad alanı Array'da depolayın. Bu şekilde, milyonlarca uyarıyla rahatsız olmazsınız ve geliştirici konsolu açık veya kapalı iken günlüklerinizi görüntüleyebilirsiniz.


2
if (window.console && 'function' === window.console.log yazın)) {
    window.console.log (O);
}

window.console.log()IE8'de mevcut console.log()olmasa bile bunun mümkün olabileceğini mi söylüyorsun ?
LarsH

Buradaki sorun typeof window.console.log === "object", değil"function"
Isochronous

2

İşte benim "IE lütfen çökme"

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

1

Bunu github'da buldum :

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

1

Walter'ın yaklaşımını yukarıdan kullanıyorum (bkz: https://stackoverflow.com/a/14246240/3076102 )

Nesneleri düzgün bir şekilde göstermek için burada bulduğum bir çözümle https://stackoverflow.com/a/7967670 karıştırıyorum .

Bu, tuzak işlevinin şu hale geldiği anlamına gelir:

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

Umarım bu yardımcı olur :-)


0

IE8'de çalışır. IE8'in Geliştirici Araçlarını F12 tuşuna basarak açın.

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

6
Bu benim durumumda "tanımsız" sorunları.
acme

6
Mister Lucky'nin belirttiği gibi: "console.log yalnızca Geliştirici Araçlarını açtıktan sonra kullanılabilir (F12'yi açmak ve kapatmak için)."
Susturucu

0

Ben bu yöntemi seviyorum (jquery 's doc hazır kullanarak) ... yani bile konsol kullanmanıza izin verir ... sadece yakalamak sayfa yüklendikten sonra ie'nın dev araçlarını açarsanız sayfayı yeniden yüklemeniz gerekir ...

tüm fonksiyonları hesaba katarak daha ince olabilir, ama sadece log kullanıyorum bu yüzden yaptığım bu.

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

0

Burada, geliştirici araçları açıkken konsola oturum açacak, kapalı olduklarında oturum açmayacak bir sürüm var.

(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)

Kapsamlı olması iyi, IE8 DevTools kod yürütmenin ortasında açık olduğunda, ancak IE8'de çalışmadığında durumu destekleyebilir, console.log bir nesnedir, bu nedenle herhangi bir applyyöntemi yoktur .
Nishi

0

Html içinde kendi konsolunuzu yapın .... ;-) Bu itiraz edilebilir, ancak ile başlayabilirsiniz:

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);
        }
    };
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.