IE9 console.log'u destekliyor mu ve gerçek bir işlev mi?


209

window.console.logInternet Explorer 9'da hangi durumlarda tanımlanır?

Zaman window.console.logtanımlanmış window.console.log.applyve tanımlanmamış olsa bile window.console.log.call. Bu neden?

[IE8 için ilgili soru: IE8'deki console.log'a ne oldu? .]


3
IE8-9 konsol nesnesinin / fonksiyonunun incelikleri hakkındaki bu harika gönderiye göz atın: whattheheadsaid.com/2011/04/…
Marc Climent


@MarcCliment bağlantı öldü
chakeda

@chakeda Bu olduğunda nefret ediyorum, web arşivinden bağlantı var: web.archive.org/web/20140625085155/http://whattheheadsaid.com/…
Marc Climent

Yanıtlar:


299

Internet Explorer 9'da (ve 8), consolenesne yalnızca belirli bir sekme için geliştirici araçları açıldığında ortaya çıkar. Bu sekme için geliştirici araçları penceresini gizlerseniz, consolenesne , gittiğiniz her sayfa için açıkta kalır. Yeni bir sekme açarsanız, consolenesnenin gösterilmesi için o sekme için geliştirici araçlarını da açmanız gerekir .

consoleNesne herhangi bir standart bir parçası değildir ve belge nesne modeli bir uzantısıdır. Diğer DOM nesneleri gibi, ana bilgisayar nesnesi olarak kabul edilir ve yerel ECMAScript işlevleri ve nesnelerinin yaptığı gibi devralınması Objectveya yöntemlerinden devralınması Functiongerekmez. Nedeni budur applyve callbu yöntemlerde tanımlanmamıştır. IE 9'da, çoğu DOM nesnesi yerel ECMAScript türlerinden devralmak üzere geliştirildi. Geliştirici araçları IE için bir uzantı olarak kabul edildiğinden (yerleşik bir uzantı olsa da), DOM'un geri kalanıyla aynı geliştirmeleri açıkça almadılar.

Değeri için, biraz sihirle yöntemlerde bazı Function.prototypeyöntemleri kullanabilirsiniz :consolebind()

var log = Function.prototype.bind.call(console.log, console);
log.apply(console, ["this", "is", "a", "test"]);
//-> "thisisatest"

2
Aynı şey Firebug'un consolenesnesi için de geçerlidir .
Marcel Korpel

150
Gururla söyleyebilirim, web için geliştirdiğim uzun yıllar boyunca console.log'un tüm büyük tarayıcılar tarafından desteklendiğini varsaydım. Sadece IE9'un senaryomu neden sevmediğini öğrenmek için bir gün geçirdim ve şimdi nedenini biliyorum - ilk adımda bir console.log vardı. Hata ayıklama imkansızdır, çünkü hata ayıklama modunu çevirmek bu hatayı anında ortadan kaldırır: P Açıklama için teşekkürler !!
f055

2
Dün aynı sorunu yaşadık. Yükleme DebugBar o konsol nesnesi tanımlamak olmadığından beni quicklier yardımcı oldu. IE konsolu sakladım ama DebugBar değil, bu yüzden bir JavaScript hatası (konsol tanımlı değil) olduğunu ikincisinden bir mesaj aldım.
Simon A. Eugster

sorun IE'de ilk kez geldiğinde hata günlüğünü kontrol etmeliydin @ f055
Şanslı Ali

7
Internet Seçenekleri -> Gelişmiş -> Her komut dosyası hatası hakkında bir bildirim görüntüler. Web geliştiricileri bunu IE'de her zaman işaretli bırakmalıdır. Bu size konsol hakkında bilgi verirdi veya günlük fonksiyonu tanımsızdır ... mesajı tam olarak hatırlayamaz.
Seth Flowers

166

Bu console.log sorununa basit bir çözüm, JS kodunuzun başında aşağıdakileri tanımlamaktır:

if (!window.console) window.console = {};
if (!window.console.log) window.console.log = function () { };

Bu, tüm tarayıcılarda benim için çalışıyor. Bu, hata ayıklayıcı etkin olmadığında console.log için kukla bir işlev oluşturur. Hata ayıklayıcı etkin olduğunda, console.log yöntemi tanımlanır ve normal şekilde yürütülür.


8
Daha fazla bilgi ve daha sağlam konsol değiştirmeleri (diğer konsol yöntemleri dahil): stackoverflow.com/questions/8002116/…
Zach Lysobey

@ZachL: Hangileri tam olarak betonda?
hakre

Cevabımın bir yaklaşımı var: stackoverflow.com/a/15771110/363701 . Ayrıca şunu da kontrol edin: github.com/paulmillr/console-polyfill/blob/master/index.js
Zach Lysobey

13

Bunun çok eski bir soru olduğunu biliyorum, ancak bunun konsol sorunuyla nasıl başa çıkılacağına değerli bir alternatif eklediğini hissediyorum. Konsola herhangi bir çağrıdan önce aşağıdaki kodu yerleştirin. * (Böylece ilk komut dosyanız).

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

Referans:
https://github.com/h5bp/html5-boilerplate/blob/v5.0.0/dist/js/plugins.js


10

console.log yalnızca konsol açıkken tanımlanır. Kodunuzda kontrol etmek isterseniz, window özelliği içinde kontrol ettiğinizden emin olun.

if (window.console)
    console.log(msg)

bu IE9'da bir istisna atar ve düzgün çalışmaz. Bunu yapma

if (console) 
    console.log(msg)

6

Marc Cliament'in yukarıdaki yorumundaki makaleyi okuduktan sonra, şimdi çok amaçlı çapraz tarayıcı console.log işlevimi şöyle görünecek şekilde değiştirdim:

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
SadeceFunction.prototype.apply.call(console.log, console, arguments);
Victor

@Victor kesinlikle kabul edilen tek cevap olmalı!
Pavel Frankov

0

Windows'un tüm sürümlerinde kapalı olan geliştirici araçlarıyla console.log kullanırsanız IE9'un hatayı yükseltmediğini belirtmek isterim. XP'de öyle, ancak Windows 7'de değil. Bu nedenle, genel olarak WinXP desteğini düşürdüyseniz, console.log'u doğrudan kullanabilirsiniz.


-1

Peki ya ...

console = { log : function(text) { alert(text); } }

1
Bu, bazı durumlarda geçilebilir bir geçici çözüm olabilir, ancak soruyu gerçekten ele almadınız.
21'de pswg
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.