Yanıtlar:
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() {};
}
}
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) }
}
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.
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.messages
oluş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)
Ç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 message
herhangi API çağrısı (sadece geçirildi argümanlar bir günlük olsun ki console.log
).
console.raw
Bağı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 .
trap
fonksiyonu: var args = Array.prototype.slice.call(arguments); var message = args.join(' ');
? Neden bu argümanları mesaja iletiyorsun?
console.log
IE8'de gerçek bir Javascript işlevi olmadığını belirtmek gerekir . apply
Veya call
yöntemlerini desteklemez .
console.log=Function.prototype.bind.call(console.log,console);
için kullanıyorum .
bind
.
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(){}};
"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() {}; }
}
}
/**/console.log("...");
bu nedenle geçici kodu aramak ve bulmak kolaydır.
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.
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;
}
}
}());
Ç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.
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 ?
typeof window.console.log === "object"
, değil"function"
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 = {});
}
} ());
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,' ');
}
}
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 :-)
IE8'de çalışır. IE8'in Geliştirici Araçlarını F12 tuşuna basarak açın.
>>console.log('test')
LOG: test
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
}})();
}
});
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)
apply
yöntemi yoktur .
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);
}
};
}
console.log
olduğunu IE8 orada, amaconsole
nesne 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.