如何检测位置散列中的更改?

我使用Ajax和哈希进行导航。

有没有办法检查window.location.hash是否像这样更改?

http://example.com/blah#123至http://example.com/blah#456

如果我在文档加载时选中它,它会起作用。

但是如果我有基于#hash的导航,那么当我在浏览器上按Back按钮时就不能工作(所以我从blah#456跳到blah#123)。

它显示在地址框中,但我无法用JavaScript捕获它。


解决方案

真正做到这一点的唯一方法(也就是‘reallysimpleHistory’如何做到这一点)是通过设置一个持续检查当前哈希的时间间隔,并将其与以前的哈希进行比较,我们这样做,并让订阅者订阅我们在哈希更改时触发的更改事件。这并不完美,但浏览器本身确实不支持此事件。


更新以使此答案保持新鲜:

如果您使用的是jQuery(对于大多数人来说,jQuery现在应该是基础的),那么一个很好的解决方案就是使用jQuery提供的抽象,使用它的事件系统来侦听窗口对象上的hashchange事件。

$(window).on('hashchange', function() {
  //.. work ..
});

这里的好处是您可以编写甚至不需要担心hashchange支持的代码,但是您确实需要使用一些不太出名的jQuery功能jQuery special events。

使用此功能,您基本上可以在有人首次尝试以任何方式使用事件(如绑定到事件)时,为任何事件运行一些设置代码。

在此安装代码中,您可以检查本机浏览器支持,如果浏览器没有本机实现此功能,您可以设置单个计时器来轮询更改,并触发jQuery事件。

这使您的代码完全不需要理解这个支持问题,这种特殊事件的实现是微不足道的(要获得一个简单的98%工作版本),但是为什么要这样做when somebody else has already。

相关文章