什么是PJAX呢? 站在应用角度的就是既实现了页面无刷新的效果,同时也产生了浏览器的前进和后退,并且url也会变化。 也不是什么新鲜技术,主要是AJAX+html5 pushState和replaceState。 HTML5 为history提供了pushState和replaceState用来在浏览历史记录中添加和修改记录。javascript
PJAX是在群里看到朋友在聊,孤陋寡闻还没听过这个,平时也没注意观察。附图Github实现了这个效果,当你切换标签时页面局部刷新,浏览URL也会变化。html
众所周知,Ajax能够实现页面的无刷新操做——优势;可是,也会形成另外的问题,没法前进与后退!曾几什么时候,Gmail彷佛借助iframe搞定,现在,HTML5让事情变得如同过家家般简单。html5
当执行Ajax操做的时候,往浏览器history
中塞入一个地址(使用pushState
)(这是无刷新的);因而,返回的时候,经过URL或其余传参,咱们就能够还原到Ajax以前的模样。java
参考张鑫旭的Demo我本身试了一把。jquery
<a href="/Home/Region?area=pudong">浦东</a>|<a href="/Home/Region?area=baoshan">宝山</a>|<a href="/Home/Region?area=jiading">嘉定</a> <ul id="result"> </ul> <script src="~/Scripts/jquery-1.10.2.js"></script> <script> $(function () { var eleMenus = $('a').bind('click', function (event) { var query = this.href.split('?')[1]; if (history.pushState && query) { $('#result').empty(); $.ajax({ url: this.href, type: 'get', dataType: 'json', success: function (data) { $.each(data, function (i, v) { $('<li>' + v.name + ',' + v.price + ',' + v.address + '' + '</li>').appendTo('#result'); }); } }); var title = $(this).text(); if (event && /\d/.test(event.button)) { history.pushState({ title: title }, title, location.href.split ('?')[0] + '?' + query); } } return false; }); var fnHashTrigger = function (target) { var query = location.href.split("?")[1], eleTarget = target || null; if (typeof query == "undefined") { if (eleTarget = eleMenus.get(0)) { // 若是没有查询字符,则使用第一个导航元素的查询字符内容 history.replaceState(null, document.title, location.href.split("#")[0] + "?" + eleTarget.href.split("?")[1]) + location.hash; fnHashTrigger(eleTarget); } } else { eleMenus.each(function () { if (eleTarget === null && this.href.split("?")[1] === query) { eleTarget = this; } }); if (!eleTarget) { // 若是查询序列没有对应的导航菜单,去除查询而后执行回调 history.replaceState(null, document.title, location.href.split("?")[0]); fnHashTrigger(); } else { $(eleTarget).trigger("click"); } } } if (history.pushState) { window.addEventListener('popstate', function () { fnHashTrigger(); }); } fnHashTrigger(); }); </script>
?
后面的)附在demo HTML页面地址后面,使用history.pushState
塞到浏览器历史中。window.onpopstate
事件,经过绑定popstate
事件,就能够根据当前URL地址中的查询内容让对应的菜单执行Ajax载入,实现Ajax的前进与后退效果。history.replaceState
更改当前的浏览器历史,而后触发Ajax操做
http://www.zhangxinxu.com/wordpress/2013/06/html5-history-api-pushstate-replacestate-ajax/ajax
http://www.cnblogs.com/hustskyking/p/history-api-in-html5.htmljson