当前位置:  开发笔记 > 编程语言 > 正文

On - window.location.hash - 更改?

如何解决《On-window.location.hash-更改?》经验,为你挑选了9个好方法。

我正在使用Ajax和hash进行导航.

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

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

如果我在文档加载时检查它,它可以工作.

但是如果我有基于#hash的导航,那么当我按下浏览器上的后退按钮时它就不起作用了(所以我从#456跳到了#123).

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



1> meandmycode..:

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


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

如果你正在使用jQuery(今天应该对大多数人来说有点基础)那么一个很好的解决方案是使用jQuery为你提供的抽象,通过使用它的事件系统来监听window对象上的hashchange事件.

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

这里的好处是你可以编写代码,甚至不需要担心hashchange支持,但是你需要做一些魔术,以一些鲜为人知的jQuery特性jQuery特殊事件的形式.

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

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

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


为了添加另一个更新,现在广泛支持`hashchange`事件:http://caniuse.com/#search=hash
最新的Firefox版本(3.6 alpha)现在也支持本机哈希更改事件:https://developer.mozilla.org/en/DOM/window.onhashchange当然值得对此事件进行检查,但请注意IE8将告诉你当它在IE7 compat模式下运行时事件存在..遗憾的是事件不会触发..你需要检查事件并且浏览器似乎不是IE7 ..叹息(或尝试用IE的fireEvent方法触发事件.
我是唯一一个认为未经请求的jQuery答案是痛苦的人吗?
在撰写本文时,WebKit还会触发`hashchange`事件,而Safari(稳定版)还没有.
IE8的确如此.更多来
这个答案现已弃用
@Luc我完全同意你的看法!为什么所有假设jQuery总是被使用!

2> Miles..:

HTML5 指定一个hashchange事件.现在所有现代浏览器都支持此事件.在以下浏览器版本中添加了支持:

Internet Explorer 8

Firefox 3.6

Chrome 5

Safari 5

歌剧10.6


更新:FF 5,Safari 5和Chrome 12支持此活动截至2011年6月.
用法:`window.onhashchange = function(){doYourStuff(); }`
[hashchange event]的MDN文档(https://developer.mozilla.org/en-US/docs/Web/API/WindowEventHandlers/onhashchange).
@everybody,无需在评论部分继续附加答案 - 这就是"编辑"按钮的用途.:)

3> 小智..:

请注意,对于Internet Explorer 7和Internet Explorer 9,该参数if将为true(对于Windows中的"onhashchange"),但window.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/



4> Sergio Cinos..:

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

正如原始问题所述,如果您从页面a.html #b转到a.html #c,然后点击后退按钮,则浏览器不知道该页面已更改.让我用一个例子来说:window.location.href将是'a.html#c',无论你是在a.html #b还是a.html #c.

其实,a.html#B和a.html#c的存储在历史上只有当要素""和""以前在页面存在.

但是,如果您在页面中放置iframe,请在该iframe中从a.html #b导航到a.html#c,然后点击后退按钮,iframe.contentWindow.document.location.href会按预期更改.

如果您在代码中使用'document.domain = something ',那么您无法访问iframe.contentWindow.document.open()'(并且许多历史经理会这样做)

我知道这不是一个真正的回应,但也许IE-History笔记对某些人有用.



5> 小智..:

自3.6以来,Firefox发生了一次onhashchange事件.请参见window.onhashchange.



6> CJ...:

Ben Alman有一个很棒的jQuery插件来处理这个问题:http://benalman.com/projects/jquery-hashchange-plugin/

如果你不使用jQuery,它可能是一个有趣的解剖参考.



7> gion_13..:

您可以在"window.location"对象的"hash"属性上轻松实现观察者("watch"方法).

Firefox有自己的用于观察对象更改的实现,但是如果你使用其他一些实现(例如在JavaScript中监视对象属性的更改) - 对于其他浏览器,那就可以了.

代码如下所示:

window.location.watch(
    'hash',
    function(id,oldVal,newVal){
        console.log("the window's hash value has changed from "+oldval+" to "+newVal);
    }
);

然后你可以测试它:

var myHashLink = "home";
window.location = window.location + "#" + myHashLink;

当然,这将触发您的观察者功能.


他在看window.location.hash,而不是window.location.

8> Sergey Ilins..:

可以在http://code.google.com/p/reallysimplehistory/找到一个不错的实现.它唯一(也是)问题和错误是:在Internet Explorer中手动修改位置哈希将重置整个历史堆栈(这是一个浏览器问题,无法解决).

请注意,Internet Explorer 8确实支持"hashchange"事件,并且由于它正在成为HTML5的一部分,因此您可能希望其他浏览器能够赶上.



9> Sprose..:

我在React应用程序中使用它来使URL根据用户所在的视图显示不同的参数。

我看了使用

window.addEventListener('hashchange', doSomethingWithChangeFunction());

然后

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

做过款待,可以使用浏览器的前进和后退按钮以及浏览器历史记录。


?它不应该与`()`一起使用。`addEventListener`函数需要您传入一个函数。doSomethingWithChangeFunction是一个函数。doSomethingWithChangeFunction()是该函数的返回值,在这种情况下不是函数。
推荐阅读
虎仔球妈_459
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有