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入门到精通教程
查看: 19815|回复: 0

使用jquery的load方法设计动态加载,并解决浏览器前进、后退、刷新等问题

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

    [LV.9]以坛为家II

    2034

    主题

    2092

    帖子

    70万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    705612
    发表于 2021-4-9 13:07:48 | 显示全部楼层 |阅读模式

    继上一篇 使用jquery的load方法设计动态加载,并解决被加载页面JavaScript失效问题 解决了后台业务系统的部分动态加载问题,然而该框架离正常的用户体验还存在一些问题,如:浏览器的前进、后退、刷新等问题。有博友也遇到了同样的问题,接下来就针对浏览器的前进、后退、刷新进行用户体验优化。

    在解决上述问题时也进行了各种search,但是大部分都是自己实现的插件,而且插件年久失修,对于新的jquery支持不佳。也有使用h5新加的history方法来实现的,由于HTML5的广泛使用,绝大部分主流浏览器已经支持h5,若是你还是抓着IE6/7/8不放手的忠实粉丝,请略过,本文就是使用h5的history方法来实现的。

    而且在上一篇的基础上,使用jquery的插件的写法略微封装了一下,load的原理已经在上一篇介绍,这里不再复赘,这里对h5的history API介绍一下:

    history.pushState(data, title [, url]):往历史记录堆栈顶部添加一条记录;data会在onpopstate事件触发时作为参数传递过去;title为页面标题,当前所有浏览器都会忽略此参数;url为页面地址,可选,缺省为当前页地址。

    简单封装的插件:

     1 $.extend({
     2     /**
     3      *  使用jquery的load方法加载页面, 
     4      *  根据url地址加载该页面中的id为content的内容 到 本页面的ID为content的位置
     5      *  url        链接URL
     6      *  data    链接请求参数
     7      */
     8     loadPage: function(url, data) {
     9         $.ajaxSetup({cache: false });
    10         $("#content").load(url+ " #content ", data, function(result){
    11             // 将被加载页的JavaScript加载到本页执行
    12             $result = $(result); 
    13             // 将页面传递参数data定义为param 在被加载页接收
    14             $result.find("script").prepend("var param = "+JSON.stringify(data)).appendTo('#content');
    15         });
    16     },
    17     /**
    18      * 保存链接url、菜单ID、链接请求数据到 历史记录中
    19      * url        链接URL
    20      * menuId    菜单ID
    21      * data        链接请求参数
    22      */
    23     pushState : function(url, menuId, data) {
    24         console.log("pushState:"+url+":::"+ menuId+":::"+ data)
    25         
    26         // 如果URL没有menuId,即认为该菜单页面中链接跳转,使用该链接所在页的menuId
    27         if(menuId == null || menuId == ''){
    28             menuId = history.state.menuId;
    29         }
    30         // 将URL,menuId, 请求参数保存到历史记录中
    31         history.pushState({urlStr : url, menuId : menuId, data : data}, "页面标题", "?_url="+url);
    32     },
    33     /**
    34      * 浏览器 前进、后退事件
    35      */
    36     popState : function(){
    37         window.addEventListener("popstate", function() {
    38             var currentState = history.state;
    39             if(currentState!=null){
    40                 url = ".."+currentState.urlStr;
    41                 this.menuOpen(currentState.menuId);
    42                 var primitiveUrl = currentState.urlStr.split("#")[0];
    43                 //aa = primitiveUrl;
    44                 $.loadPage(url, currentState.data);
    45             }
    46         });
    47     },
    48     /**
    49      * 浏览器刷新事件
    50      */ 
    51     refresh : function(){
    52         var currentState = history.state;
    53         if(currentState!=null){
    54             loadUrl = ".."+currentState.urlStr;
    55             var primitiveUrl = currentState.urlStr.split("#")[0];
    56             aa = primitiveUrl;
    57             var page = loadUrl.split("#")[1];
    58             pageScript = "";
    59             if(page !=null){
    60                 pageScript = " $table.page("+page+").draw(false);";
    61             }
    62             //console.log(loadUrl+":::"+ currentState.data);
    63             $.loadPage(loadUrl, currentState.data);
    64         }
    65     },
    66     /**
    67      * 菜单树展开方法
    68      * menuId      菜单对应的ID
    69      */
    70     menuOpen : function(menuId){
    71         $("#leftMenu").find(".active").removeClass("active");
    72         $("#leftMenu").find("ul").css({"display":"none"});
    73         
    74         $("#"+menuId).addClass("active");
    75         $("#"+menuId).parents("li").addClass("active");
    76         $("#"+menuId).parents("ul").addClass("menu-open").css({"display":"block"});
    77     }
    78 });

    对插件的使用:

    /*
        *加载变换内容,主要url参数为dom对象,并且该dom中的url放在href中,
        *调用方式如:<span onclick="javascript:load(this);" href="/backstage/website/test.html">测试</span>
        *注意:1.该dom对象最好不要用a标签,因为点击a标签会进入href指定的页面
        *      2.要加载的内容要用 id="content" 标注,因为load中指明了加载页面中指定的id为content下的内容
        *    3.对应页面的JavaScript写在content下
        */
        function load(url, data){
            // url
            var urlStr =  $(url).attr("href");
            var urlStr = urlStr.split("..")[1];// 菜单ID
            var menuId = $(url).attr("id");
            $.pushState(urlStr, menuId, data);
            // 加载对应URL页面
            $.loadPage($(url).attr("href"), data);
        }
     
        /*
            浏览器前进后退触发事件
        */
        $.popState();
         
        /*
        * 浏览器刷新事件
        */
        $(function(){
            $.refresh();
        })

     

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

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-5-8 06:09 , Processed in 0.066910 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

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