处理js中的URL定位更改事件

我如何编写将在URL锚点中的任何更改上执行的JavaScriptcallback代码?

例如从http://example.com#a到http://example.com#b

Google自定义search引擎使用计时器来检查前一个值的散列值,而单独域中的子iframe更新父代的位置散列值以包含iframe文档正文的大小。 当计时器捕捉到更改时,父级可以调整iframe的大小以匹配正文,以便不显示滚动条。

类似以下的事情也达到了相同的效果:

var storedHash = window.location.hash; window.setInterval(function () { if (window.location.hash != storedHash) { storedHash = window.location.hash; hashChanged(storedHash); } }, 100); // Google uses 100ms intervals I think, might be lower 

Google Chrome 5,Safari 5, Opera 10.60 , Firefox 3.6和Internet Explorer 8 支持hashchange事件:

 if ("onhashchange" in window) // does the browser support the hashchange event? window.onhashchange = function () { hashChanged(window.location.hash); } 

并把它们放在一起:

 if ("onhashchange" in window) { // event supported? window.onhashchange = function () { hashChanged(window.location.hash); } } else { // event not supported: var storedHash = window.location.hash; window.setInterval(function () { if (window.location.hash != storedHash) { storedHash = window.location.hash; hashChanged(storedHash); } }, 100); } 

jQuery也有一个插件,将检查hashchange事件,并提供自己的,如果有必要的 – http://benalman.com/projects/jquery-hashchange-plugin/

编辑 :更新浏览器支持(再次)。

setInterval()只是现在的通用解决scheme。 但是在hashchange事件的forms中,未来会有一些亮点

从我在其他SO问题中看到的,唯一可行的跨浏览器解决scheme是一个计时器。 看看这个问题 ,例如。

(只是为了logging。)YUI3“hashchange”合成事件与被接受的答案或多或less是一样的

 YUI().use('history-hash', function (Y) { Y.on('hashchange', function (e) { // Handle hashchange events on the current window. }, Y.config.win); }); 

你可以从这里得到更多的信息

突变事件types

突变事件模块旨在允许通知文档结构的任何更改,包括attr和文本修改。