pjax不再神秘,hash、state那点事

如果最近打电话给武汉的小伙伴,他说信号不好,那么相信我,他肯定不是真的信号不好,也不是不想和你说话,而是他可能在冰箱里。。。武汉的天气从来都是喜怒无常的,是吧,屌丝气十足,今年也是丝毫看不出有任何逆袭的迹象和可能性,当然咱也没必要去操那个心;好吧,其实你把他看作是我也是可以的;不要联想,赶快进入正题;

JS能一路从小丑变为白天鹅,跟ajax技术的风靡有莫大的关系,伴随H5、ES6、Nodejs的发展与普及,不断将前端推向新的高度,如今JS的地位如日中天啊!

用过backbone、Angular、React这些框架的肯定对前端路由都不陌生,而他们基本上都是通过监听hash的变动来更新和切换视图的,当然React还支持browserHistory,也就是pjax的重点pushState,属于H5的范畴,除了BSIE,兼容性就不多说了;pjax=pushState+ajax,ajax都不陌生,那么揭开pjax的神秘面纱,搞懂pushState就是咯,恩,为了保持信心,先这么认为吧;

如果还是不太清楚pjax到底是做什么的,那么只好这么说了:改变URL(不是hash),局部刷新(ajax);

如果依然不太明白,那只可能是因为思维定式了,对于前端来说,一般都知道改变URL(不是hash),页面一定会刷新的,而pushState就是要让你知道,No!改变URL也可以只刷新局部!

实现pjax其实并不难,比如jquery.pjax.js,已有现成的API供你直接使用;只是最近无意中发现国内有几个站点已经开始使用pjax技术了,页面体验非常好;而我刚入门React,不想搭着Jquery一起用,只好自己造个ajax的轮子用着,然后自然就想到了这个轮子应该包含pjax;然后发现自己太年轻了,当然有想法是好的;

实现pjax主要要用到H5 history的几个API:pushState(data,str,url),replaceState(data,str,url),onpopstate事件;onpopstate会在用户点击浏览器上的前进后退或者程序的history.go(s)触发,这时history.state的值即对应为pushState中data的值,这样看来,data是可以缓存ajax拉取过来的数据的,不过别高兴的太早,它有大小限制的——640K;反正都是H5,localStorage够用吧!

虽然说Redux起初挺不好理解的,不过说真的,这套做法还是非常不错的,比如,可以借鉴Redux的状态容器机制,咱也构造一个容器保存所有pushState时的数据,以URL为参考,同时用localStorage缓存起来,如果非要将localStorage的存储时间加个期限,我想可以参考:《localStorage也可以限时保存登录信息》;action就是判断是否支持pushState,取消a链接的默认跳转等pjax转化操作;reducer就是先判断该链接地址对应的缓存是否存在来决定是否由ajax GET请求该a链接对应的href,将返回的数据用localStorage保存或更新;dispatch(action)即将数据填充到对应containor;自己实现当然显麻烦,好吧,还是用jquery.pjax.js吧;

pushState会向浏览器历史记录写入一条记录,同时用传入的url替换当前浏览器上的URL,那么pjax其实就是掩人耳目、花拳绣腿的改个URL,最终还是ajax了,是吗?如果你也这么想,那么你真的是天真又可爱,因为对前端而言,咱要做的就是掩人耳目式的修改个URL,然后局部刷新;

既然是掩人耳目式的修改URL,那么如何面对主动刷新后404的现实呢?所以前面说了,要保持信心;当然接下来要做的是后端的事,暂且将pjax的请求统一为与页面刷新时一样的GET请求吧(具体请求方式需前后端协商),前端在pjax请求上加个标记让后端知道该次为pjax请求只需返回一个片段或json,这个标记可以是setHeader或请求参数里加个pjax=1之类的,后端判断这个标记来确定返回一个完整页面还是返回局部内容或局部内容的数据json,这样就可确保pjax后的URL刷新后不是404;

 1 //pjax请求带pjax header
 2 $.ajax({
 3     url:a.attr(‘href‘)||ajaxUrl,
 4     type:‘GET‘,
 5     headers:{pjax:true},
 6     success:function(data){
 7         //localStorage ...
 8         history.pushState(‘‘,‘‘,url);
 9         //containor 填充
10     }
11 });
 1 //Nodejs
 2 app.get(path,function(req,res,next){
 3     var pjax=req.headers[‘pjax‘];
 4     if(pjax){
 5         //...
 6         res.json({
 7             data:page_content
 8         });
 9     }else{
10         //...
11         res.send(page);
12     }
13 });

这样看来,其实并没有想象那么复杂,我想,不是对IE789有特别要求的,都可以考虑使用,为了兼容也可以先判断是否支持pushState,决定是否将链接转化为pjax;这种事前端做的太多了,何乐而不为呢?

就这兼容性。。。。。。你 si bu si sa 

原文来自:花满楼(http://www.famanoder.com/bokes/57af514c21866acc0f77cfc9)

时间: 2024-12-07 01:51:51

pjax不再神秘,hash、state那点事的相关文章

快速探索,音视频技术不再神秘

欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由goo发表于云+社区专栏 与生活紧密相连的音视频,为何有那么多格式?直播.点播以及即时视频其中又有怎样的机制支撑?面对纷繁复杂的音视频知识,应该如何学起?快速探索,音视频技术不再神秘. 前言 面对一门技术,我们熟悉而陌生,我们能够熟练的基于平台的API完成各种各样的需求,掌握平台特性.框架与原理.但随着技术点不断深入,却发现自己存在基础性与深度性的知识盲区. 局限于平台API开发,并不能使我们走的很远.突破技术成长必经的瓶颈期,关

揭开JDBC的神秘面纱,让JDBC不再神秘

1.JDBC是什么? JDBC(Java DataBase Connectivity)java数据库连接 2.JDBC可以做什么?        简单地说,JDBC 可做三件事:与数据库建立连接.发送 操作数据库的语句并处理结果. 3.JDBC的优势? Java 具有坚固.安全.易于使用.易于理解和可从网络上自动下载等特性,是编写数据库应用程序的杰出语言.所需要的只是 Java应用程序与各种不同数据库之间进行对话的方法. 4.JDBC的实现? JDBC定义接口    数据库厂商实现接口    程

【 分享】神秘程序员们那些事之事物的本质(直播中…)

1. 新春对联上联:为系统而生,为框架而死,为debug奋斗一辈子下联:吃符号的亏,上大小写的当,最后死在需求上!横批:杯具程序员. 2.声卡凄切,对电脑晚,检查初歇. 项目需求无绪,可恨处,邮件催发. 执手相看代码,竟无语凝噎. 念去去千行代码,眼皮沉沉电脑破. 多情自古源代码,更那堪,冷落情人节,今宵酒醒何处.电脑旁,晓风残月,此去经年,爱情硬是形同虚设. 便纵有千般无奈,更与何人说? 如果你有什么好玩的关于程序员的故事.对话.代码.愿意以漫画形式分享 请你给小鱼发邮件:[email pro

jquery.pjax.js bug问题解决集锦

jquery.pjax 是一个很好的局部刷新插件,但实际应用过程是还是会有很多小问题,部分问题解决如下: 1.pjax 局部加载时候,IE 存在缓存问题,很容易理解,pjax是通过jquery的ajax加载局部内容的,默认cache=true,这会导致ie下get数据从缓存中获取,解决办法是设置pjax options的cache=false,这样请求会自动变成如下方式: /XXXX?_pjax=%23pjax-container&_=1455092848927 2.pjax 与 jquery

HASH算法

哈希表(Hash Table)是一种特殊的数据结构,它最大的特点就是可以快速实现查找.插入和删除.因为它独有的特点,Hash表经常被用来解决大数据问题,也因此被广大的程序员所青睐.为了能够更加灵活地使用Hash来提高我们的代码效率,今天,我们就谈一谈Hash的那点事. 回到顶部 1. 哈希表的基本思想 我们知道,数组的最大特点就是:寻址容易,插入和删除困难:而链表正好相反,寻址困难,而插入和删除操作容易.那么如果能够结合两者的优点,做出一种寻址.插入和删除操作同样快速容易的数据结构,那该有多好.

Pjax.js防刷新技术

自我感觉良好,所以拿出现在自己用的 Pjax.js 分享给大家 当然 这个版本是 经过本人修改后的版本,跟其它 拿过来就用的 不一样 而且区别还不小 大多的 Pjax 都是 跟后台无关的,而这个版本是跟后台有密切联系的 下面就是说下 代码 以及使用方法,包括后台 内容输出格式 先说说方法吧 引入 jQuery + Pjax.js (本站提供的代码) 下面就关键 运行代码 所接受的参数详解 selector: 绑定 Pjax 的链接 默认:"a[href]" container: 替换内

关于八数码问题中的状态判重的三种解决方法(编码、hash、<set>)

八数码问题搜索有很多高效方法:如A*算法.双向广搜等 但在搜索过程中都会遇到同一个问题,那就是判重操作(如果重复就剪枝),如何高效的判重是8数码问题中效率的关键 下面关于几种判重方法进行比较:编码.hash.set 看到问题初学者最先想到的应该就是用一个vis数组标志一下即可.但是该申请多大的数组呢?一个9维数组(9^9=387420489太大了吧)?如果内存允许这是最高效的办法:O(1) 所以我们现在面临的问题是如何在O(1)的时间复杂度不变的情况下把空间压缩下来: 方法一:编码.解码,我们可

NOSQL 注入

冷门知识 — NoSQL注入知多少 研究起因 接触NoSQL已经近两年了,最近在研究NoSQL注入,写下这篇文章输出我的一些沉淀.翻阅NoSQL注入资料发现这方面的文章很少,尤其是中文资料,又去搜一下MongoDB相关的漏洞,大约300多条记录,绝大多数是「未授权访问」,NoSQL注入寥寥无几.这就更激发我想写出点东西帮助更多人了解它.镜像站参考链接: https://wooyun.shuimugan.com/ 文章均用我最熟悉的MongoDB作为例子. 一点NoSQL注入的概念 基本概念还是相

为什么国外程序员爱用 Mac?

from http://www.vpsee.com/2009/06/why-programmers-love-mac/ Mac 在国外很受欢迎,尤其是在 设计/web开发/IT 人员圈子里.普通用户喜欢 Mac 可以理解,毕竟 Mac 设计美观,简单好用,没有病毒.那么为什么专业人士也对 Mac 情有独钟呢?从个人使用经验来看我想有下面几个原因: 1.Mac OS X 是基于 Unix 的.这一点太重要了,尤其是对开发人员,至少对于我来说很重要,这意味着Unix 下一堆好用的工具都可以随手捡到.