有没有办法在JavaScript中监听控制台事件?

Mil*_*ric 16 javascript browser cross-browser dom-events

我正在尝试在javascript中为未捕获的异常和浏览器警告编写处理程序.应将所有错误和警告发送到服务器以供日后查看.

可以捕获处理的异常并轻松记录

console.error("Error: ...");
Run Code Online (Sandbox Code Playgroud)

要么

console.warn("Warning: ...");
Run Code Online (Sandbox Code Playgroud)

因此,如果从javascript代码调用它们就不会有问题,甚至更多,未处理的异常可以通过这种代码安静来捕获:

window.onerror = function(){
    // add to errors Stack trace etc.
   });
}
Run Code Online (Sandbox Code Playgroud)

因此异常被覆盖,但我一直坚持浏览器发送到控制台的警告.例如安全性或html验证警告.以下示例来自Google Chrome控制台

https://domainname.com/上的页面从http://domainname.com/javascripts/codex/MANIFEST.js运行了不安全的内容 .

如果有像window.onerror这样的事件但是警告会很棒.有什么想法吗?

小智 16

你可以console自己包装方法.例如,要在数组中记录每个调用:

var logOfConsole = [];

var _log = console.log,
    _warn = console.warn,
    _error = console.error;

console.log = function() {
    logOfConsole.push({method: 'log', arguments: arguments});
    return _log.apply(console, arguments);
};

console.warn = function() {
    logOfConsole.push({method: 'warn', arguments: arguments});
    return _warn.apply(console, arguments);
};

console.error = function() {
    logOfConsole.push({method: 'error', arguments: arguments});
    return _error.apply(console, arguments);
};
Run Code Online (Sandbox Code Playgroud)

  • 我正在考虑这个,但它不能满足我的一些期望,例如,当所有内容加载到安全页面时,我会在加载一些不安全的内容时收到大量警告,而这些内容来自浏览器,而不是javascript代码.此外,我想覆盖愚蠢的IE(这就是我想到的原因)和控制台在那里未定义.无论如何你得到了我的投票:) (2认同)

Ina*_*mus 7

更多Succint方式:

// this method will proxy your custom method with the original one
function proxy(context, method, message) { 
  return function() {
    method.apply(context, [message].concat(Array.prototype.slice.apply(arguments)))
  }
}

// let's do the actual proxying over originals
console.log = proxy(console, console.log, 'Log:')
console.error = proxy(console, console.error, 'Error:')
console.warn = proxy(console, console.warn, 'Warning:')

// let's test
console.log('im from console.log', 1, 2, 3);
console.error('im from console.error', 1, 2, 3);
console.warn('im from console.warn', 1, 2, 3);
Run Code Online (Sandbox Code Playgroud)


Lud*_*ltz 7

我知道这是一篇旧帖子,但无论如何它都会很有用,因为其他解决方案与旧浏览器不兼容。

您可以像这样重新定义控制台(以及所有浏览器)的每个功能的行为:

// define a new console
var console = (function(oldCons){
    return {
        log: function(text){
            oldCons.log(text);
            // Your code
        },
        info: function (text) {
            oldCons.info(text);
            // Your code
        },
        warn: function (text) {
            oldCons.warn(text);
            // Your code
        },
        error: function (text) {
            oldCons.error(text);
            // Your code
        }
    };
}(window.console));

//Then redefine the old console
window.console = console;
Run Code Online (Sandbox Code Playgroud)