2011-09-15 9 views
37

グローバルAjaxイベントハンドラ(ajaxStart、ajaxStop、およびajaxError)がいくつか定義されていると仮定します。通常、私はそれでうまくいきますが、1つのリクエストでは、ajaxErrorハンドラを無効にしますが、引き続きajaxStartハンドラとajaxStopハンドラを通常通り実行します。 jQuery ajax function documentationには、グローバルに設定できる「グローバル」パラメータが記述されています。すべてのグローバルAjaxイベントハンドラを無効にするために$ .ajax関数に渡されますが、一部のグローバルハンドラを無効にする方法については言及していません。要求のためのいくつかのjQueryグローバルAjaxイベントハンドラの無効化

ajaxError関数に渡されるajaxSettingsオブジェクトの "url"プロパティをテストすることでajaxErrorハンドラを防ぐことができますが、やや不器用なようです。誰かが、$ .ajax関数が呼び出されているところで を見ている人には明らかなajaxError関数を実行しないようにする方法を知っていますか?

誰かが見たい場合は、簡単な例を提供できます。

+0

あなた自身の '.error'ハンドラを' $ .ajax() 'コールに追加しようとしましたが(そして私はこれを推測しています)、処理の終わりに' return false'を ' ? –

+0

はい、私はそれを試みました。それは問題を解決しませんでした。グローバルハンドラは引き続き実行されました。 –

+0

正常に覚えていれば、グローバルハンドラ(成功、エラー、完了)は成功/エラー/完了ハンドラの前で実行されます。 –

答えて

85

難しいことではありません。

あなたは自分のグローバルエラーハンドラ(.ajaxError)はjQueryのは、それに提供できるようなパラメータの数受け取るためにセットアップする必要があります:あなたはどんなAJAXの設定にsuppressErrors: trueを追加することができ、この後

$("div.log").ajaxError(function(evt, xhr, settings) { 
    if(settings.suppressErrors) { 
     return; 
    } 

    // Normal processing 
}); 

をリクエストが失敗した場合、エラーハンドラは通常の処理を行わずに戻ります。

See it in action

+0

これはこれまでのところ最高の答えのようです。私はあなたの例が好きです。 –

+0

私はあなたの考えを試して、それは働いた。誰かがより洗練されたソリューションを考え出すことができない限り、私はおそらくあなたに賞金を授与します。 –

+0

この回答は私のニーズに完全に適しているので、私はあなたに賞金を授与することにしました。 –

7

は次のようにあなたのAjaxのリクエストでglobal: falseを使用しよう:

$.ajax({ 
    url: "test.html", 
    global: false, 
    // ... 
}); 

ソース::グローバルイベントのhttp://docs.jquery.com/Ajax_Events

ルック。

+1

私はそれを試み、グローバルAjaxハンドラをすべて無効にしました。私は特定のグローバルなAjaxハンドラを無効にしようとしています。 –

+1

これは同様の問題で多くを助けました。ありがとう! – mwcz

+0

これは私が考えている最高の答えです –

14

jquery/ajaxソースhttps://github.com/jquery/jquery/blob/master/src/ajax.js#L579-582のこのif文を見れば、同じ種類の多くのうちの1つですが、jqueryパラメータだけでは問題を解決できないことは明らかです。バイバブGuptaが特定のAJAX呼び出しで

  • マップローカルにあなたのグローバルハンドラを言ったよう

    • 、falseにグローバル設定と$を通じてグローバルイベントをトリガ:

      私の提案はすることです.event.trigger方法

    サンプル:

    $.ajax({ 
        url: "test.html", 
        global: false, 
        beforeSend: function(){$.event.trigger('ajaxStart');}, 
        complete: function(){$.event.trigger('ajaxStop');}, 
        error: your_error_handler 
    }); 
    
  • +0

    これはエラーハンドラを防ぐかもしれないようですが、他の微妙な問題を引き起こす可能性があります。 beforeSendハンドラは、最初のAjaxリクエストが開始されたときにのみ実行されるはずです。すでに別のAjaxリクエストが発生している場合は実行されません。 ajaxStop関数は、すべてのAjax要求が停止すると実行されます。他のAjaxリクエストがある場合は実行しないでください。私はもっ​​と良いものが見えなければ、とにかくあなたの答えを試すかもしれません。 –

    +0

    jQueryのソース(https://github.com/jquery/jquery/blob/master/src/ajax.js#L659-661)によると、jQueryは公開カウンタjQuery.activeを使用しています。私はこれを使って地球規模の出来事を起こすことができることを確認しました。 例: beforeSend:function(){if(jQuery.active === 0){$ .event.trigger( 'ajaxStart')}} – topek

    8

    falseを設定すると、グローバルエラーコールバックの呼び出しを一時的に無効にすることができます。フラグを設定するためにあなたの特別な要求のerrorcompleteコールバックを使用します。

    $.ajax({ 
        url: 'some.domain.com/', 
    }).error(function(jXHR){ 
        // Disable global error logging 
        $.event.global.ajaxError = false; 
    }).complete(function(){ 
        // Enable global error logging 
        $.event.global.ajaxError = true; 
    }); 
    

    例はjsFiddleで提供されています。

    私はまだジョンの提案を好むと付け加えたいと思います。この手法では、2つの場所でフラグを設定する必要があります。そのうち1つを忘れてしまい、誤ってグローバルハンドラを無効にする可能性があります。もう一つの理由は、Jonのテクニックは、いくつかの内部フラグを設定することが信頼できないjQueryリリースで動作することが保証されるべきであるということです。

    関連する問題