Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 317|回复: 0

Ajax保留浏览器历史的解决方案

[复制链接]
  • TA的每日心情
    奋斗
    2024-4-6 11:05
  • 签到天数: 748 天

    [LV.9]以坛为家II

    2034

    主题

    2092

    帖子

    70万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    705612
    发表于 2021-5-2 17:12:04 | 显示全部楼层 |阅读模式

    ajax请求中,不能更新地址栏,地址栏上的前进后退按钮就失效了,带来了另外一种糟糕的用户体验。

    解决方案如下:

    方案一:使用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%呢,这里面还有一个问题:

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

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

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

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

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

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

     

    方案二:使用jQuery.History.js

    对于要兼容IE6IE7的情况,笔者一直使用jquery.history.js 这个插件(https://github.com/tkyk/jquery-history-plugin)。

    这个插件它会去判断浏览器是否支持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(http://benalman.com/projects/jquery-hashchange-plugin/)

    这个插件的实现原理和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>

     

    原文地址: http://www.cnblogs.com/xumingxiang/archive/2012/11/25/2787530.html
    作者 : 祥叔
    出处: http://www.cnblogs.com/xumingxiang 
    版权:本文版权归作者和博客园共有
    转载:欢迎转载,为了保存作者的创作热情,请按要求【转载】,谢谢
    要求:未经作者同意,必须保留此段声明;必须在文章中给出原文连接;否则必究法律责任 

     

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-19 05:27 , Processed in 0.087013 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表