How do I print debug messages in the Google Chrome JavaScript Console?
如何在Google Chrome JavaScript控制台中打印调试消息?
请注意,javascript控制台与javascript调试器不同;它们的afaik语法不同,因此javascript调试器中的print命令在这里不起作用。在javascript控制台中,
从浏览器地址栏执行以下代码:
1 | javascript: console.log(2); |
成功地将消息打印到Google Chrome中的"javascript控制台"。
改进了andru的想法,您可以编写一个脚本,如果控制台函数不存在,则可以创建这些函数:
1 2 3 4 5 | if (!window.console) console = {}; console.log = console.log || function(){}; console.warn = console.warn || function(){}; console.error = console.error || function(){}; console.info = console.info || function(){}; |
然后,使用以下任何一种方法:
1 2 3 4 | console.log(...); console.error(...); console.info(...); console.warn(...); |
这些功能将记录不同类型的项目(可以根据日志、信息、错误或警告进行筛选),并且在控制台不可用时不会导致错误。这些功能将在Firebug和Chrome控制台中工作。
只需添加一个很酷的特性,很多开发人员都会错过:
1 | console.log("this is %o, event is %o, host is %s", this, e, location.host); |
这是一个神奇的
这也很酷:
1 | console.log("%s", new Error().stack); |
它给出了一个类似Java的堆栈跟踪到EDCOX1调用2调用的点(包括路径到文件和行号!).
对于firefox中的堆栈跟踪,也可以使用:
1 | console.trace(); |
正如https://developer.mozilla.org/en-us/docs/web/api/console所说。
快乐黑客!
更新:有些库是由坏人编写的,他们为自己的目的重新定义了
1 2 3 | delete console.log; delete console.warn; .... |
请参阅堆栈溢出问题还原console.log()。
下面是一个简短的脚本,用于检查控制台是否可用。如果没有,它将尝试加载Firebug,如果Firebug不可用,它将加载Firebug Lite。现在您可以在任何浏览器中使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | if (!window['console']) { // Enable console if (window['loadFirebugConsole']) { window.loadFirebugConsole(); } else { // No console, use Firebug Lite var firebugLite = function(F, i, r, e, b, u, g, L, I, T, E) { if (F.getElementById(b)) return; E = F[i+'NS']&&F.documentElement.namespaceURI; E = E ? F[i + 'NS'](E, 'script') : F[i]('script'); E[r]('id', b); E[r]('src', I + g + T); E[r](b, u); (F[e]('head')[0] || F[e]('body')[0]).appendChild(E); E = new Image; E[r]('src', I + L); }; firebugLite( document, 'createElement', 'setAttribute', 'getElementsByTagName', 'FirebugLite', '4', 'firebug-lite.js', 'releases/lite/latest/skin/xp/sprite.png', 'https://getfirebug.com/', '#startOpened'); } } else { // Console is already available, no action needed. } |
只是一个快速警告-如果您想在Internet Explorer中测试而不删除所有console.log(),则需要使用Firebug Lite,否则会出现一些不太友好的错误。
(或者创建自己的console.log(),它只返回false。)
除了德拉恩·阿扎巴尼的回答之外,我喜欢分享我的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | // Create a noop console object if the browser doesn't provide one... if (!window.console){ window.console = {}; } // Internet Explorer has a console that has a 'log' function, but no 'debug'. To make console.debug work in Internet Explorer, // We just map the function (extend for info, etc. if needed) else { if (!window.console.debug && typeof window.console.log !== 'undefined') { window.console.debug = window.console.log; } } // ... and create all functions we expect the console to have (taken from Firebug). var names = ["log","debug","info","warn","error","assert","dir","dirxml", "group","groupEnd","time","timeEnd","count","trace","profile","profileEnd"]; for (var i = 0; i < names.length; ++i){ if(!window.console[names[i]]){ window.console[names[i]] = function() {}; } } |
或使用此功能:
1 2 3 4 5 | function log(message){ if (typeof console =="object") { console.log(message); } } |
这是我的控制台包装类。它给了我范围输出,也使生活更容易。注意使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | localConsole = { info: function(caller, msg, args) { if ( window.console && window.console.info ) { var params = [(this.className) ? this.className : this.toString() + '.' + caller + '(), ' + msg]; if (args) { params = params.concat(args); } console.info.apply(console, params); } }, debug: function(caller, msg, args) { if ( window.console && window.console.debug ) { var params = [(this.className) ? this.className : this.toString() + '.' + caller + '(), ' + msg]; if (args) { params = params.concat(args); } console.debug.apply(console, params); } } }; someClass = { toString: function(){ return 'In scope of someClass'; }, someFunc: function() { myObj = { dr: 'zeus', cat: 'hat' }; localConsole.debug.call(this, 'someFunc', 'myObj: ', myObj); } }; someClass.someFunc(); |
这在Firebug中提供了类似的输出:
1 | In scope of someClass.someFunc(), myObj: Object { dr="zeus", more...} |
或铬:
1 2 3 4 5 | In scope of someClass.someFunc(), obj: Object cat:"hat" dr:"zeus" __proto__: Object |
我个人使用这个,类似于tarek11011:
1 2 3 4 5 6 7 8 9 10 11 | // Use a less-common namespace than just 'log' function myLog(msg) { // Attempt to send a message to the console try { console.log(msg); } // Fail gracefully if it does not exist catch(e){} } |
主要的一点是,最好至少有一些日志记录的实践,而不仅仅是将
我对开发人员签入控制台()语句有很多问题。而且,我真的不喜欢调试Internet Explorer,尽管Internet Explorer 10和Visual Studio 2012等的改进非常出色。
所以,我重写了控制台对象本身…我添加了一个本地主机标志,它只允许在本地主机上使用console语句。我还向Internet Explorer添加了console()函数(改为显示alert())。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 | // Console extensions... (function() { var __localhost = (document.location.host ==="localhost"), __allow_examine = true; if (!console) { console = {}; } console.__log = console.log; console.log = function() { if (__localhost) { if (typeof console !=="undefined" && typeof console.__log ==="function") { console.__log(arguments); } else { var i, msg =""; for (i = 0; i < arguments.length; ++i) { msg += arguments[i] +" "; } alert(msg); } } }; console.__info = console.info; console.info = function() { if (__localhost) { if (typeof console !=="undefined" && typeof console.__info ==="function") { console.__info(arguments); } else { var i, msg =""; for (i = 0; i < arguments.length; ++i) { msg += arguments[i] +" "; } alert(msg); } } }; console.__warn = console.warn; console.warn = function() { if (__localhost) { if (typeof console !=="undefined" && typeof console.__warn ==="function") { console.__warn(arguments); } else { var i, msg =""; for (i = 0; i < arguments.length; ++i) { msg += arguments[i] +" "; } alert(msg); } } }; console.__error = console.error; console.error = function() { if (__localhost) { if (typeof console !=="undefined" && typeof console.__error ==="function") { console.__error(arguments); } else { var i, msg =""; for (i = 0; i < arguments.length; ++i) { msg += arguments[i] +" "; } alert(msg); } } }; console.__group = console.group; console.group = function() { if (__localhost) { if (typeof console !=="undefined" && typeof console.__group ==="function") { console.__group(arguments); } else { var i, msg =""; for (i = 0; i < arguments.length; ++i) { msg += arguments[i] +" "; } alert("group: " + msg +"{"); } } }; console.__groupEnd = console.groupEnd; console.groupEnd = function() { if (__localhost) { if (typeof console !=="undefined" && typeof console.__groupEnd ==="function") { console.__groupEnd(arguments); } else { var i, msg =""; for (i = 0; i < arguments.length; ++i) { msg += arguments[i] +" "; } alert(msg +" }"); } } }; /// <summary> /// Clever way to leave hundreds of debug output messages in the code, /// but not see _everything_ when you only want to see _some_ of the /// debugging messages. /// </summary> /// <remarks> /// To enable __examine_() statements for sections/groups of code, type the /// following in your browser's console: /// top.__examine_ABC = true; /// This will enable only the console.examine("ABC", ... ) statements /// in the code. /// </remarks> console.examine = function() { if (!__allow_examine) { return; } if (arguments.length > 0) { var obj = top["__examine_" + arguments[0]]; if (obj && obj === true) { console.log(arguments.splice(0, 1)); } } }; })(); |
实例使用:
1 | console.log("hello"); |
铬/火狐:
1 | prints hello in the console window. |
Internet Explorer:
1 | displays an alert with 'hello'. |
对于仔细观察代码的人,您将发现console.examine()函数。我在几年前创建了这个代码,这样我就可以在产品的某些方面保留调试代码,以帮助解决QA/客户问题。例如,我将在一些已发布的代码中留下以下行:
1 2 3 4 5 | function doSomething(arg1) { // ... console.examine("someLabel", arg1); // ... } |
然后从发布的产品中,在控制台(或以"javascript:"为前缀的地址栏)中键入以下内容:
1 | top.__examine_someLabel = true; |
然后,我将看到所有记录的console.examine()语句。这是一个非常好的帮助很多次。
你可以使用
简单的Internet Explorer 7及以下填充程序,可保留其他浏览器的行号:
1 2 3 4 5 6 7 8 9 | /* Console shim */ (function () { var f = function () {}; if (!window.console) { window.console = { log:f, info:f, warn:f, debug:f, error:f }; } }()); |
1 | console.debug(""); |
使用此方法在控制台中以亮蓝色打印文本。
进一步改进了delan和andru的想法(这就是为什么这个答案是一个编辑版本);console.log可能存在,而其他功能可能不存在,因此将默认映射到console.log的相同功能….
如果控制台函数不存在,则可以编写创建这些函数的脚本:
1 2 3 4 5 | if (!window.console) console = {}; console.log = console.log || function(){}; console.warn = console.warn || console.log; // defaults to log console.error = console.error || console.log; // defaults to log console.info = console.info || console.log; // defaults to log |
然后,使用以下任何一种方法:
1 2 3 4 | console.log(...); console.error(...); console.info(...); console.warn(...); |
这些功能将记录不同类型的项目(可以根据日志、信息、错误或警告进行筛选),并且在控制台不可用时不会导致错误。这些功能将在Firebug和Chrome控制台中工作。