我目前正在开发一个Web应用程序,我有一个JS日志记录机制,处理未被页面内的js代码捕获的Javascript错误.我使用window.onerror来捕获所有这些错误并将其他地方记录在哪里.
但问题是Opera没有window.onerror事件.我能想到的一种方法是,对所有js函数进行字符串处理,然后在body加载后在这些函数中插入try catch块.但它在许多情况下不起作用,但是,它至少在某种程度上起作用.
我确信这种方法很糟糕,但是,我想不出更好的方法.请指教.
更新:现在,我正在调用下面的代码尽可能多地捕获错误.
function OnBodyLoad()
{
var allElements = document.getElementsByTagName("*");
for(var cnt = 0;cnt < allElements.length;cnt++)
{
RegisterAllEvents(allElements[cnt]);
}
}
function RegisterAllEvents(objToProcess){
for(var cnt = 0;cnt < objToProcess.attributes.length;cnt++){
if(IsAttributeAnEvent(objToProcess.attributes[cnt].name))
{
objToProcess.attributes[cnt].value = 'try{'+objToProcess.attributes[cnt].value+'}catch(err){LogError("'+ objToProcess.id+'"'+ ',err);}';
}
}
}
Run Code Online (Sandbox Code Playgroud)
小智 5
你可以在Opera中替换Error.prototype.toString!
window.onerror = function (msg) {
// send msg to http://errors.net/log.php, for example
(new Image()).src = 'http://errors.net/log.php?msg=' + encodeURIComponent(msg);
};
if (({}).toString.call(window.opera) === '[object Opera]') {
(function () {
var x = Error.prototype.toString;
Error.prototype.toString = function () {
var msg = '';
try {
msg = x.apply(this, arguments);
if (typeof (window.onerror) === "function") {
window.onerror(msg, typeof (this) === 'object' ? this.stack : '', '');
}
} catch (e) {}
return msg;
};
}());
}
Run Code Online (Sandbox Code Playgroud)
看来,它不适用于Opera 11.50 ...仅适用于早期版本......
AFAIK,这种情况也会发生在 Safari 上。
您当然可以做的是为所有 JS 代码创建一个全局 try/catch 块,而不是文本解析 - 如果您遇到以下情况,这可能会很棘手:
(function ($){
$(function (){
});
})(jQuery);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7874 次 |
| 最近记录: |