14

jQueryトリガーメソッドを使用してイベントを呼び出しています...しかし、動作に一貫性がありません。イベントを呼び出すこともあれば、呼び出さないこともあります。

<a href="#" onclick="
    $(this).trigger('custom-event');
    window.location.href = 'url';
    return false;
">text</a>

custom-eventはたくさんのリスナーが追加されています。これは、トリガーメソッドが同期していないかのようでありwindow.location.href、イベントを実行する前に変更することができます。また、window.location.hrefが変更されると、ナビゲーションが発生し、すべてが中断されます。

イベントを同期的にトリガーするにはどうすればよいですか?

jQuery1.8.1の使用。

編集

イベントが呼び出されると、次のようなスタックトレースが含まれることがわかりました。

  1. jQuery.fx.tick(jquery-1.8.1.js:9021)
  2. ティック(jquery-1.8.1.js:8499)
  3. jQuery.Callbacks.self.fireWith(jquery-1.8.1.js:1082)
  4. jQuery.Callbacks.fire(jquery-1.8.1.js:974)
  5. jQuery.speed.opt.complete(jquery-1.8.1.js:8991)
  6. $ .customEvent(myfile.js:28)

triggerこれは、jQueryメソッドが非同期であることを証明しています。(私は間違っていました...これは、私が呼び出していたイベントがその中にアニメーションを持ち、アニメーションの後にコールバック内で期待される関数を呼び出していたことを証明するだけです)

4

2 に答える 2

28

私の友人であるあなたは、jQueryを「いつ」探しています。

http://api.jquery.com/jQuery.when/

何かを強制的に同期させるには、次のようなものを使用できます。

$.when($(this).trigger('custom-event')).done(function(){
    window.location.href = 'url';
});
于 2012-11-12T04:58:00.617 に答える
11

triggerHandlerに関するドキュメントを読む:

.triggerHandler()は、(連鎖を可能にするために)jQueryオブジェクトを返す代わりに、最後に実行されたハンドラーによって返された値を返します。再トリガーされたハンドラーがない場合は、未定義を返します

ドキュメントのこの点で、次のようなコードを考えさせられます。

// Trigger the custom event
$(this).triggerHandler('custom-event');
// This code will only run when all events are run
window.location.href = 'url';

あなたの要件を満たします。

http://api.jquery.com/triggerHandler/を参照してください

于 2013-04-18T08:46:26.263 に答える