जवाबों:
कमबैक के लिए यह बेहतर है:
var alertFallback = true;
if (typeof console === "undefined" || typeof console.log === "undefined") {
console = {};
if (alertFallback) {
console.log = function(msg) {
alert(msg);
};
} else {
console.log = function() {};
}
}
आपके द्वारा डेवलपर टूल (F12 को खोलने और बंद करने के लिए टॉगल करने के बाद) कंसोल केवल उपलब्ध है। मजेदार बात यह है कि इसे खोलने के बाद, आप इसे बंद कर सकते हैं, फिर भी इसे कंसोल.लॉग कॉल के माध्यम से पोस्ट कर सकते हैं, और जब आप इसे फिर से खोलेंगे तो वे दिखाई देंगे। मैं सोच रहा हूं कि यह एक प्रकार का बग है, और इसे ठीक किया जा सकता है, लेकिन हम देखेंगे।
मैं शायद कुछ इस तरह का उपयोग करूँगा:
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) }
}
alert
बुराई है। जब अलर्ट का उपयोग किया जाता है तो कुछ कोड अलग तरीके से व्यवहार करते हैं क्योंकि दस्तावेज़ फ़ोकस खो देता है, जिससे बग का निदान करना या उन्हें बनाना मुश्किल हो जाता है जहाँ पहले नहीं थे। इसके अलावा, यदि आप गलती console.log
से अपने उत्पादन कोड में छोड़ देते हैं , तो यह सौम्य है (यह मानते हुए कि यह उड़ा नहीं है) - बस चुपचाप कंसोल पर लॉग करता है। यदि आप गलती alert
से अपने उत्पादन कोड में छोड़ देते हैं , तो उपयोगकर्ता अनुभव बर्बाद हो जाता है।
यह विभिन्न उत्तरों पर मेरी राय है। मैं वास्तव में लॉग किए गए संदेशों को देखना चाहता था, भले ही मुझे IE कंसोल खुला नहीं था जब उन्हें निकाल दिया गया था, इसलिए मैं उन्हें एक console.messages
सरणी में धक्का देता हूं जो मैं बनाता हूं। मैंने console.dump()
पूरे लॉग को देखने की सुविधा के लिए एक फ़ंक्शन भी जोड़ा । console.clear()
संदेश कतार को खाली कर देगा।
यह समाधान अन्य कंसोल विधियों को भी "हैंडल" करता है (जो मुझे लगता है कि सभी फायरबग कंसोल एपीआई से उत्पन्न हुए हैं )
अंत में, यह समाधान एक IIFE के रूप में है , इसलिए यह वैश्विक दायरे को प्रदूषित नहीं करता है। फ़ॉलबैक फ़ंक्शन तर्क कोड के निचले भाग में परिभाषित किया गया है।
मैं इसे अपने मास्टर जेएस फ़ाइल में छोड़ता हूं जो हर पृष्ठ पर शामिल है, और इसके बारे में भूल जाओ।
(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()
एपीआई कार्यों में से किसी के लिए एक डिफ़ॉल्ट हैंडलर है। मैं तर्कों को पास करता हूं message
ताकि आपको उन तर्कों का एक लॉग मिले जो किसी भी एपीआई कॉल (बस नहीं console.log
) में पारित किए गए थे ।
मैंने एक अतिरिक्त सरणी जोड़ी जो console.raw
तर्कों को ठीक उसी तरह से जोड़ देती है जैसा कि पारित किया गया है trap()
। मैंने महसूस किया कि args.join(' ')
वस्तुओं को स्ट्रिंग में परिवर्तित कर रहा था "[object Object]"
जो कभी-कभी अवांछनीय हो सकता है। सुझाव के लिए धन्यवाद bfontaine ।
trap
कार्य का उद्देश्य क्या है var args = Array.prototype.slice.call(arguments); var message = args.join(' ');
:? आप इस संदेश के माध्यम से तर्क क्यों पारित करते हैं?
यह ध्यान देने योग्य है कि console.log
IE8 में एक सही जावास्क्रिप्ट फ़ंक्शन नहीं है। यह apply
या call
विधियों का समर्थन नहीं करता है ।
console.log=Function.prototype.bind.call(console.log,console);
इस के आसपास पाने के लिए।
bind
।
यह मानते हुए कि आप अलर्ट के प्रति कमबैक की परवाह नहीं करते हैं, यहां इंटरनेट एक्सप्लोरर की कमियों को हल करने का एक और अधिक संक्षिप्त तरीका है:
var console=console||{"log":function(){}};
मुझे वास्तव में "ऑरेंज 80" द्वारा पोस्ट किया गया दृष्टिकोण पसंद है। यह सुरुचिपूर्ण है क्योंकि आप इसे एक बार सेट कर सकते हैं और इसे भूल सकते हैं।
अन्य तरीकों से आपको कुछ अलग करने की आवश्यकता होती है ( console.log()
हर बार सादे के अलावा कुछ और कॉल करें ), जो सिर्फ परेशानी पूछ रहा है ... मुझे पता है कि मैं अंततः भूल जाऊंगा।
एक उपयोगिता फ़ंक्शन में कोड को लपेटकर मैंने इसे एक कदम आगे बढ़ाया है, जिसे आप अपनी जावास्क्रिप्ट की शुरुआत में एक बार कॉल कर सकते हैं, कहीं भी किसी भी लॉगिंग से पहले। (मैं इसे अपनी कंपनी के इवेंट डेटा राउटर उत्पाद में स्थापित कर रहा हूं। यह इसके नए व्यवस्थापक इंटरफ़ेस के क्रॉस-ब्राउज़र डिज़ाइन को सरल बनाने में मदद करेगा।)
/**
* 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("...");
वह एक खाली टिप्पणी के साथ कोड का उपसर्ग है, इसलिए अस्थायी कोड को खोजना और उसका पता लगाना आसान है।
यदि आपको अपने सभी कंसोल.लॉग कॉल के लिए "अपरिभाषित" मिलता है, तो संभवतः इसका मतलब है कि आपके पास अभी भी एक पुराना फायरबगलाइट लोड (फ़ायरबग.जेएस) है। यह IE8 के सभी मान्य कार्यों को ओवरराइड करेगा। हालांकि वे मौजूद हैं। वैसे भी मेरे साथ ऐसा ही हुआ है।
कंसोल ऑब्जेक्ट को ओवरराइड करने वाले अन्य कोड की जाँच करें।
किसी भी ब्राउज़र में कंसोल की कमी का सबसे अच्छा समाधान है:
// 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;
}
}
}());
बहुत सारे जवाब हैं। इसके लिए मेरा समाधान था:
globalNamespace.globalArray = new Array();
if (typeof console === "undefined" || typeof console.log === "undefined") {
console = {};
console.log = function(message) {globalNamespace.globalArray.push(message)};
}
संक्षेप में, यदि कंसोल.लॉग मौजूद नहीं है (या इस मामले में, खोला नहीं गया है) तो लॉग को एक वैश्विक नामस्थान सरणी में संग्रहीत करें। इस तरह, आप लाखों अलर्ट के साथ परेशान नहीं होते हैं और आप अभी भी डेवलपर लॉग को खोलने या बंद करने के साथ अपने लॉग देख सकते हैं।
अगर (window.console && 'फ़ंक्शन' === टाइपोफ़ window.console.log) { window.console.log (ओ); }
window.console.log()
IE8 में उपलब्ध हो सकता है जब console.log()
भी नहीं है?
typeof window.console.log === "object"
, नहीं"function"
मुझे यह गितुब पर मिला :
// 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 = {});
}
} ());
मैं ऊपर से वाल्टर के दृष्टिकोण का उपयोग कर रहा हूं (देखें: https://stackoverflow.com/a/14246240/3076102 )
मैं एक समाधान में मिलाता हूं जो मैंने यहां पाया https://stackoverflow.com/a/7967670 ऑब्जेक्ट्स को ठीक से दिखाने के लिए।
इसका मतलब है कि ट्रैप फ़ंक्शन बन गया है:
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 />'));
}
}
}
मुझे आशा है कि यह मददगार है:-)
यह IE8 में काम करता है। IE8 के डेवलपर टूल को F12 मारकर खोलें।
>>console.log('test')
LOG: test
मुझे यह तरीका पसंद है (jquery के doc तैयार का उपयोग करके) ... यह आपको कंसोल का उपयोग करने में भी मदद करता है ... केवल पकड़ यह है कि यदि आप पृष्ठ लोड होने के बाद यानी देव के उपकरण खोलते हैं तो आपको पृष्ठ को फिर से लोड करना होगा ...
यह सभी कार्यों के लिए लेखांकन द्वारा चालाक हो सकता है, लेकिन मैं केवल लॉग का उपयोग करता हूं इसलिए यह वही है जो मैं करता हूं।
//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
}})();
}
});
यहां एक संस्करण है जो डेवलपर टूल के खुलने पर कंसोल में लॉग इन करेगा और बंद होने पर नहीं।
(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
विधि नहीं है।
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);
}
};
}
console.log
है IE8 में वहाँ है, लेकिनconsole
वस्तु जब तक आप खुले DevTools नहीं बनाया गया है। इसलिए, एक कॉलconsole.log
में त्रुटि हो सकती है, उदाहरण के लिए यदि यह पृष्ठ लोड पर होता है इससे पहले कि आपके पास देव उपकरण खोलने का मौका हो। यहां जीतने वाला जवाब इसे और अधिक विस्तार से बताता है।