HashChangeEvent - 表示片段标识符更改的事件
HashChangeEvent 接口表示当 URL 的片段标识符发生更改时触发的事件。
片段标识符是 URL 中,跟着(包括)# 符号后面的一部分。
属性
该接口还继承了其父接口 Event 的属性。
 HashChangeEvent.newURL 只读 
窗口导航到的新 URL。
 HashChangeEvent.oldURL 只读 
窗口导航的上一个 URL。
方法
该接口没有自己的方法,但继承了其父接口 Event 的方法。
实例
获取 hash 更改的方式
您可以使用以下任一方式监听 hashchange 事件:
window.onhashchange = funcRef;
或者
<body onhashchange="funcRef();">
或者
window.addEventListener("hashchange", funcRef, false);
基本实例
function locationHashChanged() {
  if (location.hash === '#somecoolfeature') {
    somecoolfeature();
  }
}
window.addEventListener('hashchange', locationHashChanged);
Polyfill
Modernizr GitHub 页面上列出了几个回退脚本。基本上,这些脚本会通过定期检查 location.hash 来实现该事件。下面是一个自定义版本,只允许一个处理程序绑定到 onhashchange 属性:
;(function(window) {
  // 如果浏览器实现了该事件,则退出
  if ( "onhashchange" in window.document.body ) { return; }
  var location = window.location,
      oldURL = location.href,
      oldHash = location.hash;
  // 以 100 毫秒的间隔检查位置哈希值
  setInterval(function() {
    var newURL = location.href,
        newHash = location.hash;
    // 如果哈希已经改变并且处理程序已被绑定...
    if ( newHash != oldHash && typeof window.onhashchange === "function" ) {
      // Execute the handler
      window.onhashchange({
        type: "hashchange",
        oldURL: oldURL,
        newURL: newURL
      });
      oldURL = newURL;
      oldHash = newHash;
    }
  }, 100);
})(window);
规范
| 规范 | 状态 | 备注 | 
|---|---|---|
| HTML Living Standard HashChangeEvent 的定义  | 
现行的标准 | 初始定义 | 
桌面浏览器兼容性
| 特性 | Chrome | Edge | Firefox | Internet Explorer | Opera | Safari | 
|---|---|---|---|---|---|---|
| 基础支持 | 5 | 支持 | 3.6 | 8 | 10.6 | 5 | 
oldURL | 支持 | 未知 | 6 | 不支持 | 支持 | 未知 | 
newURL | 支持 | 未知 | 6 | 不支持 | 支持 | 未知 | 
移动浏览器兼容性
| 特性 | Android | Chrome for Android | Edge mobile | Firefox for Android | IE mobile | Opera Android | iOS Safari | 
|---|---|---|---|---|---|---|---|
| 基础支持 | 支持 | 支持 | 支持 | 4 | 未知 | 11.0 | 5 | 
oldURL | 支持 | 支持 | 未知 | 支持 | 未知 | 支持 | 未知 | 
newURL | 支持 | 支持 | 未知 | 支持 | 未知 | 支持 | 未知 |