【问题标题】:Prototype JS swallows errors in dom:loaded, and ajax callbacks?Prototype JS 吞下 dom:loaded 和 ajax 回调中的错误?
【发布时间】:2011-01-31 00:35:55
【问题描述】:

我不明白为什么原型会在 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 处理程序也是如此。

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

【问题讨论】:

    标签: javascript error-handling prototypejs javascript-framework


    【解决方案1】:

    一段时间后,我发现原型将所有异常重定向到 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 实例), 其次是异常对象。

    【讨论】:

    • 虽然是的,这是一个部分解决方案,但我提到我希望看到一个解决方案,而不需要为 AJAX 调用注册全局 onException 处理程序,这也适用于每个请求处理程序。
    【解决方案2】:

    你也可以从 onException 重新抛出异常,你会得到它,就像它发生在调用之外一样

    onException: function(request,e){throw e;}
    

    【讨论】:

      【解决方案3】:

      为我工作

      Ajax.Responder

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

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

      Ajax.Responders.register({
        onCreate: function() {
          Ajax.activeRequestCount++;
        },
        onComplete: function() {
          Ajax.activeRequestCount--;
        }
      });
      

      【讨论】:

        猜你喜欢
        • 2011-12-09
        • 1970-01-01
        • 2012-06-15
        • 2011-07-20
        • 1970-01-01
        • 2021-08-03
        • 1970-01-01
        • 1970-01-01
        • 2011-02-12
        相关资源
        最近更新 更多