我正在尝试使用 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 事件,然后根据 click 处理程序及其 preventDefault 内部处理的逻辑取消绑定并重新绑定处理程序。我在这里写了完整的插件。