hashchange Event – 监测URL的hash变化

本文详细介绍了如何通过HTML5的onhashchange事件来实时监测URL的hash变化,提供了两种实现方案:定时检测和onhashchange事件监听,并分析了各自的特点和适用场景。
部署运行你感兴趣的模型镜像

转载自:http://www.impng.com/web-dev/hashchange-event-and-onhashchange.html

hashchange Event – 监测URL的hash变化

通过URL传值,在?后附加以=连接的键值对,各键值对间以&连接;也可以通过URL传递页面参数,在”#”后附加的方式。两者最大的一个区别在于:后者不会发起请求,不会导致页面刷新。常见应用场景在于:不需要请求服务器,由浏览器端脚本直接定位到某个条件下的页面展示。例如:在这个页面中http://www.istartedsomething.com/bingimages/#20101106-us,带hash值打开的是展示某个大图的页面,不带hash值打开(http://www.istartedsomething.com/bingimages/)的只是一个日历的图片集界面,需要再次点击才能展示某个大图。

如果需要根据URL的hash值变化,来进行不同的页面处理,需要一个监测方案。最常见的方法就是通过一个定时程序,不停的去检测url中hash的变化,一旦检测到变化,则触发操作。

但这个方案并不是实时触发的,而且究竟该多久检测一次,没有一个有依据的数值。如果数值过大,可能会影响到页面的快速呈现;如果数值过小,则会引起过高的资源占用。

比较完美的一个方式是采用onhashchange的事件监测。

hashchange事件在html5中有定义,在url的hash段变化的时候触发。目前支持onhashchange的浏览器有:

秉承不应基于浏览器检测,而应基于对象和方法检测的原则,可用 if(‘onhashchange’ in window) { } 检测浏览器是否支持onhashchange。这里不能用 typeof window.onhashchange === ‘undefined’ 来检测,因为很多支持onhashchange的浏览器下,其初始值就是undefined。

需要注意的是,在IE8以ie7的模式运行时,window下存在onhashchange这个方法,但是永远不会触发这个事件,因此需要先检测IE的document.documentMode

综上所述,采取比较完善方式的代码片段:

if( ('onhashchange' in window) && ((typeof document.documentMode==='undefined') || document.documentMode==8)) {
    // 浏览器支持onhashchange事件
    window.onhashchange = hashChangeFire;  // TODO,对应新的hash执行的操作函数
} else {
    // 不支持则用定时器检测的办法
    setInterval(function() {
        var ischanged = isHashChanged();  // TODO,检测hash值或其中某一段是否更改的函数
        if(ischanged) {
            hashChangeFire();  // TODO,对应新的hash执行的操作函数
        }
    }, 150);
}


您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

在JavaScript中,当用户在URL的哈希(#)部分更改时,通常用于实现浏览器的历史记录管理、局部刷新或单页应用(SPA, Single Page Application)中的导航。以下是如何使用`hashchange`事件处理URL变化的基本步骤: 1. **监听hashchange事件**: 在现代浏览器中,你可以使用`window.addEventListener('hashchange', function() { ... })`来监听`hashchange`事件。这个事件会在URL的哈希值改变时触发。 ```javascript window.addEventListener('hashchange', handleHashChange); function handleHashChange(event) { // 在这里处理新的URL和相应的操作 } ``` 2. **获取当前哈希值**: 使用`window.location.hash`属性获取当前的哈希值,例如 `'#section1'` 或 `''`(无哈希表示根路径)。 ```javascript const currentHash = window.location.hash; ``` 3. **解析和响应变化**: 根据哈希值的不同,执行相应的页面内容更新、数据加载或者DOM操作。比如,如果哈希是`'/section1'`,可能意味着要显示第1个部分的内容。 ```javascript if (currentHash === '#section1') { loadSectionOneContent(); } ``` 4. **路由管理**: 对于复杂的SPA应用,可能会有一个完整的路由系统,可以根据URL的不同部分动态生成和切换视图。在这种情况下,你可能还需要维护状态管理和视图层的映射逻辑。 5. **处理锚点链接**: 如果直接点击页面上的锚点(如`<a href="#section1">Link</a>`),也可以触发`hashchange`事件。为了兼容这种情况,可以在`click`事件上绑定处理程序。 ```javascript document.querySelectorAll('a[href^="#"]').forEach(anchor => { anchor.addEventListener('click', e => { e.preventDefault(); // 阻止默认行为,防止跳转 const targetHash = e.target.hash; // 获取目标哈希值 window.location.hash = targetHash; // 设置新URL handleHashChange(); }); }); ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值