Prototype JS吞下了dom:loaded和ajax回调中的错误?

时间:2010-03-23 21:47:47

标签: javascript error-handling prototypejs javascript-framework

我无法弄清楚为什么原型会在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处理程序。

为什么它甚至可以抑制错误?有人遇到过这个吗?

3 个答案:

答案 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--;
  }
});