pbootcms网站模板|日韩1区2区|织梦模板||网站源码|日韩1区2区|jquery建站特效-html5模板网

創(chuàng)造更好的瀏覽體驗-HTML5 history API

HTML5 history API只包括2個方法:history.pushState()和history.replaceState(),以及1個事件:window.onpopstate。,HTML5中國,中國最大的HTML5中文門戶。

從Ajax翻頁的問題說起

請想象你正在看一個視頻下面的評論,在翻到十幾頁的時候,你發(fā)現(xiàn)一個寫得稍長,但非常有趣的評論。正當(dāng)你想要停下滾輪細看的時候,手殘按到了F5。然后,頁面刷新了,評論又回到了第一頁,所以你又要重新翻一次。

再或者,你想把這個評論發(fā)給別人分享,一面給了別人頁面地址(為什么不直接復(fù)制呢?因為要連帶視頻等場景啊),一面又要加一句囑咐:請翻到下面評論的第XX頁的XX樓。

這就是問題。試想一下,如果瀏覽器能記住你當(dāng)前的狀態(tài)(比如看到了第十幾頁),而不是一刷新就還原,是不是就顯得智能多了?

為什么用Ajax?

用Ajax實現(xiàn)翻頁等內(nèi)容切換是有原因的。在傳統(tǒng)的無Ajax的站點里,頁面A和頁面B可能只有10%的地方是不同的,其他90%的內(nèi)容(尤其是導(dǎo)航、頁腳等公用元素)都是一樣的,但卻仍然需要瀏覽器下載并顯示新的一整個頁面。而如果使用Ajax,不僅節(jié)省了瀏覽器需要下載的資源,而且無刷新切換明顯比頁面跳轉(zhuǎn)更平滑、流暢。

就視頻下面的評論來說,Ajax可以說是必須的。視頻這樣的重量級元素,動不動給你重新加載一次,不能忍。

傳統(tǒng)的跳轉(zhuǎn)翻頁的可取之處

傳統(tǒng)的不使用Ajax的站點,每一個翻頁是一個跳轉(zhuǎn),然后你可以在瀏覽器地址欄里看到諸如?page=2這樣的參數(shù)。每一頁就這樣通過地址欄的URL做了標(biāo)記,每一次請求,瀏覽器都會根據(jù)參數(shù)返回正確的頁碼。

所以,傳統(tǒng)的跳轉(zhuǎn)翻頁,刷新也不會丟失狀態(tài)。

結(jié)合兩者

現(xiàn)在我們就可以想到,如果在Ajax更新頁面局部內(nèi)容的同時,也在地址欄的URL里更新狀態(tài)參數(shù),就可以做出更完美的Ajax翻頁了。

不過,JavaScript修改location的除hash外的任意屬性,頁面都會以新URL重新加載。而唯一不引發(fā)刷新的hash參數(shù)并不會發(fā)送到服務(wù)器,因此服務(wù)器無法獲得狀態(tài)。

然后,HTML5 history API將解決這個問題。

介紹HTML5 history API

HTML5 history API只包括2個方法:history.pushState()history.replaceState(),以及1個事件:window.onpopstate。

history.pushState()

它的完全體是 history.pushState(stateObject, title, url),包括三個參數(shù)。

第1個參數(shù)是狀態(tài)對象,它可以理解為一個拿來存儲自定義數(shù)據(jù)的元素。它和同時作為參數(shù)的url會關(guān)聯(lián)在一起。

第2個參數(shù)是標(biāo)題,是一個字符串,目前各類瀏覽器都會忽略它(以后才有可能啟用,用作頁面標(biāo)題),所以設(shè)置成什么都沒關(guān)系。目前建議設(shè)置為空字符串。

第3個參數(shù)是URL地址,一般會是簡單的?page=2這樣的參數(shù)風(fēng)格的相對路徑,它會自動以當(dāng)前URL為基準(zhǔn)。需要注意的是,本參數(shù)URL需要和當(dāng)前頁面URL同源,否則會拋出錯誤。

調(diào)用pushState()方法將新生成一條歷史記錄,方便用瀏覽器的“后退”和“前進”來導(dǎo)航(“后退”可是相當(dāng)常用的按鈕)。另外,從URL的同源策略可以看出,HTML5 history API的出發(fā)點是很明確的,就是讓無跳轉(zhuǎn)的單站點也可以將它的各個狀態(tài)保存為瀏覽器的多條歷史記錄。當(dāng)通過歷史記錄重新加載站點時,站點可以直接加載到對應(yīng)的狀態(tài)。

history.replaceState()

它和history.pushState()方法基本相同,區(qū)別只有一點,history.replaceState()不會新生成歷史記錄,而是將當(dāng)前歷史記錄替換掉。

window.onpopstate

push的對立就是pop,可以猜到這個事件是在瀏覽器取出歷史記錄并加載時觸發(fā)的。但實際上,它的條件是比較苛刻的,幾乎只有點擊瀏覽器的“前進”、“后退”這些導(dǎo)航按鈕,或者是由JavaScript調(diào)用的history.back()等導(dǎo)航方法,且切換前后的兩條歷史記錄都屬于同一個網(wǎng)頁文檔,才會觸發(fā)本事件。

上面的“同一個網(wǎng)頁文檔”請理解為JavaScript環(huán)境的document是同一個,而不是指基礎(chǔ)URL(去掉各類參數(shù)的)相同。也就是說,只要有重新加載發(fā)生(無論是跳轉(zhuǎn)到一個新站點還是繼續(xù)在本站點),JavaScript全局環(huán)境發(fā)生了變化,popstate事件都不會觸發(fā)。

popstate事件是設(shè)計出來和前面的2個方法搭配使用的。一般只有在通過前面2個方法設(shè)置了同一站點的多條歷史記錄,并在其之間導(dǎo)航(前進或后退)時,才會觸發(fā)這個事件。同時,前面2個方法所設(shè)置的狀態(tài)對象(第1個參數(shù)),也會在這個時候通過事件的event.state返還回來。

此外請注意,history.pushState()history.replaceState()本身調(diào)用時是不觸發(fā)popstate事件的。pop和push畢竟不一樣!

如何應(yīng)用

HTML5 history API的內(nèi)容不多,具體如何應(yīng)用它來改進Ajax翻頁呢?

首先,在服務(wù)器端添加對URL狀態(tài)參數(shù)的支持,例如?page=3將會輸出對應(yīng)頁碼的內(nèi)容(后端模板)。也可以是服務(wù)器端把對應(yīng)頁碼的數(shù)據(jù)給JavaScript,由JavaScript向頁面寫入內(nèi)容(前端模板)。

接下來,使用history.pushState(),在任一次翻頁的同時,也設(shè)置正確的帶參數(shù)的URL。代碼可能是這樣:

newURL = "?page=" + pageNow;
history.pushState(null, "", newURL);

到此,就解決了F5刷新狀態(tài)還原的事了。

不過,還沒有結(jié)束,在瀏覽器中點擊后退,例如從?page=3退到?page=2,會發(fā)現(xiàn)沒有變化。按道理說,這時候也應(yīng)該對應(yīng)變化。這就要用到popstate事件了。

window添加popstate事件,加入這種導(dǎo)航變化時的處理。代碼可能是這樣(jQuery):

$(window).on("popstate", function(event) {

    // 取得之前通過pushState保存的state object,盡管本示例并不打算使用它。
    // jQuery對event做了一層包裝,需要通過originalEvent取得原生event。
    var state = event.originalEvent.state,

        // 本示例直接取URL參數(shù)來處理
        reg = /page=(\d+)/,
        regMatch = reg.exec(location.search),

        // 第1頁的時候既可以是 ?page=1,也可以根本沒有page參數(shù)
        pageNow = regMatch === null ? 1 : +regMatch[1];

    updateByPage(pageNow);
});


這樣,就完成了。這樣看起來是否會覺得還挺容易的呢?在支持HTML5 history API的瀏覽器中,以上部分就已經(jīng)做到了帶頁碼記錄的Ajax翻頁。

有待斟酌的兼容性問題

根據(jù)caniuse上的數(shù)據(jù),IE10+及其他主流瀏覽器都支持HTML5 history API。為保證不支持的瀏覽器不報錯,可以加入是否支持HTML5 history API的判斷:

// 參考自 http://modernizr.com/download/#-history 源碼
var isHistoryApi = !!(window.history && history.pushState);

// ...

if(isHistoryApi){
    // ...
}


這樣,一個Ajax翻頁,在支持HTML5 history API的瀏覽器上,將會智能地保存當(dāng)前頁碼信息,而不支持的瀏覽器仍然可以正常使用,只是不保存頁碼信息(就像改進前那樣)。我認為,按照“漸進增強”的思路,這樣就是最好的了,也就是:只使用較少的代碼優(yōu)化高級瀏覽器的使用體驗。

如果真的想要在各類瀏覽器里都表現(xiàn)一致,擁有這樣的記錄功能呢?

這時候推薦使用Benjamin Lupton的History.js,它提供和HTML5 history API近似的api,會在不支持的瀏覽器里回退到hash形式去處理歷史記錄。盡管為了兼容這種hash的回退形式你可能要額外做點事(hash不會發(fā)送到服務(wù)器端),但它確實可以讓你做到更廣范圍的兼容。

HTML5 history API并不完美

即使只考慮支持HTML5 history API的瀏覽器,它們對HTML5 history API的一些細節(jié)處理也會有差異和問題。History.js提供的只針對HTML5瀏覽器的版本,仍然包含了不少處理兼容問題的代碼。

但是,不完美也沒有關(guān)系。以我的測試結(jié)果,本文所介紹的簡單的寫法,就可以在絕大部分支持HTML5 history API的瀏覽器上正常運行。如果你擔(dān)心有哪些瀏覽器會有潛在問題,去測試那個瀏覽器就可以了。你最后用于兼容處理的自寫代碼很可能遠比一個JavaScript庫少得多,畢竟,你也不一定會喜歡額外引入一個JavaScript庫來完成一個功能吧。

一些相關(guān)內(nèi)容

地址欄里的hash曾是過去被廣泛用來記錄頁面狀態(tài)的標(biāo)記,你可以閱讀W3C Blog的這篇文章了解它的經(jīng)歷。

現(xiàn)在可以在不刷新的狀況下操作瀏覽器地址欄和歷史記錄了,那同一站點的普通鏈接跳轉(zhuǎn)是否都可以轉(zhuǎn)變?yōu)锳jax來提升使用體驗?是的,而且已經(jīng)有了pjaxturbolinks這些專門完成這個功能的作品。

不只是翻頁,HTML5 history API將尤其適合用在大量使用Ajax、包含多個視圖的單頁應(yīng)用。

為一個頁面的每一個狀態(tài)都生成一條歷史記錄不一定合適(會讓用戶的歷史記錄變多變亂),酌情使用replaceState()而不是pushState()來控制歷史記錄的數(shù)量。

結(jié)語

HTML5 history API簡單易學(xué),不多的幾行代碼就可以做到“狀態(tài)記錄”這個小小的改進,如果可以由你選擇“漸進增強”,它還真的可以上線!

【網(wǎng)站聲明】本站除付費源碼經(jīng)過測試外,其他素材未做測試,不保證完整性,網(wǎng)站上部分源碼僅限學(xué)習(xí)交流,請勿用于商業(yè)用途。如損害你的權(quán)益請聯(lián)系客服QQ:2655101040 給予處理,謝謝支持。

相關(guān)文檔推薦

由于實際運行環(huán)境是在瀏覽器中,因此性能還取決于JavaScript解釋器的效率,指定的FPS幀速在低性能解釋器中可能不會達到,所以這部分不是開發(fā)者能夠決定的,開發(fā)者能作的是盡可能通
本文將使用HTML5提供的VideoAPI做一個自定義的視頻播放器,需要用到HTML5提供的video標(biāo)簽、以及HTML5提供的對JavascriptAPI的擴展。,HTML5中國,中國最大的HTML5中文門戶。
隨著 Hybrid 應(yīng)用的豐富,HTML5 工程師們已經(jīng)不滿足于把桌面端體驗簡單移植到移動端,他們覬覦移動原生應(yīng)用人性化的操作體驗,特別是原生應(yīng)用與生俱來的豐富的手勢系統(tǒng)。HTML5 沒有提
你想要在自己網(wǎng)站上分享一個產(chǎn)品,或者是一個作品集,又或者僅僅只是一個靈感。在你發(fā)布到網(wǎng)上之前,你想讓它看起來有吸引力,專業(yè),或者至少得看起來像那么回事。那么你接下
H5廣告,包括H5廣告的設(shè)計流程,究竟有什么講究,和階段。為了能幫助更多的人了解H5廣告,我專門做了一個講義。同時,也讓我意外的收到了非常好反饋和認!這是對我的極大鼓勵!我的
本文主要內(nèi)容有:框架與組件、構(gòu)建生態(tài)、開發(fā)技巧與調(diào)試、html、css與重構(gòu)、native/hybrid/桌面開發(fā)、前端/H5優(yōu)化、全棧/全端開發(fā)、研究實驗、數(shù)據(jù)分析與監(jiān)控、其它軟技能、前端技術(shù)網(wǎng)
主站蜘蛛池模板: atcc网站,sigma试剂价格,肿瘤细胞现货,人结肠癌细胞株购买-南京科佰生物 | 成都热收缩包装机_袖口式膜包机_高速塑封机价格_全自动封切机器_大型套膜机厂家 | 编织人生 - 权威手工编织网站,编织爱好者学习毛衣编织的门户网站,织毛衣就上编织人生网-编织人生 | 全自动烧卖机厂家_饺子机_烧麦机价格_小笼汤包机_宁波江北阜欣食品机械有限公司 | 本安接线盒-本安电路用接线盒-本安分线盒-矿用电话接线盒-JHH生产厂家-宁波龙亿电子科技有限公司 | 电磁辐射仪-电磁辐射检测仪-pm2.5检测仪-多功能射线检测仪-上海何亦仪器仪表有限公司 | 厂厂乐-汇聚海量采购信息的B2B微营销平台-厂厂乐官网 | 暖气片十大品牌厂家_铜铝复合暖气片厂家_暖气片什么牌子好_欣鑫达散热器 | 贵州科比特-防雷公司厂家提供贵州防雷工程,防雷检测,防雷接地,防雷设备价格,防雷产品报价服务-贵州防雷检测公司 | 单螺旋速冻机-双螺旋-流态化-隧道式-食品速冻机厂家-广州冰泉制冷 | 武汉天安盾电子设备有限公司 - 安盾安检,武汉安检门,武汉安检机,武汉金属探测器,武汉测温安检门,武汉X光行李安检机,武汉防爆罐,武汉车底安全检查,武汉液体探测仪,武汉安检防爆设备 | 方源木业官网-四川木门-全国木门专业品牌 | 武汉创亿电气设备有限公司_电力检测设备生产厂家 | 高低温万能试验机-复合材料万能试验机-馥勒仪器 | 没斑啦-专业的祛斑美白嫩肤知识网站-去斑经验分享 | 红酒招商加盟-葡萄酒加盟-进口红酒代理-青岛枞木酒业有限公司 | 橡胶弹簧|复合弹簧|橡胶球|振动筛配件-新乡市永鑫橡胶厂 | 胶辊硫化罐_胶鞋硫化罐_硫化罐厂家-山东鑫泰鑫智能装备有限公司 意大利Frascold/富士豪压缩机_富士豪半封闭压缩机_富士豪活塞压缩机_富士豪螺杆压缩机 | 膜片万向弹性联轴器-冲压铸造模具「沧州昌运模具」 | 钢木实验台-全钢实验台-化验室通风柜-实验室装修厂家-杭州博扬实验设备 | vr安全体验馆|交通安全|工地安全|禁毒|消防|安全教育体验馆|安全体验教室-贝森德(深圳)科技 | 精密五金加工厂-CNC数控车床加工_冲压件|蜗杆|螺杆加工「新锦泰」 | 北京开业庆典策划-年会活动策划公司-舞龙舞狮团大鼓表演-北京盛乾龙狮鼓乐礼仪庆典策划公司 | 净化车间装修_合肥厂房无尘室设计_合肥工厂洁净工程装修公司-安徽盛世和居装饰 | 东莞猎头公司_深圳猎头公司_广州猎头公司-广东万诚猎头提供企业中高端人才招聘服务 | 细胞染色-流式双标-试剂盒免费代做-上海研谨生物科技有限公司 | 硫化罐-胶管硫化罐-山东鑫泰鑫智能装备有限公司 | 置顶式搅拌器-优莱博化学防爆冰箱-磁驱搅拌器-天津市布鲁克科技有限公司 | 东莞注册公司-代办营业执照-东莞公司注册代理记账-极刻财税 | 拉卡拉POS机官网 - 官方直营POS机办理|在线免费领取 | 西安烟道厂家_排气道厂家_包立管厂家「陕西西安」推荐西安天宇烟道 | 自动配料系统_称重配料控制系统厂家| 昆山新莱洁净应用材料股份有限公司-卫生级蝶阀,无菌取样阀,不锈钢隔膜阀,换向阀,离心泵 | 防爆型气象站_农业气象站_校园气象站_农业四情监测系统「山东万象环境科技有限公司」 | 至顶网| 牛奶检测仪-乳成分分析仪-北京海谊 | 不锈钢复合板厂家_钛钢复合板批发_铜铝复合板供应-威海泓方金属复合材料股份有限公司 | 环讯传媒,永康网络公司,永康网站建设,永康小程序开发制作,永康网站制作,武义网页设计,金华地区网站SEO优化推广 - 永康市环讯电子商务有限公司 | PSI渗透压仪,TPS酸度计,美国CHAI PCR仪,渗透压仪厂家_价格,微生物快速检测仪-华泰和合(北京)商贸有限公司 | 云阳人才网_云阳招聘网_云阳人才市场_云阳人事人才网_云阳人家招聘网_云阳最新招聘信息 | 中空玻璃生产线,玻璃加工设备,全自动封胶线,铝条折弯机,双组份打胶机,丁基胶/卧式/立式全自动涂布机,玻璃设备-山东昌盛数控设备有限公司 |