ページ上の要素が対象となるすべてのイベントをキャプチャするために、Javascript を使用して CSS:target疑似クラスをエミュレートしようとしています。3 つのトリガー イベントを特定しました。
window.location.hash初期化時にすでに同じ ID の要素をターゲットにしています- 要素を対象とするアンカーがクリックされた
- イベントは上記
hashchangeとは無関係に発生します (たとえば、window.historyAPI 経由) 。
シナリオ 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内で処理されるロジックに基づいてハンドラーをアンバインドおよび再バインドします。完全なプラグインをここに書きました。