【发布时间】:2015-02-13 12:21:59
【问题描述】:
我有以下代码
console.info('checking if url contains hash');
if (!location.hash) {
console.warn('if-block replacing hash to empty!');
location.href = '#';
// Running route() to trigger Router.otherwise()
console.info('running route() from if-block(hash doesn\'t exist)');
route(location.hash.slice(1));
} else {
// URL contains a hash. Running Router.when() to load template
console.info('running route() from else-block(hash already present in url)');
route(location.hash.slice(1));
}
// Bind hashchange-event to window-object... duh
console.info('binding hashchange event');
$(window).on('hashchange', function () {
console.info('running route() from hashchange');
route(location.hash.slice(1));
});
显然,事件侦听器附加在 else-if 块之后。我的控制台输出验证了这一点
2015-02-13 12:51:14.281 main.js:69 checking if url contains hash
2015-02-13 12:51:14.284 main.js:71 if-block replacing hash to empty!
2015-02-13 12:51:14.290 main.js:75 running route() from if-block(hash doesn\'t exist)
2015-02-13 12:51:16.677 main.js:84 binding hashchange event
2015-02-13 12:51:16.678 main.js:86 running route() from hashchange
看起来事件侦听器以某种方式获取了之前触发的 hashchange 事件。
这仅在 url 为 example.com 而不是 example.com/# 时发生。如果您进入网站时,网址中缺少/ 或/#,则会触发此现象。
编辑:我遇到的问题是hashchange 事件侦听器在它甚至侦听哈希更改之前就触发了。我想知道这是否正常。
另一个编辑:
一个更清晰的示例表明,当我第一次运行 getEventListeners(window) 时,没有侦听器附加到 hashchange 事件。尽管如此,当我添加事件侦听器时,它会拾取先前触发的hashchange
我在这里遗漏了什么还是发生了什么?
有没有办法绕过这个?
【问题讨论】:
-
绕过什么?显示的内容中没有任何内容表明事件过早触发。请更详细地解释问题。完全不清楚预期是什么
-
@charlietfl 我在我的 OP 中添加了说明
-
是什么让你说它过早触发?您的编辑是控制台日志中显示的内容不支持的语句复制问题的演示会有所帮助
-
@charlietfl 控制台日志指出,在第 69 行,我的 if-else 块开始运行并将哈希添加到 url,因此触发了
hashchange事件。但我尚未将事件侦听器附加到hashchange,如控制台日志的第 84 行所示。 -
那你需要显示更多代码,显示代码的方式日志是对的
标签: javascript jquery hashchange