ele*_*y19 17 javascript firefox jquery onerror
我正在尝试创建一个javascript错误日志记录基础结构.
我试图设置window.onerror为我的错误处理程序.它适用于IE 6,但是当我在Firefox中运行它时,它会遇到一些冲突的onerror方法.
var debug = true;
MySite.Namespace.ErrorLogger.prototype = {
//My error handling function.
//If it's not in debug mode, I should get an alert telling me the error.
//If it is, give a different alert, and let the browser handle the error.
onError: function(msg, url, lineNo) {
alert('onError: ' + msg);
if (!debug) {
alert('not debug mode');
return true;
}
else {
alert(msg);
return false;
}
}
}
//Document ready handler (jQuery shorthand)
$(function() {
log = $create(MySite.Namespace.ErrorLogger);
window.onerror = log.onError;
$(window).error(function(msg, url, line) {
log.onError(msg, url, line);
});
});
Run Code Online (Sandbox Code Playgroud)
如果我使用setTimeout("eval('a')", 1);' a'是一个未定义的变量,我的错误处理程序是什么被解雇(它的工作原理).但是,我的错误记录器需要捕获访问网站的客户端抛出的所有错误,而不仅仅是错误的代码在一个地方.
代码位于从网站的基页(C#)调用的.js页面上.该站点也使用jQuery,所以我有一个覆盖jQuery绑定函数的函数,该函数在Firefox 3和IE 6中都能正常工作.
我知道Firefox看到错误,因为它出现在错误控制台和Firebug中,但我的 window.onerror功能仍未被调用.
有关如何覆盖Firefox正在做什么的任何想法?
Gra*_*ner 23
以下是在IE 6和Firefox 3.0.11中测试和使用的:
<html>
<head>
<title>Title</title>
</head>
<body>
<script type="text/javascript">
window.onerror = function (msg, url, num) {
alert(msg + ';' + url + ';' + num);
return true;
}
</script>
<div>
...content...
</div>
<script type="text/javascript">
blah;
</script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
如果您正在加载的其他JavaScript库也附加到window.onerror您自己可以执行此操作:
<script type="text/javascript">
function addHandler(obj, evnt, handler) {
if (obj.addEventListener) {
obj.addEventListener(evnt.replace(/^on/, ''), handler, false);
// Note: attachEvent fires handlers in the reverse order they
// were attached. This is the opposite of what addEventListener
// and manual attachment do.
//} else if (obj.attachEvent) {
// obj.attachEvent(evnt, handler);
} else {
if (obj[evnt]) {
var origHandler = obj[evnt];
obj[evnt] = function(evt) {
origHandler(evt);
handler(evt);
}
} else {
obj[evnt] = function(evt) {
handler(evt);
}
}
}
}
addHandler(window, 'onerror', function (msg, url, num) {
alert(msg + ';' + url + ';' + num);
return true;
});
addHandler(window, 'onerror', function (msg, url, num) {
alert('and again ' + msg + ';' + url + ';' + num);
return true;
});
</script>
Run Code Online (Sandbox Code Playgroud)
以上内容允许您根据需要添加onerror任意数量的处理程序.如果已经有一个现有的自定义onerror处理程序,它将调用那个,然后是你的.
请注意,addHandler()可用于将多个处理程序绑定到任何事件:
addHandler(window, 'onload', function () { alert('one'); });
addHandler(window, 'onload', function () { alert('two'); });
addHandler(window, 'onload', function () { alert('three'); });
Run Code Online (Sandbox Code Playgroud)
这段代码是新的,有点实验性.我并不是100%确定addEventListener确实完成了手动附件所做的事情,并且如评论所述,attachEvent按照它们所附的相反顺序触发处理程序(因此您将在上面的示例中看到"三,二,一").虽然不一定是"错误"或"不正确",但它与其他代码的作用相反,addHandler因此可能导致从浏览器到浏览器的不一致行为,这就是我删除它的原因.
编辑:
这是一个完整的测试用例来演示onerror事件:
<html>
<head>
<title>Title</title>
</head>
<body>
<script type="text/javascript">
function addHandler(obj, evnt, handler) {
if (obj.addEventListener) {
obj.addEventListener(evnt.replace(/^on/, ''), handler, false);
} else {
if (obj[evnt]) {
var origHandler = obj[evnt];
obj[evnt] = function(evt) {
origHandler(evt);
handler(evt);
}
} else {
obj[evnt] = function(evt) {
handler(evt);
}
}
}
}
addHandler(window, 'onerror', function (msg, url, num) {
alert(msg + ';' + url + ';' + num);
return true;
});
</script>
<div>
...content...
</div>
<script type="text/javascript">
blah;
</script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
当上面的代码放在test.htm中并从本地idk加载到Internet Explorer中时,你会看到一个对话框,上面写着'blah' is undefined;undefined;undefined.
当上面的代码放在test.htm中并从本地磁盘加载到Firefox 3.0.11(以及此编辑的最新版本3.5 - Gecko/20090616)时,您应该会看到一个对话框[object Event];undefined;undefined.如果没有发生这种情况,那么您的Firefox副本未正确配置或以其他方式损坏.我可以建议您删除Firefox,删除您的本地配置文件(有关如何在此处找到您的配置文件的信息)并重新安装最新版本并再次测试.
| 归档时间: |
|
| 查看次数: |
19542 次 |
| 最近记录: |