昨天没事,研究了一下ajax下面的前进后退功能,也就是是history记录。发现这个东西没有想象中的复杂,却比想象中的麻烦。之前一直以为这个东东复杂,是因为网上的各种资料有点不达意(或者是因为我搜索技巧不行)。实际的核心没有那么复杂的,道理也不麻烦。今天写下了,抛砖一下,希望懂的大牛指点一下
- 是不是点击前进后退的按钮的时候会触发一个事件,我捕捉到这个事件,然后赋值给他就行了。
- 那是不是又个数组保留着前进后退的值,我直接操作这个值不就行了。
- 那咋办。又没值,又没事件的,连个缝都没有,咋搞。
很不幸,木有,前进后退确实会触发一些事件,那只不过是页面刷新的时间,你无法判断是前进后退还是刷新什么的。
也很不幸,这个数组啥的肯定有,但是通过JavaScript肯定是访问不到地,那样多不安全啊。
虽然你ajax后,浏览器根本不diao你(特指ie,ff下记录hash,但无动作),但是却屌iframe,你想想,如果用ajax加载了一个内容。同时用iframe加载一个内容。是不是浏览器就记录下来了?
嘿嘿这么说是不是有点意思了?到这里的时候思路就明确起来,
- 搞个iframe,而且是不可见的iframe,所以要display:none了。要不就影响到你想要的功能了。为了方便说话这里给一个:
- 改写地址栏的hash,用来做绝对地址。另外绝对地址可以参考google让大家加个!的做法。我单独写了一个函数防止注入以及绑定一些事件及加载成功判断等,但是其核心就是jQuery的$.load函数。
- 这个iframe犯不着重新加载一下你的内容,但至少也得把你ajax 所load的内容的地址保存下来吧。所以用每次load内容的时候也要触发一下:window.frames["ajax_history_iframe"].location.href=”ajax_history.php?”+loadname ;红字的部分是我这个iframe要访问的地址:所以要为这个单独建一个页面ajax_history.php多俗的名字啊。
- ajax_history.php这个页面呢,先不用干啥,至少至少也得能调用父页面的那个ajax 的load函数吧。
- 当有前进后退发生的时候,这个load_history函数需要判断到河现在的那个ajax_history_iframe的值url值是不相同,不相同就执行加载旧的url值(被保存在历史记录里面的值)然后旧页面就使用刚才写的那个load函数执行了。
<iframe id=”ajax_history_iframe” name=”ajax_history_iframe” height=”40px” width=”400px” frameborder=”no” style=”display:none” scrolling=”no” ></iframe>
parent.load_history(window.location.search.substr(1));
这样讲好像还是有点复杂了,其实就是改变hash就改变iframe,后退会触发iframe改变,而这个改变又会调用改变要load的内容,这样变相的就达到了实现前进后退的功能。需要注意的是ff和ie还有其他的浏览器对hash的支持不一样,ff下hash的改变也会触发前进后退事件,但ie不会,所以还要做一些垫底的判断。
但是这样做需要一个独立页面返回iframe的参数值。而在jQuery.istory插件里面却并没有使用独立页面。看了看源代码好像是自己把自己加载了一下,不过还是没有看懂的样子,尤其是那个contentWindow.document.open(); contentWindow.document.close();不知道啥意思,没看懂,知道的烦告诉一声。嘿嘿。
BTW,因为jQuery.history插件内置的会把hash后面的参数给抹掉,加上.htm构成加载。而我的程序偏偏需要传参,加上上面的看不懂,不知道从哪里改,所以就没有用这个插件,如果你的没有这些要求,直接使用这个插件会少做很多工作的。
有时间可以demo一下下
没研究透
我写了一个Ajax history通过iframe的demo:
地址:http://www.2fool.cn/311.html