2012-12-01 29 views
2

Mozilla开发者网络page对浏览器提供的Javascript console对象说:“Note: At least in Firefox, if a page defines a console object, that object overrides the one built into Firefox.”。有什么方法可以覆盖这个对象,但仍然与浏览器的Web Console交互?创建一个自定义的“控制台”对象与浏览器中的Web控制台交互以进行自定义调试器

一个用例是拦截console.log()调用并执行额外的操作或采用不同的参数(例如日志分类),同时保留使用Firebug或Google Chrome Inspect Element等工具登录到控制台时提供的行号/文件信息。最匹配的答案,我能找到的是:Intercepting web browser console messages,但它并没有深入到通过自定义控制台对象与Web控制台交互,并使用类似

debug.log = function(string, logLevel) { 
    checkLogLevel(logLevel); // return false if environment log setting is below logLevel 
    var changedString = manipulate(string); 
    console.log(changedString); 
} 

一个自定义的调试服务不保留线函数的号码/文件源调用debug.log()。一种选择是用console.trace()做一些事情,然后爬上追踪堆栈的一层,但我很好奇首先扩展console.log()。我还想找到一个可以与Firebug等现有Web控制台/工具配合使用的解决方案,而不是创建自定义浏览器扩展或Firebug插件,但如果有人知道现有的解决方案,我会对他们感兴趣。

显然是这样的:

console = { 
     log: function (string) { 
      console.log('hey!'); 
     } 
    } 
    console.log('hey!'); 

将无法​​正常工作,并在无限递归的结果。

+0

http://tobyho.com/2012/07/27/taking-over-console-log/ –

回答

3

这很容易,只是被覆盖以前保存的(原)控制台参考:

var originalConsole = window.console; 
console = { 
    log: function(message) { 
     originalConsole.log(message); 
     // do whatever custom thing you want 
    } 
} 
+1

当然!这太漂亮了。不幸的是,它最终与定义自定义调试服务相同,因为报告的行号/文件仍然是单根rootConsole.log(消息)的行号/文件。调用,而不是调用者的行号,如console.log();.我正在寻找一些方式与console.log()进行交互,尽管它可能不存在。 –

+0

请查看http://getfirebug.com/wiki/index.php/Console_API。该链接专门针对Firebug,但它应该给你一个关于使用控制台对象时什么是不可能的体面概念。 – machineghost