关于在Ajax中使用pushstate

前几天帮同学改了一下一个管理系统前端部分,整个页面布局就是 header 和 footer 固定,左边为导航栏,右边为内容显示栏···  他之前是用iframe来实现的,但是这样导致每次点击导航栏部分都会重新刷新整个页面,每个页面都有很多内容重复,这样显得性能不佳···

这样一来就必须用到异步刷新了,也就是用 ajax 来加载右边内容栏,用ajax的内容不必多说···对前端有所了解的应该都会了···

但是ajax同时也有坏处:

1、 载入页面 与 原页面 共享整个资源,A页面中载入B页面的内容,即如果B页面中也有js代码且变量方法与A中相同 可能也会触发A页面的某些事件,造成冲突,不过幸好之前他的js变量、方法名都是经过特别设置的,我不需要为这个操心···

2、无法前进后退····  虽然是无刷新操作,但是URL不会改变···

 一、pushstate用法  

 幸好H5中加入了pushstate属性,这样就可以轻松实现前进后退了···

语法:

1 history.pushState(state, title, url);

就创建了一个新的由 statetitle, 和 url  设定的浏览器历史记录···· 浏览器在调用pushState()方法后不会去加载这个URL,只是将其塞到浏览器历史中。如果你在点击事件中每次都调用pushstate,当换着点击几次之后,你点 前进 后退 会发现URL的地址会随着改变···但是 右边的内容并不会改变····

pushstate只是改变history 的记录,并不负责记录每个URL的页面内容状态···

 二、popstate

      此时就该 popstate 起作用了,每次前进后退都会触发popstate事件,所以可以通过绑定popstate事件,就可以根据当前URL地址中的查询内容让对应的菜单执行Ajax载入,实现Ajax的前进与后退效果。  当然还有个  history.replaceState方法,它与pushstate类似,不过是改变当前URL,并不会塞到浏览器历史中···可以在页面刚载入的时候使用这个方法···

三、代码示例

   点击事件

 1 var eleMenus = $(".left a").click(function(e){
 2      e.preventDefault();
 3
 4   if(history.pushstate)
 5 {   /*   ajax载入~~  */
 6
 7    var title = $(this).text();
 8
 9  document.title=title;
10
11  if (event && /\d/.test(event.button))
12 {  history.pushState({title:title},title,"?"+this.href.split("/")[3]); /*这里要判断一下到底是触发点击事件,还是鼠标点击事件,不然会成死循环*/   }  }
13
14  return false;
15 })

popstate事件

 1 var  pageTrigger= function(target) {
 2
 3     var query=location.href.split(‘?‘)[1], eleTarget = target || null;
 4     if(typeof query == "undefined") {
 5         if(eleTarget=eleMenus.get(1)) {
 6             history.replaceState(null, document.title, location.href.split("#")[0] +"?"+eleTarget.href.split("/")[3] );
 7             console.log(eleTarget.href);
 8             pageTrigger(eleTarget);  //直接触发click事件
 9
10         }
11      }
12     else {
13         eleMenus.each(function(){
14               //为popstate 事件准备的····
15
16            if (eleTarget === null && this.href.split("/")[3] === query) {
17               eleTarget = this;//popstate到之前的页面,必须要触发相应的点击事件,所以确定是那个a元素
18           }
19       });
20
21          if (!eleTarget) {  //如果当前元素仍不存在,利用replaceState 将初始页面换到当前url,再次调用 从头开始
22
23             history.replaceState(null, document.title, "base.html");
24             pageTrigger();
25         } else {
26              console.log(eleTarget);
27              $(eleTarget).trigger("click");
28         }
29
30
31    }
32 }
33 if (history.pushState) { //如果浏览器支持history的pushstate属性,在前进后退的时候直接触发pageTrigger事件
34     window.addEventListener("popstate", function() {
35         pageTrigger();
36
37     });
38     // 默认载入
39     pageTrigger();
40 }

现在有 jquery ajax + pushstate 的插件=pjax,pjax是一种基于ajax+history.pushState的新技术,该技术可以无刷新改变页面的内容,并且可以改变页面的URL。pjax是ajax+pushState的封装,同时支持本地存储、动画等多种功能。目前支持jquery、qwrap、kissy等多种版本。

时间: 2024-10-13 12:22:49

关于在Ajax中使用pushstate的相关文章

ajax中网页传输(三)XML——下拉列表显示练习

XML:页面之间传递数据,跨平台传递 HTML:超文本标记语言,核心标签 XML的形势为 <xml version='1.0'> <Nation> <one> <code>n001</code> <name>汉族</name> </one> <two> <code>n002</code> <name>苗族</name> </two> <

ajax中网页传输(一)TEXT——带有删除功能的数据库表格显示练习

网页之间传输的三种方式:TEXT.JSON.XML. 本章将讲解带有TEXT形势的ajax网页传输 第一:body部分代码 <title>ajax中TEXT讲解并且带有删除功能的表格</title> <script src="jquery-2.0.0.min.js"></script> <style type="text/css"> .sc { width:70px; height:30px; backgr

jQuery源码分析系列(33) : AJAX中的前置过滤器和请求分发器

jQuery1.5以后,AJAX模块提供了三个新的方法用于管理.扩展AJAX请求,分别是: 1.前置过滤器 jQuery. ajaxPrefilter 2.请求分发器 jQuery. ajaxTransport, 3.类型转换器 ajaxConvert 源码结构: jQuery.extend({ /** * 前置过滤器 * @type {[type]} */ ajaxPrefilter: addToPrefiltersOrTransports(prefilters), /** * 请求分发器 *

fileupload控件在ajax中无法使用

google得到的方法: 1.http://geekswithblogs.net/ranganh/archive/2008/04/01/file-upload-in-updatepanel-asp.net-ajax.aspx There is a better way of doing it with Ajax Control Toolkit version 3.0.30930 which works with .NET 3.5 SP1 and Visual Studio 2008 SP1. 

ajax中的stasus错误详解

一.英文版解析 0: (Uninitialized) the send( ) method has not yet been invoked. 1: (Loading) the send( ) method has been invoked, request in progress. 2: (Loaded) the send( ) method has completed, entire response received. 3: (Interactive) the response is be

切记ajax中要带上AntiForgeryToken防止CSRF攻击

在程序项目中经常看到ajax post数据到服务器没有加上防伪标记,导致CSRF被攻击,下面小编通过本篇文章给大家介绍ajax中要带上AntiForgeryToken防止CSRF攻击,感兴趣的朋友一起学习吧 经常看到在项目中ajax post数据到服务器不加防伪标记,造成CSRF攻击 在Asp.net Mvc里加入防伪标记很简单在表单中加入Html.AntiForgeryToken()即可. Html.AntiForgeryToken()会生成一对加密的字符串,分别存放在Cookies 和 in

[IBM]掌握Ajax,Ajax中的高级请求和响应

掌握 Ajax, Ajax 中的高级请求和响应 http://www.ibm.com/developerworks/cn/xml/wa-ajaxintro1.html http://www.ibm.com/developerworks/cn/xml/wa-ajaxintro2/ http://www.ibm.com/developerworks/cn/xml/wa-ajaxintro3/ dynaTrace Ajax:前端性能分析利器 http://www.ibm.com/developerwo

Ajax中的get和post请求

Ajax中我们经常用到get和post请求.那么什么时候用get请求,什么时候用post方式请求呢? 在做回答前我们首先要了解get和post的区别. 1. get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到.post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址.用户看不到这个过程. 2. 对于get方式,服务器端用Request.QueryStrin

Ajax中的URL无法访问后台

解决方案:alert每一步的JS操作,最终打印出来异步函数执行时返回的状态码为404,由此可见是访问路径有问题,找不到页面,于是把访问页面路径改为绝对路径,则问题解决 分析:有时候相对路径有问题时,应该把它改为绝对路径, 在有些情况下,绝对路径才是王道啊 Ajax中的URL无法访问后台,布布扣,bubuko.com