我无法弄清楚为什么原型会在dom:loaded
事件和AJAX处理程序中抑制错误消息。
给出以下HTML:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Conforming XHTML 1.1 Template</title>
<script type="text/javascript" src="prototype.js"></script>
<script type="text/javascript">
document.observe('dom:loaded', function() {
console.log('domready');
console.log(idontexist);
});
</script>
</head>
<body>
</body>
</html>
domready事件触发,我在控制台中看到日志,但没有任何错误迹象。如果将console.log(idontexist);
行移出处理程序,则会得到
控制台中出现未定义idontexist
错误。
我发现它有点奇怪,在其他事件处理程序中,如“点击”,您收到错误消息,似乎只有dom:loaded
出现此问题。
AJAX处理程序也是如此:
new Ajax.Request('/', {
method: 'get',
onComplete: function(r) {
console.log('xhr complete');
alert(youwontseeme);
}
});
您不会看到任何错误。 这是使用prototype.js 1.6.1,我在文档中找不到这种行为的任何迹象,也没有在这些处理程序中启用错误报告的方法。
我尝试使用FireBug的调试器逐步执行代码,当它遇到dom:loaded
处理程序中缺少的变量时,它似乎跳转到第53行的名为K的函数:
K: function(x) { return x }
但是怎么样?为什么?什么时候?我在那里看不到任何try / catch块,程序流程如何在那里结束?
我知道我可以通过在try / catch块中打包dom:ready
处理程序来显示错误,但这不是一个非常舒服的选项。同样适用于为AJAX调用注册全局onException处理程序。
为什么它甚至可以抑制错误?有人遇到过这个吗?
答案 0 :(得分:6)
一段时间后,我发现原型将所有异常重定向到onException处理程序:
new Ajax.Request('/ajax_html_echo', {
method: 'get',
onComplete: function(r) {
console.log('xhr complete');
alert(undefinedVar)
},
onException: function(request,e){
console.log(e.message); // prints undefinedVar is not defined
}
});
此处有更多信息
http://www.prototypejs.org/api/ajax/options
每次XHR时都会触发onException 出现错误。有自定义签名: 第一个参数是请求者 (即Ajax.Request实例),. 第二个是异常对象。
答案 1 :(得分:2)
您也可以从onException重新抛出异常,并且它将以与在调用之外发生的方式相同的方式获取它
onException: function(request,e){throw e;}
答案 2 :(得分:0)
为我工作
Ajax.Responders
全局侦听器的存储库,通知了基于Prototype的Ajax请求的每一步。
http://api.prototypejs.org/ajax/Ajax/Responders/
Ajax.Responders.register({
onCreate: function() {
Ajax.activeRequestCount++;
},
onComplete: function() {
Ajax.activeRequestCount--;
}
});