我正在尝试使用Javascript来模拟CSS的
问题出现在尝试实施方案3时:
如果一个
解决方案后编辑:roasted的答案提供了关键 - 处理命名空间
:target
伪类,以便捕获导致页面元素被选中的所有事件。我已经确定了3个触发事件:
window.location.hash
在初始化时已经将同一ID的元素定位- 单击指向该元素的锚点
hashchange
事件独立于上述事件触发(例如通过window.history
API)
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
事件时,它将再次被触发。我如何过滤掉这些边缘情况?解决方案后编辑:roasted的答案提供了关键 - 处理命名空间
hashchange
事件,然后根据在单击处理程序内处理的逻辑处理器取消绑定和重新绑定。我在这里写了完整的插件。