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 ブロックが表示されません。プログラム フローはどのように終了しますか?

ハンドラーを try/catch ブロックに詰め込むことでエラーを表示できることはわかっていますdom:readyが、これはあまり快適なオプションではありません。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 インスタンス) で、2 番目の引数は例外オブジェクトです。

于 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 に答える