我无法弄清楚为什么原型会在dom:loaded
事件和AJAX处理程序中抑制错误消息.
鉴于以下HTML:
Conforming XHTML 1.1 Template
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
处理程序中缺少的变量时,它似乎跳转到名为K的第53行上的函数:
K: function(x) { return x }
但是怎么样?为什么?什么时候?我在那里看不到任何try/catch块,程序流如何在那里结束?
我知道我可以通过dom:ready
在try/catch块中包装我的处理程序来使错误可见,但这不是一个非常舒服的选择.同样适用于为AJAX调用注册全局onException处理程序.
为什么它甚至可以抑制错误?有人遇到过这个吗?
过了一会儿,我发现原型将所有异常重定向到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
onException 每当出现XHR错误时触发.有一个自定义签名:第一个参数是请求者(即一个Ajax.Request实例),第二个参数是异常对象.