浅谈hashchange和popstate事件触发条件

本文介绍了前端开发中hashchange和popstate事件的基本概念和触发条件。hashchange事件在URL片段标识符改变时触发,而popstate事件在历史记录条目变化时触发,特别是在与pushState或replaceState方法交互时。文章详细阐述了不同场景下两个事件的触发情况,包括同时触发、不触发和仅触发一个的情况,并给出了实际示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基本概念

工欲善其事,必先利其器。因此,让我们先从MDN上了解一下这两个事件的触发条件。

1、hashchange

URL的片段标识符更改时,将触发hashchange事件 (跟在#符号后面的URL部分,包括#符号)。

2、popstate

每当处于激活状态的历史记录条目发生变化时,popstate事件就会在对应window对象上触发。

如果当前处于激活状态的历史记录条目是由history.pushState()方法创建,或者由history.replaceState()方法修改过的, 则popstate事件对象的state属性包含了这个历史记录条目的state对象的一个拷贝。

需要注意的是调用history.pushState()或history.replaceState()不会触发popstate事件。

触发场景

当修改URL的片段标识符、历史记录条目即可分别触发hashchange和popstate事件。

监听事件

window.onpopstate = function () {
    console.log('popstate 触发!');
}

window.onhashchange = function () {
    console.log('hashchange 触发!');
}

1、同时触发 loaction.hash

loaction.hash = 'hash'

此时地址栏,URL = 原URL + #hash
控制台:
popstate 触发!
study.html:18 hashchange 触发!

2、都不触发 history.pushstate和replacestate

history.pushstate({},'','history')

此时地址栏:http://127.0.0.1:5500/history
控制台:无输出

3、只触发一个 history.go、back和forward

当栈内已经有http://127.0.0.1:5500/history#hash2http://127.0.0.1:5500/study.html两个历史记录。
在这里插入图片描述

// back、forward、go都可以
history.back()

控制台:popstate 触发!

注意事项:当back、forward和go时,不论上一个历史记录是否有hash,都只会触发popstate事件。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值