亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > JavaScript > 正文

JavaScript不刷新實現瀏覽器的前進后退功能

2024-05-06 16:10:24
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了JavaScript不刷新實現瀏覽器的前進后退功能,本文給出了HTML5解決方案、老舊瀏覽器的寫法等方法,需要的朋友可以參考下
 
 

最近在學習backbone,學習理解backbone就要先理解spa,理解spa就要先了解單頁面應用是如何做到頁面不刷新改變url的。

相較于不同頁面的跳轉,AJAX可以說大大提高了用戶的瀏覽體驗,不用看到頁面切換之間的白屏是件很愜意的事情。但是很多早先的AJAX應用是不支持瀏覽器的前進后退的,這導致了用戶不管在網站里瀏覽到何處,一旦刷新就會立刻回到起初的位置,并且用戶也無法通過瀏覽器的前進后退按鈕來實現瀏覽歷史的切換。

對于第一個問題,解決還算容易,只要用cookie或者localStorage來記錄應用的狀態即可,刷新頁面時讀取一下這個狀態,然后發送相應ajax請求來改變頁面即可。但是第二個問題就很麻煩了,先說下現代瀏覽器的解決方案。

HTML5 解決方案

要了解HTML5如何實現前進后退,就要先了解下history對象和location對象。

history對象

History 對象屬性

1.length:返回瀏覽器歷史列表中的URL數量,用戶在當前標簽每訪問一個頁面,此數量加1。因為隱私原因,URL具體內容不可見。
2.state:與當前網址相關的對象,只能通過pushState和replaceState添加或修改。我們可以可以用它來存儲跟url有關的信息。

History 對象方法

1.history.back()

此方法無參數,觸發后會返回前一個瀏覽的頁面,相當于點擊了瀏覽器的后退按鈕。

2.history.forward()

此方法無參數,觸發后會返回后退前瀏覽的頁面,相當于點擊了瀏覽器的前進按鈕。

3.history.go(number)

此方法接受一個整形變量參數,history.go(-1)相當于后退一頁,history.go(1)相當于前進一頁,history.go(0)會刷新當前頁面。

4.history.pushState(state, title, url)

改變url且不刷新頁面的關鍵就是它了,此方法會改變當前頁面的location.href并且修改當前的history.state對象,執行后history.length會增加1。此方法接受三個參數,

1.state:當前網址相關的對象。
2.title:頁面標題,但是所有瀏覽器都忽略它,要改變標題還是要用document.title。
3.url:一個與當前頁面同域的網址,location.href會變成此值。

5.history.replaceState(state, title, url)

此方法同上,但是它不會改變history.length,只會修改當history.state和location.href。

注意pushState和replaceState第三個參數不可跨域,并且不會觸發瀏覽器的popstate事件和onhashchange事件(chrome33下測試)。

location對象

除了點擊前進/后退按鈕和history事件,還可以通過location的方法和修改location的屬性來改變Url:

location對象的屬性(讀寫):

1.host:域名+端口號
2.hostname:域名
3.port:端口號
4.protocol:協議
5.href:完整路徑
6.origin:協議+域名+端口
7.hash:井號 (#) 開始的 URL(hash)
8.pathname:文檔路徑+文檔名
9.search:(?)后面的內容

可以通過改變location.href或location.hash來達到無刷新的目的。

location對象的方法:

1.assign:改變url的值,并且將當前的url添加到歷史記錄中history.length會增加1。location.assig(‘#' + x)會改變url但是不刷新頁面。
2.reload:刷新頁面。
3.replace:改變url的值,但是history.length不變。使用方法同assign。

popstate事件

當url改變時,比如用戶點擊前進/后退按鈕,history.go(n)(n不等于0),location.hash = x(x不等于當前的location.hash)都會觸發此事件??梢杂盟鼇肀O聽url,來實現各種功能。

復制代碼代碼如下:

    window.onpopstate = function(){
        //do sth
    }

 

onhashchange事件

改變hash值會觸發popstate事件,而觸發popstate事件不一定會觸發onhashchange事件。經過測試:

1.hash改變但是location.pathname不變會觸發onhashchange事件,比如history.pushState(”, ”, ‘#abc');
2.hash和location.pathname一起改變則不觸發,比如history.pushState(”, ”, ‘a#abc');

老舊瀏覽器的寫法

老舊瀏覽器也不支持pushState和replaceState,所以通過popstate(事實上也不支持這個方法)監聽url變化的路走不通。那么只能通過改變url#后面的內容來達到無刷新,但是它們又不支持onhashchange,所以對url的變化是無動于衷的(除了頁面會滾動至頁面對應id的位置)。那么只能祭出大招:輪詢,起一個setInterval來監聽url的值。Like this:

 

復制代碼代碼如下:

var prevHash = window.location.hash; 
var callback = function(){...}
window.setInterval(function() { 
    if (window.location.hash != prevHash) { 
        prevHash = window.location.hash; 
        callback(prevHash); 
    } 
}, 100);

 

當然這樣寫非常非常挫,如果不考慮點擊頁面帶有id的a標簽來改變hash的情況,可以利用設計模式來優雅的實現監聽url。比如經典的觀察者模式,專門用一個類來實現改變hash的功能,然后所有要監聽url變化的類(觀察者)去訂閱這個(被觀察者)類。

 

復制代碼代碼如下:

//改變url的類
function UrlChanger() {
    var _this = this;
    this.observers = [];
    //添加觀察者
    this.addObserver = function(obj) {...}
    //刪除觀察者
    this.deleteObserver = function(obj) {...}
    //通知觀察者
    this._notifyObservers = function() {
        var length = _this.observers.length;
        console.log(length)
        for(var i = 0; i < length; i++) {
            _this.observers[i].update();
        }
    }
    //改變url
    this.changeUrl = function(hash) {
        window.location.hash = hash;
    _this._notifyObservers();
    }
}
//監聽類
function oneOfObservers() {
    var _this = this;
    this.update = function() {...}
}
//實現
var o1 = new UrlChanger();
var o2 = new oneOfObservers();
o1.addObserver(o2);
o1.changeUrl('fun/arg1/arg2/');
//o2 has do sth...
 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
高清视频欧美一级| 欧美精品久久久久久久久| 国产精品狼人色视频一区| 国产精品日韩在线播放| 国产精品成人品| 18一19gay欧美视频网站| 久久大大胆人体| 国产综合久久久久久| 日本人成精品视频在线| 热门国产精品亚洲第一区在线| 久久久久久久久久久网站| 亚洲高清久久网| 亚洲人线精品午夜| 国产精品久久久久影院日本| 中文字幕精品在线视频| 91精品在线影院| 日韩第一页在线| 国产精品美女免费看| 欧美激情一区二区三区在线视频观看| 国产精品99久久久久久久久久久久| 亚洲free性xxxx护士hd| 精品久久久久久久大神国产| 欧美另类99xxxxx| 欧美激情综合色| 正在播放欧美视频| 亚洲成人黄色网址| 91影视免费在线观看| 国产一区二区三区直播精品电影| 97高清免费视频| 欧美在线影院在线视频| 九色精品免费永久在线| 久久精品国产亚洲| 欧美激情手机在线视频| 清纯唯美亚洲综合| 欧美综合一区第一页| 日韩av电影免费观看高清| 在线视频亚洲欧美| 中文国产成人精品| 国产91在线视频| 日韩风俗一区 二区| 国产区精品在线观看| 欧美重口另类videos人妖| 欧美另类暴力丝袜| 97免费视频在线| 亚洲欧洲黄色网| 91免费的视频在线播放| 亚州国产精品久久久| 热门国产精品亚洲第一区在线| 日韩在线观看免费网站| 亚洲大胆人体视频| 北条麻妃一区二区三区中文字幕| 国产福利精品视频| 欧美资源在线观看| 97在线免费观看| 在线观看视频99| 日本精品一区二区三区在线播放视频| 日韩精品视频在线免费观看| 午夜精品一区二区三区在线视| 亚洲精品美女久久| 91爱视频在线| 国产精品第8页| 国产裸体写真av一区二区| 热99精品只有里视频精品| 一区二区三区国产视频| 超薄丝袜一区二区| 91免费综合在线| 国产一区二区三区免费视频| 国产有码一区二区| 欧美成人免费小视频| 成人夜晚看av| 成人免费自拍视频| 欧美在线视频观看| 91精品国产91久久久久久最新| 亚洲精品资源在线| 92看片淫黄大片欧美看国产片| 亚洲男人天堂手机在线| 欧美中文在线观看| 免费97视频在线精品国自产拍| 成人午夜黄色影院| 狠狠操狠狠色综合网| 亚洲一区二区三区久久| 福利一区视频在线观看| 日韩久久精品电影| 久久全球大尺度高清视频| 亚洲影院色在线观看免费| 4p变态网欧美系列| 国产玖玖精品视频| 久久影视电视剧免费网站清宫辞电视| 欧美日韩免费观看中文| 精品中文字幕在线2019| 久久综合88中文色鬼| 欧美成人免费网| 国产精品爱啪在线线免费观看| 久久久之久亚州精品露出| 性欧美xxxx交| 欧美视频在线看| 精品激情国产视频| 国产ts人妖一区二区三区| 精品高清一区二区三区| 国产精品久久久久久网站| 色婷婷久久一区二区| 国产成人a亚洲精品| 91禁国产网站| 国产在线观看精品| 91精品国产91久久久久久| 国产精自产拍久久久久久| 九色精品免费永久在线| 日韩欧美亚洲范冰冰与中字| 成人女保姆的销魂服务| 青青草国产精品一区二区| 精品人伦一区二区三区蜜桃免费| 国产69精品久久久久9999| www.久久撸.com| 欧美网站在线观看| 国产精品专区一| 国产一区二区久久精品| 成人妇女淫片aaaa视频| 亚洲三级免费看| 91精品啪aⅴ在线观看国产| 九九热这里只有在线精品视| 日韩中文字幕免费视频| 欧美电影在线免费观看网站| 97视频在线观看免费高清完整版在线观看| 亚洲性猛交xxxxwww| 欧美日韩国产成人在线观看| 97**国产露脸精品国产| 91久久精品日日躁夜夜躁国产| 亚洲欧美综合精品久久成人| 国产午夜精品全部视频播放| 欧美日韩亚洲精品内裤| 91九色国产在线| 亚洲国产精品久久91精品| 国产精品jvid在线观看蜜臀| 国产99久久精品一区二区 夜夜躁日日躁| 中文字幕亚洲一区| 久久影视电视剧免费网站清宫辞电视| 九九视频直播综合网| 久久久久久久网站| 色噜噜国产精品视频一区二区| 欧美激情一区二区三级高清视频| 久久青草精品视频免费观看| 成人精品久久久| 亚洲香蕉av在线一区二区三区| 在线视频一区二区| 美女扒开尿口让男人操亚洲视频网站| 国产欧美日韩精品在线观看| 欧美成人午夜剧场免费观看| 亚洲一区二区在线播放| 国产精品人成电影| 97在线精品国自产拍中文| 精品国偷自产在线视频| 亚洲欧美激情另类校园| 久久久精品999| 精品成人乱色一区二区| 欧美日韩国产成人高清视频| 日韩精品视频在线观看免费| 欧美成人在线免费视频| 日韩精品高清视频| 久久久999精品视频| 欧美精品手机在线| 国内免费精品永久在线视频| 久久资源免费视频| 最近2019年中文视频免费在线观看| 国内精品小视频在线观看|