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

继上一篇 使用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();
    })
时间: 2024-12-21 11:37:50

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

使用jquery的load方法设计动态加载,并解决被加载页面JavaScript失效问题

一.问题分析 对于后台系统,相比大家都有所印象,知道其中的布局结构,如图: 在这种布局中我们需要将header,sidebar,footer分开,而且对于中间部分的content内容需要动态变化,即根据不同菜单定位到不同页面,而整体布局不会变化 这种布局结构对于单纯的HTML不具备这种嵌入各部分内容的能力,所以就需要我们自己来寻找或者解决这种问题,由于jquery的兼容性和使用广度比较不错,这里 使用jquery的load方法来处理这种页面布局框架. 二.load方法详解 1.定义 $(sele

关于使用jquery的load方法时被加载页面内部script失效问题的一次探索

事先声明:本文由初学者撰写,为一次探索的过程,可能有不严谨和准确的地方,望读者多多谅解并积极指正! 场景描述: 在一次前端开发过程中,我使用了一个网页模板,该模板包含一个主页和四个子页面,如下图: 具体的效果是,点击主页中的一个按钮会在弹框内显示子页面的内容,如下图: 具体的实现是在主页面中留出面板,并在点击按钮时通过jquery的load方法将子页面加载到面板中: index.html 部分代码 <div class="cd-folding-panel"> <div

MVC4中AJAX Html页面打开调用后台方法实现动态加载数据库中的数据

之前一直用window.onload方法来调用js方法来实现,今天纠结能不能换个方法实现. 很明显是可以的. 在html前台页面引用js代码如下 @Scripts.Render("~/Scripts/User/AddUser.js") 这就算引用了,看adduser.js代码如果调用后台方法 $(document).ready( function (){ $.ajax({ type: 'POST', url: "/EditUserPassWord/UserGroupQuery

JavaScript教程之jQuery - AJAX load() 方法

jQuery - AJAX load() 方法 jQuery load() 方法 jQuery load() 方法是简单但强大的 AJAX 方法. load() 方法从服务器加载数据,并把返回的数据放入被选元素中. 语法: $(selector).load(URL,data,callback); 必需的 URL 参数规定您希望加载的 URL. 可选的 data 参数规定与请求一同发送的查询字符串键/值对集合. 可选的 callback 参数是 load() 方法完成后所执行的函数名称. 这是示例

jQuery AJAX load() 方法

jQuery load() 方法 jQuery load() 方法是简单但强大的 AJAX 方法. load() 方法从服务器加载数据,并把返回的数据放入被选元素中. 语法: $(selector).load(URL,data,callback); 必需的 URL 参数规定您希望加载的 URL. 可选的 data 参数规定与请求一同发送的查询字符串键/值对集合. 可选的 callback 参数是 load() 方法完成后所执行的函数名称. 这是示例文件("demo_test.txt")

jQuery – AJAX load() 方法

jQuery load() 方法 jQuery load() 方法是简单但强大的 AJAX 方法. load() 方法从服务器加载数据,并把返回的数据放入被选元素中. 语法: $(selector).load(URL,data,callback); 必需的 URL 参数规定您希望加载的 URL. 可选的 data 参数规定与请求一同发送的查询字符串键/值对集合. 可选的 callback 参数是 load() 方法完成后所执行的函数名称. 这是示例文件("demo_test.txt")

c#动态加载卸载DLL的方法

这篇文章介绍了c#动态加载卸载DLL的方法,有需要的朋友可以参考一下 c#中通过反射可以方便的动态加载dll程序集,但是如果你需要对dll进行更新,却发现.net类库没有提供卸载dll程序集的方法.在.net 中,加入了应用程序域的概念,应用程序域是可以卸载的.也就是说,如果需要对动态加载的dll程序集进行更新,可以通过以下方法解决: 新建一个应用程序域,在该应用程序域中动态加载DLL,然后可以卸载掉该应用程序域.该应用程序域被卸载的时候,相关资源也会被回收. 要想这样实现,就要让你程序的cur

js插件动态加载js、css解决方案

最近因为工作需要做了一个js自动导入的插件,一开始很天真的以为动态创建个script添加到head中就ok了,试了之后才发现了问题,就是如果同时引入了多个js文件,而且后一个文件中用到了前一个文件中的变量,那就会报错,靠~~悲催了,就是说js如果动态加载(非浏览器加载因为浏览器加载时同步加载的会等待前一个js加载完成后才进行下一个js加载,这样就不会出现问题)那加载的文件是异步进行的,难怪啊!然后在网上找了些资料说用ajax同步加载,然后我试了真可以,下面就是我的代码分享出来给大家,但是注意这样

java动态加载机制

假设有一个class,ClassLoader首先把它load到内存里的code segment(内存里存放代码段的),站在ClassLoader的角度,内存里的一个一个的class就是一个一个的对象,这个对象就是xx.class,实际就是Class类的对象.Load完class,找到main函数开始执行,然后会把很多其他的类Load进来,动态加载机制. 测试动态加载机制: 新建项目Reflection,new一个class,TestDynamicLoading: public class Tes