现在的位置: 首页 > 综合 > 正文

关于url hash navigation的问题

2013年10月08日 ⁄ 综合 ⁄ 共 996字 ⁄ 字号 评论关闭

背景:在ajax的应用中,由于页面不刷新,如果操作都在一个页面上,浏览器将不会记住每个操作的状态,这样就会产生一个问题:用户在click几次之后,想回到先前某一次click
的结果(或者直接想回去上一次操作的结果),就会点击浏览器的前进或者后退按钮,这时候问题就出来了。由于URL始终没有发生变化,点击浏览器的前进后退按钮,出现
的结果,将不会是用户希望看到的。

互联网上已有的实现:gmail, dropbox, facebook, etc.(已经有越来越多的应用用这种方式来实现)

1. 做法:

写一个定时器不断地去读url hash值(location.hash)的变化(只有url hash有变化,html中叫anchor),然后根据hash值的变化,取得相应的显示数据。

2.问题:

1. Firefox下取得location.hash时,firefox会自动地额外做一次decode,导致使用这个值时不对(你可能会说,它decode一次,我再encode一次<用javascript的
encodeURIComponent函数>不就OK了?答案是不行。因为firefox只会decode那些可以decode的值,如果碰上URL hash里正好带上了一个%2B或者%25这种URL编码
的字 符,firefox会自动地把它decode成另外一个字符,问题就来了)。比如我某个时刻的URL hash值是abc%25def,在javascript里用location.hash取到的值,就会
是abc%def, 显然,结果不是我们想要的

2. IE 6,7对于URL只有hash部分有变化的情况,不会在它的历史记录里记录URL hash的不同,这也就导致使用URL hash navigation在IE6,7下点击前面或者后退的按钮,也
不会得到我们想要的结果!!!

解决办法:

1. 很显示,这个问题有各种办法可以解决(因为我们最终的目的是要一个正确的URL hash值,不管使用什么办法,我们肯定有办法得出这样一个结果),最常用的是在客
户端把%替换成%的URL编码%25,然后在服务器解码一次,这样不论浏览器。始终能得到一个正确的结果(因为在服务器端解码,会把%25还原成%).

2. 现在只知道通过在页面中加入一个hidden的iframe,通过iframe记住IE6,7下URL hash值的变化记录,来实现类似的效果。不知道还有什么其它的好办法!

抱歉!评论已关闭.