我使用Ajax和哈希导航。

有没有办法检查window。location。hash是否像这样改变了?

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

如果我在文件加载时检查它,它就会工作。

但如果我有#哈希导航,它不工作时,我按浏览器上的后退按钮(所以我从blah#456跳转到blah#123)。

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


当前回答

Firefox从3.6开始就有了onhashchange事件。看到window.onhashchange。

其他回答

在IE浏览器中处理History和window.location.hash有很多技巧:

As original question said, if you go from page a.html#b to a.html#c, and then hit the back button, the browser doesn't know that page has changed. Let me say it with an example: window.location.href will be 'a.html#c', no matter if you are in a.html#b or a.html#c. Actually, a.html#b and a.html#c are stored in history only if elements '<a name="#b">' and '<a name="#c">' exists previously in the page. However, if you put an iframe inside a page, navigate from a.html#b to a.html#c in that iframe and then hit the back button, iframe.contentWindow.document.location.href changes as expected. If you use 'document.domain=something' in your code, then you can't access to iframe.contentWindow.document.open()' (and many History Managers does that)

我知道这不是一个真正的回答,但IE-History笔记可能对某些人有用。

注意,在Internet Explorer 7和Internet Explorer 9的情况下,if语句将返回true(对于“onhashchange”在windows中),但窗口。onhashchange永远不会触发,所以最好存储哈希值,并在每100毫秒后检查它是否为所有版本的Internet Explorer更改。

    if (("onhashchange" in window) && !($.browser.msie)) {
         window.onhashchange = function () {
              alert(window.location.hash);
         }
         // Or $(window).bind( 'hashchange',function(e) {
         //       alert(window.location.hash);
         //   });
    }
    else {
        var prevHash = window.location.hash;
        window.setInterval(function () {
           if (window.location.hash != prevHash) {
              prevHash = window.location.hash;
              alert(window.location.hash);
           }
        }, 100);
    }

编辑- 从jQuery 1.9开始,$.browser。不支持Msie。来源:http://api.jquery.com/jquery.browser/

我在一个react应用程序中使用这个,使URL显示不同的参数,取决于用户所处的视图。

我看了哈希参数使用

window.addEventListener('hashchange', doSomethingWithChangeFunction);

Then

function doSomethingWithChangeFunction () {
    let urlParam = window.location.hash; // Get new hash value
    
    // ... Do something with new hash value
};

工作了一个待遇,工作与前进和后退浏览器按钮,也在浏览器历史记录。

真正做到这一点的唯一方法(也是'reallysimplehistory'如何做到这一点的),是通过设置一个间隔来不断检查当前哈希,并将其与之前的哈希进行比较,我们这样做,并让订阅者订阅一个发生变化的事件,如果哈希发生变化。它并不完美,但是浏览器本身并不支持这个事件。


更新以保持这个答案新鲜:

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

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

这里的好处是,您可以编写甚至不需要担心hashchange支持的代码,但是您确实需要做一些神奇的事情,以不太为人所知的jQuery特性jQuery特殊事件的形式。

有了这个特性,当有人第一次试图以任何方式(比如绑定到事件)使用事件时,你基本上可以为任何事件运行一些设置代码。

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

这完全解除了您的代码需要理解的支持问题,实现这种特殊事件是微不足道的(获得一个简单的98%工作版本),但为什么要这样做,当别人已经做了。

Firefox从3.6开始就有了onhashchange事件。看到window.onhashchange。