ページ上の要素が対象となるすべてのイベントをキャプチャするために、Javascript を使用して CSS:target
疑似クラスをエミュレートしようとしています。3 つのトリガー イベントを特定しました。
window.location.hash
初期化時にすでに同じ ID の要素をターゲットにしています- 要素を対象とするアンカーがクリックされた
- イベントは上記
hashchange
とは無関係に発生します (たとえば、window.history
API 経由) 。
シナリオ 2 は、click
イベントのpreventDefault
. このシナリオの簡略化されたコードは次のとおりです。
$('body').on('click', 'a[href*=#]', function filterTarget(clickEvent){
$(this.hash).trigger('target', [clickEvent]);
});
シナリオ 3 を実装しようとすると、問題が発生します。
$(window).on('hashchange', function filterTarget(hashChangeEvent){
$(this.hash).trigger('target', [hashChangeEvent]);
});
target
ハンドラーがシナリオ 2 のネイティブ動作をキャンセルしないhashchange
場合、ネイティブ動作が結果のイベントを引き起こすと、ハンドラーは再びトリガーされます。これらのエッジケースを除外するにはどうすればよいですか?
ソリューション後の編集:
ローストの答えが鍵を握っていました—名前空間付きのhashchangeイベントを処理し、クリックハンドラーとそのpreventDefault内で処理されるロジックに基づいてハンドラーをアンバインドおよび再バインドします。完全なプラグインをここに書きました。