我正在嘗試使用Javascript來模擬CSS :target
僞類,以便捕獲導致頁面中的元素成爲目標的所有事件。我已經確定3個觸發事件:僅捕獲不是錨定點擊造成的hashchange事件
window.location.hash
上初始化- 錨靶向元件被點擊
- 的
hashchange
事件是在上述的獨立地發射已經靶向相同ID的元素(例如通過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
事件時再次觸發。我如何過濾掉這些邊緣情況?
POST-SOLUTION編輯:
烤的答案舉行的關鍵 - 基於點擊處理程序及其內部的preventDefault處理邏輯處理命名空間hashchange事件,然後解除綁定並重新綁定的處理程序。 I wrote up the full plugin here。
你能給用戶如何可以使用您所描述的系統的例子嗎? –
@SamuelReid我正在研究一個豐富的單頁網頁應用程序,重點關注漸進式增強功能:對於沒有使用Javascript的用戶代理在概念上可行的所有交互和導航都使用表單元素和(最經常)鏈接處理 - 一個很多時間哈希用於導航或顯示頁面內的元素。但是當應用Javascript時,我經常想要中斷這些事件並取代原生行爲。 – Barney
@SamuelReid舉個具體的例子:有一些像'腳註查看器'那樣顯示大量引用。本機行爲只是跳轉到引用問題,但增強的行爲打開了一個模式界面,以更好地與引用和源文件引用進行整體交互。我希望人們能夠分享永久鏈接到腳註,但如果JS可用,我仍然希望在可能的情況下使用「腳註查看器」。 – Barney