E6与location.hash和Ajax历史记录 (转载)

为了在IE6中改变hash来保留历史记录实现ajax的前进后退,通常需要在页面内加入隐藏的iframe,对其open+close然后修改iframe的hash,再通过timer更新主窗口的hash,达到让主窗口生成历史记录的目的。

参见http://tkyk.github.com/jquery-history-plugin/

但是这样做有一个问题,ie6默认是打开导航音的,对于用户而言,如果用隐藏iframe实现ajax历史记录,则导航时会出现两次导航音,这是非常讨厌的。有什么办法解决这个问题呢?

如果是要让页面导航不发出声音,本身是不难的。用新建的iframe设置src后再添加进dom结构,就不会有导航音。

参见http://www.julienlecomte.net/blog/2007/11/30/

但这样创建的iframe,是不会被IE6认作浏览记录的。最后研究gmail的代码发现:

  1. 不用修改iframe的src,只是简单的在open close中插入一个write,就可以生成历史记录。
  2. 这样的修改,此iframe本身不会有导航音。于是总共只发出一次导航音,非常正常。
  3. 最好是在这个iframe的document中写入title标题,这个是历史记录的名字,便于用户查找。
  4. hash不再保存于iframe的document.location.hash,也不能直接挂靠在iframe上,而是应该放置于iframe的document内部,最简单还是用title节点
  5. iframe支持load事件,只要open write close就会触发,所以前进后退都可以用这个驱动。在ie6/7上都可以工作,类似于hashchange事件。
  6. https和http协议,最简单的iframe src都是javascript:0。
  7. 唯一的问题是:点击前进后退,仍然会有两次导航音,但这已经好很多了。

通过进一步的搜索发现,许多库的作者使用了open close,却仅仅是修改了hash,说明他们并没有意识到真正的问题所在。

原文地址:http://blog.sina.com.cn/s/blog_6e7f61f30100sddm.html

相关推荐