7

我无法弄清楚为什么原型会在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 块,程序如何流到那里?

我知道我可以通过将我的dom:ready处理程序打包在 try/catch 块中来使错误可见,但这不是一个很舒服的选择。为 AJAX 调用注册全局 onException 处理程序也是如此。

为什么它甚至会抑制错误?以前有人遇到过吗?

4

3 回答 3

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

onException 每当出现 XHR 错误时触发。具有自定义签名:第一个参数是请求者(即 Ajax.Request 实例),第二个参数是异常对象。

于 2010-03-30T18:47:01.790 回答
2

您还可以从 onException 重新抛出异常,并且您将以与发生在调用之外的相同方式获取它

onException: function(request,e){throw e;}
于 2012-03-01T12:28:30.230 回答
0

为我工作

Ajax 响应者

全局侦听器存储库通知基于原型的 Ajax 请求的每一步。

http://api.prototypejs.org/ajax/Ajax/Responders/

Ajax.Responders.register({
  onCreate: function() {
    Ajax.activeRequestCount++;
  },
  onComplete: function() {
    Ajax.activeRequestCount--;
  }
});
于 2012-11-06T14:01:52.807 回答