首頁 web前端 js教程 ajax和html5無刷新改變頁面URL

ajax和html5無刷新改變頁面URL

Nov 22, 2016 pm 01:59 PM
ajax html5

表現

如果你使用chrome或firefox等瀏覽器訪問本部落格、github.com、plus.google.com等網站時,細心的你會發現頁面之間的點擊是透過ajax異步請求的,同時頁面的URL發生了改變。並且能夠很好的支援瀏覽器前進和後退。

是什麼有這麼強大的功能呢?

HTML5裡引用了新的API,history.pushState和history.replaceState,就是透過這個介面做到無刷新改變頁面URL的。

與傳統的AJAX的區別

傳統的ajax有如下的問題:

1、可以無刷新改變頁面內容,但無法改變頁面URL

2、為了更好的可訪問性,內容改變後,通常改變URL的hash

3、hash的方式不能很好的處理瀏覽器的前進、後退等問題

4、進而瀏覽器引入了onhashchange的接口,不支持的瀏覽器只能定時去判斷hash是否改變

5、但這種方式對搜尋引擎很不友善

6、twitter和google約定了使用#!xxx(即hash第一個字元為!),搜尋引擎支援。

為了解決傳統ajax帶來的問題,HTML5裡引入了新的API,即:history.pushState, history.replaceState

可以透過pushState和replaceState介面操作瀏覽器歷史,並且改變目前頁面的URL。

pushState是將指定的URL加入瀏覽器歷史裡,replaceState是將指定的URL取代目前的URL。

如何使用

var state = {
    title: title,
    url: options.url,
    otherkey: othervalue
};
window.history.pushState(state, document.title, url);
登入後複製

state物件除了要title和url之外,你也可以加入其他的數據,例如:還想將一些發送ajax的配置給保存起來。

replaceState和pushState是相似的,這裡就不多介紹了。

如何回應瀏覽器的前進、後退操作

window物件上提供了onpopstate事件,上面傳遞的state物件會成為event的子對象,這樣就可以拿到儲存的title和URL了。

window.addEventListener('popstate', function(e){
    if (history.state){
        var state = e.state;
        //do something(state.url, state.title);
    }
}, false);
登入後複製

這樣就可以結合ajax和pushState完美的進行無刷新瀏覽了。

一些限制

1、傳遞的URL必須是同域下的,無法跨域

2、state物件雖然可以儲存很多自訂的屬性,但對於不可序列化的物件則不能存儲,如:DOM對象。

對應後端的一些處理

這種模式下除了當前使用ajax可以無刷新瀏覽外,還要保證直接請求改變的URL後也可以正常瀏覽,所以後端要對這些處理下。

1、對使用pushState的ajax發送一個特殊的頭,如: setRequestHeader(‘PJAX’, ‘true’)。

2、後端取得到有PJAX=true的header時,將頁面中通用的部分都不輸出。例如:PHP可以透過下面的判斷

function is_pjax(){
    return array_key_exists('HTTP_X_PJAX', $_SERVER) && $_SERVER['HTTP_X_PJAX'] === 'true';
}
登入後複製

雖然介面上只有pushState、replaceState、onpopstate,但使用的時候需要做很多的處理。

針對這個已經寫好了一個基於jquery的插件,已經將ajax+history.pushState封裝成pjax, 專案地址: https://github.com/welefen/pjax, 目前支援jquery, qwrap, kissy 3個版本

此外,如果想考慮到HTML4和HTML5下都能有次效果,可以參考history.js,專案地址為:https://github.com/browserstate/history.js。

參考資料:

1、Introducing the HTML5 History API

2、Manipulating the browser history

3、Session history and navigation


3、Session history and navigation

🎜🎜🎜🎜
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1664
14
CakePHP 教程
1423
52
Laravel 教程
1318
25
PHP教程
1269
29
C# 教程
1248
24
HTML 中的表格邊框 HTML 中的表格邊框 Sep 04, 2024 pm 04:49 PM

HTML 表格邊框指南。在這裡,我們以 HTML 中的表格邊框為例,討論定義表格邊框的多種方法。

HTML 中的巢狀表 HTML 中的巢狀表 Sep 04, 2024 pm 04:49 PM

這是 HTML 中巢狀表的指南。這裡我們討論如何在表中建立表格以及對應的範例。

HTML 左邊距 HTML 左邊距 Sep 04, 2024 pm 04:48 PM

HTML 左邊距指南。在這裡,我們討論 HTML margin-left 的簡要概述及其範例及其程式碼實作。

HTML 表格佈局 HTML 表格佈局 Sep 04, 2024 pm 04:54 PM

HTML 表格佈局指南。在這裡,我們詳細討論 HTML 表格佈局的值以及範例和輸出。

HTML 輸入佔位符 HTML 輸入佔位符 Sep 04, 2024 pm 04:54 PM

HTML 輸入佔位符指南。在這裡,我們討論 HTML 輸入佔位符的範例以及程式碼和輸出。

HTML 有序列表 HTML 有序列表 Sep 04, 2024 pm 04:43 PM

HTML 有序列表指南。在這裡我們也分別討論了 HTML 有序列表和類型的介紹以及它們的範例

HTML onclick 按鈕 HTML onclick 按鈕 Sep 04, 2024 pm 04:49 PM

HTML onclick 按鈕指南。這裡我們分別討論它們的介紹、工作原理、範例以及各個事件中的onclick事件。

在 HTML 中移動文字 在 HTML 中移動文字 Sep 04, 2024 pm 04:45 PM

HTML 中的文字移動指南。在這裡我們討論一下marquee標籤如何使用語法和實作範例。

See all articles