popstate事件和history的pushState俱恶、replaceState方法

pushState 和 replaceState

HTML5新接口,可以改變網(wǎng)址(存在跨域限制)而不跳轉(zhuǎn)頁(yè)面痊硕,這個(gè)強(qiáng)大的特性后來(lái)用到了單頁(yè)面應(yīng)用如:vue-router赊级,react-router-dom 中。
注意:vue-router 的 hash 模式是用的onhashchange岔绸,與此功能無(wú)關(guān)。

window.history.pushState(state, title, targetURL);
@狀態(tài)對(duì)象:傳給目標(biāo)路由的信息,可為空
@頁(yè)面標(biāo)題:目前所有瀏覽器都不支持,填空字符串即可
@可選url:目標(biāo)url橡伞,不會(huì)檢查url是否存在盒揉,且不能跨域。如不傳該項(xiàng),即給當(dāng)前url添加data
window.history.replaceState(state, title, targetURL);
@類似于pushState,但是會(huì)直接替換掉當(dāng)前url,而不會(huì)在history中留下記錄

popstate事件

popstate事件會(huì)在點(diǎn)擊后退兑徘、前進(jìn)按鈕(或調(diào)用history.back()刚盈、history.forward()history.go()方法)時(shí)觸發(fā)挂脑。前提是不能真的發(fā)生了頁(yè)面跳轉(zhuǎn),而是在由history.pushState()或者history.replaceState()形成的歷史節(jié)點(diǎn)中前進(jìn)后退
注意:直接調(diào)用history.pushState()或者history.replaceState()不會(huì)觸發(fā)popstate事件藕漱。

window.onpopstate = function(event) {
  console.log(event.state);
  console.log(window.history.state);
};

以上兩種方式皆可獲取之前在pushStatereplaceState中傳入的state


監(jiān)聽(tīng)pushState和replaceState

由于history.pushState()或者history.replaceState()不會(huì)觸發(fā)popstate,需要自己定義事件以進(jìn)行監(jiān)聽(tīng)崭闲。

  • 重寫pushState肋联,先驅(qū)動(dòng)自定義回調(diào)函數(shù)/事件,再調(diào)用原生的pushState
(function (history) {
  var pushState = history.pushState;
  history.pushState = function (state) {
    if (typeof history.onpushstate == "function") {
      history.onpushstate({ state: state });
    }
    return pushState.apply(history, arguments);
  };
})(window.history);
history.onpushstate = function (e) {
  console.log('pushed', e);//e即state
}

const state = { 'page_id': 1 }
const title = ''
const url = 'hello.html'
history.pushState(state, title, url);
var _wr = function(type) {
  var orig = history[type];
  return function() {
    var e = new Event(type);
    e.arguments = arguments;
    window.dispatchEvent(e);
    var rv = orig.apply(this, arguments);
    return rv;
  };
};
history.pushState = _wr('pushState');
history.replaceState = _wr('replaceState');
window.addEventListener('pushState', function(e) {
  var path = e && e.arguments.length > 2 && e.arguments[2];
  var url = /^http/.test(path) ? path : (location.protocol + '//' + location.host + path);
  console.log('old:'+location.href,'new:'+url);
});
window.addEventListener('replaceState', function(e) {
  var path = e && e.arguments.length > 2 && e.arguments[2];
  var url = /^http/.test(path) ? path : (location.protocol + '//' + location.host + path);
  console.log('old:'+location.href,'new:'+url);
});
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末刁俭,一起剝皮案震驚了整個(gè)濱河市橄仍,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖侮繁,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件虑粥,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡宪哩,警方通過(guò)查閱死者的電腦和手機(jī)娩贷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)锁孟,“玉大人育勺,你說(shuō)我怎么就攤上這事÷掎” “怎么了涧至?”我有些...
    開(kāi)封第一講書人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)桑包。 經(jīng)常有香客問(wèn)我南蓬,道長(zhǎng),這世上最難降的妖魔是什么哑了? 我笑而不...
    開(kāi)封第一講書人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任赘方,我火速辦了婚禮,結(jié)果婚禮上弱左,老公的妹妹穿的比我還像新娘窄陡。我一直安慰自己,他們只是感情好拆火,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布跳夭。 她就那樣靜靜地躺著,像睡著了一般们镜。 火紅的嫁衣襯著肌膚如雪币叹。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 49,749評(píng)論 1 289
  • 那天模狭,我揣著相機(jī)與錄音颈抚,去河邊找鬼。 笑死嚼鹉,一個(gè)胖子當(dāng)著我的面吹牛贩汉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播锚赤,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼匹舞,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了宴树?” 一聲冷哼從身側(cè)響起策菜,我...
    開(kāi)封第一講書人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后又憨,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體翠霍,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年蠢莺,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了寒匙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡躏将,死狀恐怖锄弱,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情祸憋,我是刑警寧澤会宪,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站蚯窥,受9級(jí)特大地震影響掸鹅,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜拦赠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一巍沙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧荷鼠,春花似錦句携、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至喳篇,卻和暖如春敞临,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背麸澜。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留奏黑,地道東北人炊邦。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像熟史,于是被迫代替她去往敵國(guó)和親馁害。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 瀏覽器窗口有一個(gè)history對(duì)象蹂匹,用來(lái)保存瀏覽歷史碘菜。 如果當(dāng)前窗口先后訪問(wèn)了三個(gè)網(wǎng)址,那么history對(duì)象就包...
    君臨12138閱讀 3,041評(píng)論 0 3
  • 概述 瀏覽器窗口有一個(gè)history對(duì)象,用來(lái)保存瀏覽歷史忍啸。 如果當(dāng)前窗口先后訪問(wèn)了三個(gè)網(wǎng)址仰坦,那么history對(duì)...
    許先生__閱讀 739評(píng)論 0 2
  • 引言 最近心氣比較浮躁,潛意識(shí)告訴自己慢一點(diǎn)计雌,再慢一點(diǎn)悄晃,感覺(jué)只是說(shuō)給自己聽(tīng)的。 為了緩和一下自己扭曲的心態(tài)凿滤,寫篇博...
    OzanShareing閱讀 2,753評(píng)論 0 0
  • 1.概述 window.history屬性指向 History 對(duì)象妈橄,它表示當(dāng)前窗口的瀏覽歷史。History 對(duì)...
    Kevin丶CK閱讀 419評(píng)論 0 3
  • 編程式導(dǎo)航 1 .用在可復(fù)用的路由視圖里面翁脆,比如所有的需要跳轉(zhuǎn)到一個(gè)文章具體內(nèi)容的路由眷蚓,每一次跳轉(zhuǎn)到新路由的時(shí)候,...
    skoll閱讀 647評(píng)論 0 1