私が達成しようとしていることは次のとおりです。
ポップアップを開くリンクがありますが、そのポップアップではデータベース レコードのデータを編集できるため、ポップアップを開く前にデータベース レコードがロックされているかどうかを確認したいと考えています。また、データベース レコードがロックされている場合は、ポップアップの代わりにメッセージをユーザーに表示する必要があります。
私のアイデアは、次のようなカスタム イベントをトリガーして、任意のリスナーがポップアップを開くのを停止できるようにすることでした。
$(".popuplauncher").on("click", function(event) {
event.preventDefault(); // Stop the default click action: opening the popup
var myCustomEvent = $.Event("myCustomEvent");
$(this).trigger(myCustomEvent);
if (myCustomEvent.isDefaultPrevented()) {
// Show message 'database object locked'
} else {
// Everything ok, open the popup
}
});
しかし、イベント リスナーには非同期動作 (データベース オブジェクトがロックされているかどうかをサーバーに問い合わせる) があるため、イベント リスナーでは遅延オブジェクトを使用する必要があると思います。
$.when($(this).trigger(myCustomEvent)).then(...)
trigger() は遅延オブジェクトを返さないため、機能しません。連鎖を可能にするために JQuery オブジェクト自体を返します。
$.when($(this).triggerHandler(myCustomEvent)).then(...)
triggerHandler() は最後のイベントハンドラーの値のみを返すため、私にとってもトリックは行いません。したがって、複数のイベント ハンドラーがある場合、最後のハンドラー以外はすべて無視されます。
私はここで正しい軌道に乗っていますか、それともこの問題に対して別のアプローチを取るべきですか? 私に言わせれば、これはよくある問題だと思います。そのため、簡単ですぐに使用できるソリューションを見落としていたことを願っています。
これは、いろいろいじりながら作ったフィドルtriggerHandler()
です。最後のハンドラ/遅延のみが重要であることに注意してください。