我正在尝试使用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