2

最近、PrototypeからjQueryに切り替えて、いくつかの基本的な問題に取り組んでいます。

アプリケーションでいくつかの AJAX 要求を使用します。これらのリクエストの 95% について、ローディング インジケーターの表示または非表示など、いくつかのグローバル イベントを実行したいと考えています。グローバル機能とは別に、すべてのリクエストには、完了後に実行されるカスタム コードも必要です。

一度設定すると、ローカルのAjax イベントがグローバルのイベントをオーバーライドするようです。たとえば、次のコードを参照してください。

// global events
$('#loader').bind('ajaxStart', function() { 
    // in this particular example, the ajaxStart() works fine, 
    // as it has not been overridden
    Loader.enable();
}).bind('ajaxComplete', function() { 
    // this section will not execute. when the local complete()
    // is removed, it will execute just fine
    Loader.disable();
} );

// local ajax event
$.ajax({
    type: $(element).attr('method'),
    url: $(element).attr('action'),
    data: $(element).serialize(),
    global: 'true',
    complete: function(data) {
        if (params.target && $('#' + params.target)) {
            $('#' + params.target).html(data.responseText);
        }
        Behaviour.apply();
});

この特定のケースでは、ローカルの complete() イベントがグローバルの ajaxComplete() イベントの実行を停止しているように見えます。

ローカルとグローバルの ajax イベントの両方を実行する方法はありますか?

4

3 に答える 3

4

コードを実行しようとしました。不足していた});を追加しました。けれど。魅力のように働きました。呼び出しは次の順序で行われました。

  1. ajax開始
  2. 完了
  3. ajaxComplete

これが私がしたことです:

// local ajax event
$.ajax({
    ...
    global: 'true',
    complete: function(data) {
        ...
    }
}); // <=== This line here
于 2009-06-03T14:22:17.110 に答える
3

試したことはありませんが、なぜグローバルメソッドを作成しないのですか:

function globalAjaxComplete(data)

グローバルとローカルの両方のイベント ハンドラーから呼び出しますか?

クラス「ajaxEnabled」を定義して、これを行うこともできます。

$(".ajaxEnabled").bind("ajaxStart", 
   Function() { globalAjaxComplete(); });

そうすれば、毎回グローバル メソッドを呼び出す必要がなくなります。

ただし、ローカルバインディングがグローバルバインディングをキャンセルする理由はまだわかりません。

于 2009-06-03T12:01:46.223 に答える
0

まずはお返事ありがとうございます。どちらも、少なくともコードを何度も再評価するのに役立ちました。

問題と解決策は非常に単純であることが判明しました。

ローカルのBehaviour.apply();completeイベントで呼び出されたものが他の場所でエラーをトリガーし、complete()関数が正しく終了できず、グローバルajaxComplete()イベントが効果的に無効になりました。このエラーを修正すると、私の問題も修正されました。

これは、jQueryがローカルグローバルの両方のajaxイベントの組み合わせをサポートしていることを意味します。

于 2009-06-08T08:00:15.020 に答える