1.當打開連接的時候,頁面是淡入顯示,而且頁面頂部會顯示加載進度條,頁面顯示完成時,進度條加載滿而且消失。css
2.點擊頁面上的 a 標籤時,顯示加載進度條,而且當前頁面淡出消失,當前頁面淡出消失後,目標頁面則淡入顯示,當頁面顯示完成時,進度條加載滿而且消失。html
1.jquery.pjax.js 點擊直接進入 github 下載,上面帶有英文的文檔。jquery
百度搜索到的一箇中文文檔:http://www.uedsc.com/jquery-pjax-js.htmlgit
2.jquery 的版本的話,這裏使用的是 jquery-1.12.0.min.js github
3.nprogress.js 進度條插件數組
官網地址:http://ricostacruz.com/nprogress/app
github :https://github.com/rstacruz/nprogress函數
不知道是什麼緣由,我根據文檔上的來寫可是老是沒有效果,百度了好久也沒個明確結果,不過仍是找到了方法,大概就是初始化定義的數據不夠完整。this
如今給出一個我這裏可使用的代碼:url
$(document).pjax('a[target!=_blank]', '#container', { fragment: '#main', timeout: 8000 });
$(這裏是要響應 pjax 事件的元素的容器).pjax()函數說明:
1.第一個參數是要響應 pjax 的元素。
這裏表示要捕獲當前頁面中,全部不是新窗口打開的 a 連接。
2.第二個參數是當前頁面要替換成新頁面的元素的索引器(如:Id, class 等)。
3.第三個參數是一個數組,參數看文檔。
3.1.fragment 參數表示,跳轉後的頁面的哪一個容器的內容替換掉當前頁面。
3.2.timeout 表示過時時間,即,若是使用 pjax 加載響應超時的話,則使用默認的跳轉方法。
示例:
1.如今有兩個頁面。
2.當前打開的頁面 A 中,在 body 元素下有一個 div,它的 Id 是「pjax-container」。
3.如今目的是想要無刷新的跳轉到 B 頁面。
3.1.因爲已經在 A 頁面定義了 pjax 的初始化信息:$(document).pjax('a[target!=_blank]', '#pjax-container', { fragment: '#main', timeout: 8000 });。
表示,將 B 頁面中,Id 是「main」的元素替換掉 A 頁面中 Id 是「pjax-container」的元素。
3.2.在 A 頁面增長 Id 是「pjax-container」的元素,並將須要替換掉的內容放到該元素裏。
3.3.在 B 頁面增長 Id 是「main」的元素,一樣將切換後的內容放到該元素裏。
4.完成。
補充說明:關於 JS 失效的問題,該功能不會引發 JS 失效!!!子頁面若是包含 JS 操做,則必須將要用到的 JS 引用也要放到 fragment 參數標記的容器當中纔可使用。
1.基本頁面元素
<!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <title>test</title> <link href="~/Content/Scripts/Nprogress/nprogress.css" rel="stylesheet" /> <link href="~/Content/Css/base.css" rel="stylesheet" /> <script src="~/Content/Scripts/JQuery/jquery-1.12.0.min.js"></script> <script src="~/Content/Scripts/Nprogress/nprogress.js"></script> <script src="~/Content/Scripts/JQuery/Pjax/jquery.pjax.js"></script> <body> <div id="container"> ...頁面內容... <script src="~/Content/Scripts/Application/init.js"></script> </div> <script src="~/Content/Scripts/Application/base.js"></script> </body> </html>
這是一個模板頁
「container」容器就是當前頁面要替換成新頁面的元素。
2.base.css
#container { display: none; }
由於須要淡入淡出效果,因此初始默認讓它們不顯示。
3.base.js
3.1.當用戶經過 URL 直接訪問頁面的時候(即:不是經過站內的 pjax 進行訪問時),也要顯示進度條並淡入顯示頁面內容,因此要加入如下代碼
//打開頁面時加載進度條。 NProgress.start(); window.onload = function () { NProgress.done(); $("#container").fadeIn(); }
3.2.綁定 pjax 事件
/** * 捕獲 a 事件,當點擊後要在 300 毫秒之後纔會跳轉。 */ $(document).on('click', 'a[target!=_blank]', function () { $("#container").fadeOut(); NProgress.start(); var url = $(this).attr("href"); setTimeout(function () { $.pjax({ url: url, container: containerId, fragment: "#container", timeout: 8000 }); }, 300); return false; }); $(document).on('pjax:complete', function () { //加載進度條完成。 NProgress.done(); $("#container").fadeIn(); });
3.2.1.在 jquery 裏,須要綁定動態生成的內容的事件,須要使用 $(document).on 來進行事件綁定。
3.2.2.根據文檔和源碼,能夠知道,實際加載頁面是使用 $.pjax(...) 函數來進行的。
因此,這裏不會使用$(document).pjax(...) 函數來綁定。
3.2.3.這裏捕獲了全部 a 標籤的點擊事件,啓動加載進度條並將當前頁面內容進行淡出操做,而且在 300 毫秒之後執行 pjax 加載目標頁面內容,該函數返回 false,則表示禁用默認的跳轉。
3.2.4.當 pajx 處理完成後,進度條加載完成並淡入顯示頁面內容。
4.init.js
/** * 捕獲 a 事件,當點擊後要在 300 毫秒之後纔會跳轉。 */ $("a").click(function (event) { $("#container").fadeOut(); NProgress.start(); var url = $(this).attr("href"); setTimeout(function () { $.pjax({ url: url, container: '#container', fragment: '#container', timeout: 8000 }); }, 300); return false; }); $(document).on('pjax:complete', function () { //加載進度條完成。
NProgress.done(); $("#container").fadeIn(); });
根據文檔和源碼,能夠知道,實際加載頁面是使用 $.pjax(...) 函數來進行的。
因此,這裏不會使用$(document).pjax(...) 函數來綁定。(實際上是不知道怎麼使用它來進行點擊後等 N 秒才能執行跳轉操做,因此只能放棄這個函數,本身手動實現了)
$("a").click 函數是捕獲全部 a 標籤的點擊事件,啓動加載進度條並將當前頁面內容進行淡出操做,而且在 300 毫秒之後執行 pjax 加載目標頁面內容,該函數返回 false,則表示禁用默認的跳轉。
-----------------------------------------------我是分隔線---------------------------------------------------
到這裏就完成了,只要將具體的頁面內容放到「container」容器裏就能夠了,也就是將「...頁面內容...」替換成具體的內容。
-----------------------------------------------我是分隔線---------------------------------------------------
補充:在使用 jquery.fadeIn() 函數來進行淡入操做的時候,當快速點擊 a 標籤好幾回的時候(淡入操做還在進行中的時候),頁面就會慢慢加載好幾回(點擊多少次就顯示多少次),用戶體驗很是的很差。
這時只要在前面加上.stop(true, true) 就能夠了。
示例:
$("#container").stop(true,true).fadeIn();
-----------------------------------------------下面是完整代碼---------------------------------------------------
base.js
var containerId = '#container'; //打開頁面時加載進度條。 NProgress.start(); window.onload = function () { NProgress.done(); $(containerId).stop(true,true).fadeIn(); } /** * 捕獲 a 事件,當點擊後要在 300 毫秒之後纔會跳轉。 */ $(document).on('click', 'a[target!=_blank][data-pjax!=false]', function () { $(containerId).fadeOut(); NProgress.start(); var url = $(this).attr("href"); setTimeout(function () { $.pjax({ url: url, container: containerId, fragment: containerId, timeout: 8000 }); }, 300); return false; }); $(document).on('pjax:complete', function () { //加載進度條完成。 NProgress.done(); $(containerId).stop(true,true).fadeIn(); });
base.css
#container { display: none; }
html
<!DOCTYPE html> <html lang="cn"> <head> <meta charset="UTF-8"> <title></title> <link href="/static/js/nprogress/nprogress.css" rel="stylesheet"/> <link href="/static/css/base.css" rel="stylesheet"/> <script src="/static/js/jquery/jquery-2.2.0.min.js"></script> <script src="/static/js/jquery/pjax/jquery.pjax.js"></script> <script src="/static/js/nprogress/nprogress.js"></script> </head> <body> <div id="container"> 我是內容 </div> <script src="/static/js/application/base.js"></script> </body> </html>