处理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和文本修改。