博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Ajax保留浏览器历史的解决方案
阅读量:6221 次
发布时间:2019-06-21

本文共 2657 字,大约阅读时间需要 8 分钟。

hot3.png

解决方案如下:

方案一:使用window. Onhashchange 事件

如下面Html片段,点击不同的连接,在mainPanel中加载不同的页面:

复制代码
<
ul 
class
="menu"
>
<
li
><
href
="/home/index#page=1"
>page1
</
a
></
li
>
<
li
><
href
="/home/index#page=2"
>page2
</
a
></
li
>
<
li
><
href
="/home/index#page=3"
>page3
</
a
></
li
>
</
ul
>
<
div 
id
="mainPanel"
>
</
div
>
复制代码

首先写一个方法来获取当前url中指定keyhash值,如下:

复制代码
<script type="text/javascript">
      
//
获取指定key的hash值
      
function getHash(key, url) {
          
var hash;
          
if (!!url) {
              hash = url.replace(/^.*?[#](.+?)(?:\?.+)?$/, "$1");
              hash = (hash == url) ? "" : hash;
          } 
else {
              hash = self.location.hash;
          }
          hash = "" + hash;
          hash = hash.replace(/^[?#]/, '');
          hash = "&" + hash;
          
var val = hash.match(
new RegExp("[\&]" + key + "=([^\&]+)", "i"));
          
if (val == 
null || val.length < 1) {
              
return 
null;
          } 
else {
              
return decodeURIComponent(val[1]);
          }
      }
  </script>
复制代码

使用onhashchange事件触发ajax请求:

复制代码
<script type="text/javascript">
       
function loadPanel() {
        
var page = getHash("page");
        
if (page == 1) {
            $("#mainPanel").load("/home/page1");
        }
        
if (page == 2) {
            $("#mainPanel").load("/home/page2");
        }
        
if (page == 3) {
            $("#mainPanel").load("/home/page3");
        }
    }
    $(window).bind("hashchange", loadPanel);
 </script>
复制代码

到这里工作已经完成了80%,为什么是80%呢,这里面还有一个问题:

当你直接在浏览器(新开的标签页)的地址栏里输入这样的地址: 或者通过QQ发给你的好友,看到的并不是如你所想的应该是page=3的内容,而是 的内容。原因很简单——页面加载的时候不会触发onhashchange事件。

所以我们要在上面的代码追加一行:

$(loadPanel);
//
或者    
$(
function(){ $(window).trigger("hashchange"); });

onhashchange 事件location.hash发生改变的时候触发,可以很好解决AJAX刷新后退/前进键失效的问题,是一个新的事件,

目前chrome ,firefox,Opera,  Safari,IE8及以上版本浏览器都兼容。

其实对于那些死抱着IE6,IE7 不放的用户,咱也没必要给他们提供这样的用户体验。

 

方案二:使用jQuery.History.js

对于要兼容IE6IE7的情况,笔者一直使用jquery.history.js 这个插件()。

这个插件它会去判断浏览器是否支持onhashchange事件,如果不支持,就定时(每个100毫秒)循环判断hash有没有变化,从而执行相应处理。

如:

复制代码
<script src="/Scripts/jquery.history.js" type="text/javascript"></script>
<script type="text/javascript">
    $(
function () {
        $.history.init(
function (hash) {
            
var page = getHash("page");
            
if (page == 1) {
                $("#mainPanel").load("/home/page1");
            }
            
if (page == 2) {
                $("#mainPanel").load("/home/page2");
            }
            
if (page == 3) {
                $("#mainPanel").load("/home/page3");
            }
        });
    });
</script>
复制代码

另外,这个插件已经不再继续更新维护了。

 

方案三:jquery.ba-hashchange.js

jquery.ba-hashchange.js()

这个插件的实现原理和jquery.history.js 完全一样。循环间隔为50毫秒。

overwrite window.hashchange事件,使其能够兼容全部浏览器。

使用如下:

复制代码
<script src="/Scripts/jquery.ba-hashchange.js" type="text/javascript"></script>
<script type="text/javascript">
    $(window).hashchange(
function () {
        
var page = getHash("page");
        
if (page == 1) {
            $("#mainPanel").load("/home/page1");
        }
        
if (page == 2) {
            $("#mainPanel").load("/home/page2");
        }
        
if (page == 3) {
            $("#mainPanel").load("/home/page3");
        }
    });
    $(window).hashchange();
</script>
复制代码

转载于:https://my.oschina.net/songhongxu/blog/223870

你可能感兴趣的文章
021-cdh6.2+kylin2.6.2
查看>>
Linux - 进程
查看>>
从DevOps到ContainerOps
查看>>
版本控制:Git、Github 和 SVN的使用
查看>>
可变参数范例
查看>>
内核必须懂(三): 重编Ubuntu18.04LTS内核4.15.0
查看>>
遍历对象实例的属性和方法
查看>>
React组件
查看>>
论战,交易挖矿模式,能走多远?
查看>>
Vue中axios的封装
查看>>
实现一个简单版本的Vue及源码解析(一)
查看>>
GCD(二) dispatch_barrier
查看>>
Android 复杂的列表视图新写法 MultiType (v3.1.0 修订版)
查看>>
【前端记-1】你不知道的前端缓存
查看>>
AJAX发送请求、同源策略与CORS跨域
查看>>
顶尖AI无法识别简单图案?因为人类已经无法理解它们了
查看>>
用 Node.js 写一个多人游戏服务器引擎
查看>>
java版spring cloud+spring boot+redis多租户社交电子商务平台 (六)分布式配置中心(Spring Cloud Config)...
查看>>
Android CTS V2 最全命令行解释和使用示例
查看>>
算法初探--递归算法
查看>>