最近在做自己的站时,要使用到JS来刷新当前页面。
毫不犹豫的使用了以下JS代码
parent.window.location.reload();
|
解释下为什么要parent,因为交互操作是在页面提交表单到页面一个隐藏iframe,交互完成后需求刷新当前页面,所以用parent,调用回当前的页面来刷新。
逻辑上没什么问题,确实使用起来也实现了页面刷新。
后来一次无意之中,用FF来执行上面的操作(之前的开发一直是用chrome,我的主浏览器也是chrome),出现了下面一幕
但是chrome就没这问题。这种提示,一般是因为有post过去的数据页面重新刷新才会出现的,但是我刷新当前页,为什么会有数据post呢,让我相当郁闷。
后来百度了一下,发现window.location.reload()这种方法被很多人诟病,原因是当window.location.reload() 刷新当前页时,页面里面的iframe也会一并刷新,而FF是会记录iframe曾经打开过的页面的,所以我刷新当前页时,相当于把我刚才提交到 iframe的那个处理页在iframe里面又执行一次,故出现上面的情况。
唉,看来又是一个浏览器兼容的hack,真不知说FF强大还是有毛病好……记录iframe页面干嘛!
当你每次都点重新发送的话,FF将会不断alert和不断弹出这个提示,可以说是死循环…
于是没有办法阿,只能找方法解决呗,网上有解决方案是
parent.window.location.href = parent.window.location.href; |
但如果当前页面有锚点的话,这个方法行不通(因为url有锚点的话,是不会刷新的,不懂的话自己扫盲吧)
于是我把上面方法改进了,写成
下面是PHP代码:
|
echo "<script>parent.window.location.href = '{$_SERVER['HTTP_REFERER']}';</script>" ; |
把referer当做刷新的url。因为都是提交处理页到隐藏iframe,所以referer肯定是当前页不会错;取referer的话,因为不会取到锚点所以实现刷新功能也没有问题。
总结
上面的方法只适合于页面提交处理页到iframe处理然后再刷新当前页面这个功能,我相信绝大部分开发人员都用过这种提交处理页的方法,需求刷新的也会很多,所以这个技巧我认为是有必要分享的。
不过提交处理页的话,还是用ajax的为好,异步的操作不被记录到浏览器历史里,才是处理页应该有的逻辑,而且ajax也更先进,特别对于登录、注册、发布等的数据交互操作用ajax更方便也更安全。
迟点考虑写篇ajax操作的经验心得吧。最近服务器被人恶意攻击,慢得要死,什么都做不了阿,唉唉唉唉唉唉……留言功能不知道什么时候能完工了。
再想想之前公司的项目很多都用到了window.location.reload()来刷新,真不知道将来会不会有意想不到的问题出现,使用的地方还很多,都没办法改了,真是泪流满面