【问题标题】:Subscribe on console events in a browser在浏览器中订阅控制台事件
【发布时间】:2016-01-26 22:35:00
【问题描述】:

有没有办法从页面上的 javascript 订阅某些控制台事件?

用例:我想看到任何 js 错误的警报窗口

类似:

console.on('error', => alert('There is an error! Look in console window'))
console.on('log', => alert('Something log to console'))

注意:我不问捕获异常。

【问题讨论】:

  • 可能重复。请参考Global JS Exception Handler
  • 不,它不是重复的
  • 没有这样的东西,至少在 chrome 控制台上。 developer.chrome.com/devtools/docs/console-api
  • 对于后者,只需将 console.log 重新定义为您自己的函数(然后将其应用于已保存的对原始引用的引用)对于错误,如果出现停止脚本的错误,则使用脚本更难处理执行...
  • 您可以尝试关注StackOverflow Article。显示的一种方法是覆盖 console.log 本身。但我不知道这是正确的方法。

标签: javascript browser


【解决方案1】:

按照link in my previous comment 上的说明,我创建了一个JSFiddle - Override Console methods

我仍然不知道这是否是最好的方法,但这似乎可行。

编辑

经过讨论,我明白,问题不仅在于捕获所有控制台消息,还在于捕获任何未处理的错误。在我的理解中,唯一的实现方法是添加一个全局异常处理程序

window.onerror = function(error){
    // do your stuff
}

下面是Updated JSFiddle。我还更新了代码 sn-p 以显示相同的内容。

代码

var error = window.console.error,
	log = console.log,
    info = console.info,
    warn = console.warn;
var lastLog = "", 
    lastError="",
    lastInfo="",
    lastWarn="";

function overrideConsole(){
    console.error = function () {
        lastError = arguments;
        //alert(lastError);
        print(lastError, "error")
        error.apply(console, arguments);
    };
    
    console.log = function () {
        lastLog = arguments;
        print(lastLog, "log");
        log.apply(console, arguments);
    };
    
    console.info = function () {
        lastInfo = arguments;
        print(lastInfo, "info");
        info.apply(console, arguments);
    };
    
    console.warn = function () {
        lastWarn = arguments;
        print(lastWarn, "warn");
        warn.apply(console, arguments);
    };
}

function registerEvents(){
	$("#btnError").on("click", function(){
    	console.error("new error");
    });
    
    $("#btnLog").on("click", function(){
    	console.log("new log");
    });
    
    $("#btnInfo").on("click", function(){
    	console.info("new info");
    });
    
    $("#btnWarn").on("click", function(){
    	console.warn("new warn");
    });
    
    $("#btnException").on("click", function(){
    	throw new Error();
    });
}

function registerGlobalHandler(){
	window.onerror = function(error) {
    	console.error(error);
	};
}

function print(str, type){
    var msgClass= "";
    
    switch(type){
        case "log": msgClass=" log"; break;
        case "error": msgClass=" error"; break;
        case "info": msgClass=" info"; break;
        case "warn": msgClass=" warn"; break;
    }
	var div = "<div class='cell'>"+
        	"<label class='"+msgClass+"'>"+ str[0]+"</label>" +
        "</div>"
    $(".content").html( div + $(".content").html());
}

(function init(){
	registerEvents();
    registerGlobalHandler();
    overrideConsole();
  
    // Undefined function call
    test();
})();
.cell{
    width:90%;
    position:relative;
    padding:5px;
    background: #eee;
}

.info{
    color:blue;
}
.error{
    color:red;
}
.warn{
    color:green;
}
.log{
    color:black;
}
.content{
    width:90%;
    height:300%;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<button id="btnError">Error</button>
<button id="btnLog">Log</button>
<button id="btnInfo">Info</button>
<button id="btnWarn">Warn</button>
<button id="btnException">Exception</button>

<div class="content"></div>

【讨论】:

  • 我的意思是一个真正的错误(而不是错误信息)。尝试评估页面上的某处:``` var a = {};好玩儿(); ```你看到什么错误了吗?
  • 据我了解,通过console 记录的任何内容都将被捕获。您提到的情况不会被捕获,因为它是未处理的异常。 Updated JSFiddle 相同。对于这种情况,您将不得不处理它们。这就是全局异常处理程序发挥作用的地方。我也想这可能会有所帮助。 MDN JS Shell.
【解决方案2】:

正如已经指出的那样,没有全局方式(据我所知)订阅控制台事件。日志记录的部分解决方案是按照@Rajesh 的回答所述覆盖控制台。

对于错误检查,如果您拥有要检查错误的代码,则可以将整个内容包装在全局 try/catch 中。

try {

  (function() {
    function failingCode() {
      var a;
      return a.foo + 1;

    }

    failingCode();
  })();

}
catch (err) {
  alert('error');
  throw err;
}

对于第三方脚本,除了通过jQuery's getScript 之类的机制加载脚本之外,我想不出任何处理方法。而且我不清楚如果该脚本本身加载其他脚本会发生什么。

【讨论】:

    猜你喜欢
    • 2011-03-30
    • 1970-01-01
    • 1970-01-01
    • 2016-07-18
    • 1970-01-01
    • 2018-01-31
    • 2013-01-25
    • 1970-01-01
    • 2021-02-22
    相关资源
    最近更新 更多