欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

hash特點(diǎn)、hashchange事件介紹及其常見(jiàn)應(yīng)用場(chǎng)景

 更新時(shí)間:2023年11月12日 08:55:53   作者:古蘭精  
淺析hash特點(diǎn)、hashchange事件介紹及其常見(jiàn)應(yīng)用場(chǎng)景(不同hash對(duì)應(yīng)不同事件處理、移動(dòng)端大圖展示狀態(tài)后退頁(yè)面問(wèn)題、原生輕應(yīng)用頭部后退問(wèn)題、移動(dòng)端自帶返回按鈕二次確認(rèn)問(wèn)題),hashchange和popstate事件觸發(fā)條件

一、hash、hashchange 事件介紹

1、hash 是什么?

hash 屬性是一個(gè)可讀可寫(xiě)的字符串,該字符串是 URL 的錨部分,一般有當(dāng)前頁(yè)面中 href 中 # 地址觸發(fā)。hash 即 URL 中 # 字符后面的部分,具有如下特點(diǎn):

  • 使用瀏覽器訪問(wèn)網(wǎng)頁(yè)時(shí),如果網(wǎng)頁(yè)URL中帶有hash,頁(yè)面就會(huì)定位到 id(或name)與hash值一樣的元素的位置;
  • hash 還有另一個(gè)特點(diǎn),它的改變不會(huì)導(dǎo)致頁(yè)面重新加載;
  • hash 值瀏覽器是不會(huì)隨請(qǐng)求發(fā)送到服務(wù)器端的;
  • 通過(guò) window.location.hash 屬性獲取和設(shè)置 hash 值。

window.location.hash 值的變化會(huì)直接反應(yīng)到瀏覽器地址欄(#后面的部分會(huì)發(fā)生變化),同時(shí),瀏覽器地址欄 hash 值的變化也會(huì)觸發(fā) window.location.hash 值的變化,從而觸發(fā) onhashchange 事件

2、hashchange 事件

  • 當(dāng)URL的片段標(biāo)識(shí)符更改時(shí),將觸發(fā)hashchange事件(跟在#符號(hào)后面的URL部分,包括#符號(hào))
  • hashchange事件觸發(fā)時(shí),事件對(duì)象會(huì)有hash改變前的URL(oldURL)和hash改變后的URL(newURL)兩個(gè)屬性
window.addEventListener('hashchange', function(e) {
    console.log(e.oldURL);
    console.log(e.newURL)
}, false);

二、實(shí)際應(yīng)用場(chǎng)景

1、hash 的簡(jiǎn)單應(yīng)用

頁(yè)面中有 3 個(gè)不同的a標(biāo)簽,當(dāng)點(diǎn)擊不同的a時(shí)給filterText賦予不同的值,可利用window.onhashchange事件來(lái)實(shí)現(xiàn),這樣避免了給每個(gè)a標(biāo)簽分別注冊(cè)事件

<a href="#/" rel="external nofollow" ></a>
<a href="#/active" rel="external nofollow" ></a>
<a href="#/completed" rel="external nofollow" ></a>

//此函數(shù)監(jiān)聽(tīng)hash值的變化,來(lái)給判斷哪個(gè)按鈕被點(diǎn)擊,從而給filterText賦值
let filterText = 'all'
window.onhashchange = function () {
    switch(window.location.hash) {
      case '#/':
        filterText = 'all'
        break
      case '#/active':
        filterText = 'active'
        break
      case '#/completed':
       filterText = 'completed'
    }
}

2、hashchange 事件的應(yīng)用

移動(dòng)端里有這樣一個(gè)功能,點(diǎn)擊小圖時(shí)在當(dāng)前頁(yè)面上展示大圖,這應(yīng)該是很常見(jiàn)的場(chǎng)景:

CSS和Javascript具體怎么實(shí)現(xiàn)的就不再啰嗦了,這里要考慮的問(wèn)題是:當(dāng)進(jìn)入大圖展示狀態(tài)時(shí),如何返回?這是手機(jī)的頁(yè)面,對(duì)于用慣APP的用戶來(lái)說(shuō),他很可能會(huì)點(diǎn)擊左下角的返回鍵。然而這是個(gè)瀏覽器,返回就意味著回到上一頁(yè)而不是退出大圖展示狀態(tài)。

下面講解一下如何利用 hashchange 解決這個(gè)問(wèn)題。我們需要了解的是:當(dāng)URL的hash改變時(shí),雖然頁(yè)面不會(huì)重新加載,但仍然會(huì)被記錄到瀏覽器的歷史記錄中。

也就是說(shuō),如果依次訪問(wèn) a.html、b.html、b.html#abc,然后點(diǎn)擊后退,此時(shí)會(huì)返回 b.html 而不是 a.html。而且,由于hash改變了,所以會(huì)觸發(fā)hashchange事件。這樣一來(lái),只要在進(jìn)入大圖展示狀態(tài)時(shí)加上一個(gè)特定的 hash,點(diǎn)擊返回鍵觸發(fā) hashchange 時(shí)退出此狀態(tài)即可。代碼也很簡(jiǎn)單:

// 假設(shè)大圖展示狀態(tài)的hash為imgSlider
window.addEventListener('hashchange', function(e) {
  var re = /#imgSlider$/;
  if ( re.test(e.oldURL) && !re.test(e.newURL) ) {
    // 假設(shè)imgSlider為大圖展示組件對(duì)象
    imgSlider.hide();
  }
}, false);

3、hashChange 巧妙監(jiān)聽(tīng)原生輕應(yīng)用跳轉(zhuǎn)

遇到一個(gè)問(wèn)題,輕應(yīng)用中的頭部是原生的,當(dāng)我們的H5頁(yè)面中有包含類(lèi)似日歷、時(shí)間、彈出選擇等控件,這個(gè)時(shí)候的控件背景覆蓋區(qū)域就在頭部之下了,這意味著點(diǎn)擊頭部的時(shí)候,這些控件不會(huì)隱藏消失,例如返回上一個(gè)頁(yè)面的時(shí)候,日歷等彈出控件就依然堅(jiān)挺不回家,解決辦法就是利用hashchange監(jiān)聽(tīng)頁(yè)面url中hash的改變:

//頁(yè)面初始化中添加hashchange的監(jiān)聽(tīng)
initialize:function(){
    window.addEventListener("hashchange", this.pageHashChange,false);
},

//隱藏
pageHashChange(){
    if(startTimePicker) startTimePicker.hide();
    if(endTimePicker) endTimePicker.hide();
    if(remindPicker) remindPicker.hide();
},

4、一個(gè)小的業(yè)務(wù)場(chǎng)景:當(dāng)用戶進(jìn)入一個(gè)頁(yè)面按手機(jī)系統(tǒng)自帶的返回按鈕時(shí),彈出一個(gè)挽留框,并阻止用戶跳出這一行為。

解決方案:

(1)在進(jìn)入當(dāng)前頁(yè)面時(shí),通過(guò)加 hash 或者 pushState(null,null,window.location.href),在 history 棧中增加一條和當(dāng)前路徑相同的地址

(2)當(dāng)用戶點(diǎn)擊返回時(shí),會(huì)觸發(fā)window.onhashchange 或 window.onpopstate 事件,讓 hash 或 pushState 行為在用戶要返回時(shí)被監(jiān)聽(tīng)到,此時(shí)彈出挽留框,頁(yè)面還是之前的頁(yè)面沒(méi)有變化。

hashchange和popstate事件觸發(fā)條件

一. hasChange 觸發(fā)條件

hash是URL中#后面那部分,同時(shí)修改hash值不會(huì)引起頁(yè)面的刷新,也不會(huì)向服務(wù)器重新發(fā)送請(qǐng)求。通過(guò)hashchange事件可以監(jiān)聽(tīng)它的變化。改變hash值有以下三種方式:

  • 瀏覽器前進(jìn)后退改變URL
  • 通過(guò)a標(biāo)簽錨點(diǎn)方式改變URL。
  • 通過(guò)window.location.hash改變URL
  • 調(diào)用history的back、go、forward方法

不能觸發(fā)事件的方式

  • pushState和replaceState

備注:以上三種方式均可以觸發(fā)hashchang事件, pushState和replaceState均不能觸發(fā)hashchang事件

二. popstate觸發(fā)條件

history提供了popstate監(jiān)聽(tīng)事件,但是只有以下兩種情況會(huì)觸發(fā)該事件

  • 點(diǎn)擊瀏覽器前進(jìn)后退的按鈕
  • 顯示調(diào)用history的back、go、forward方法

不能觸發(fā)事件的方式

  • pushState和replaceState
  • a標(biāo)簽不能觸發(fā),因?yàn)榉清^點(diǎn)模式直接跳轉(zhuǎn)了頁(yè)面

以上就是hash特點(diǎn)、hashchange事件介紹及其常見(jiàn)應(yīng)用場(chǎng)景的詳細(xì)內(nèi)容,更多關(guān)于hash特點(diǎn)hashchange事件介紹的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • JavaScript實(shí)現(xiàn)字符串轉(zhuǎn)數(shù)組的6種方法總結(jié)

    JavaScript實(shí)現(xiàn)字符串轉(zhuǎn)數(shù)組的6種方法總結(jié)

    數(shù)組是?JavaScript?中最強(qiáng)大的數(shù)據(jù)結(jié)構(gòu),我們常常通過(guò)將字符串轉(zhuǎn)換為數(shù)組來(lái)解決許多算法。本文為大家總結(jié)了6個(gè)JS字符串轉(zhuǎn)數(shù)組的方法,希望對(duì)你有所幫助
    2022-09-09
  • uni-app表單組件(form表單)用法舉例

    uni-app表單組件(form表單)用法舉例

    平時(shí)我們經(jīng)常會(huì)使用到表單,下面這篇文章主要給大家介紹了關(guān)于uni-app表單組件(form表單)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-12-12
  • 比較詳細(xì)的javascript DOM 學(xué)習(xí)筆記

    比較詳細(xì)的javascript DOM 學(xué)習(xí)筆記

    看了很多的js dom學(xué)習(xí)資料,發(fā)現(xiàn)這個(gè)比較詳細(xì),特轉(zhuǎn)載給大家學(xué)習(xí)一下
    2008-06-06
  • Javascript如何實(shí)現(xiàn)對(duì)象扁平化實(shí)例詳解

    Javascript如何實(shí)現(xiàn)對(duì)象扁平化實(shí)例詳解

    這篇文章主要給大家介紹了關(guān)于Javascript如何實(shí)現(xiàn)對(duì)象扁平化的扁平化處理簡(jiǎn)而言之就是對(duì)對(duì)象中的對(duì)象提取出來(lái),放在一個(gè)對(duì)象里面,形象的說(shuō)就是把兒子的后代當(dāng)成自己的兒子,下面相關(guān)資料,需要的朋友可以參考下
    2022-11-11
  • JS操作JSON方法總結(jié)(推薦)

    JS操作JSON方法總結(jié)(推薦)

    JSON是一種輕量級(jí)的數(shù)據(jù)交換格式,采用完全獨(dú)立于語(yǔ)言的文本格式,是理想的數(shù)據(jù)交換格式。本文給大家介紹JS操作JSON方法總結(jié),非常不錯(cuò)具有參考借鑒價(jià)值,感興趣的朋友一起學(xué)習(xí)吧
    2016-06-06
  • js實(shí)現(xiàn)獲取鼠標(biāo)當(dāng)前的位置

    js實(shí)現(xiàn)獲取鼠標(biāo)當(dāng)前的位置

    本文主要介紹了利用javascript實(shí)現(xiàn)獲取鼠標(biāo)當(dāng)前的位置的具體方法,具有很好的參考作用,需要的朋友可以看看
    2016-12-12
  • 微信小程序?qū)崿F(xiàn)歷史搜索功能的全過(guò)程(h5同理)

    微信小程序?qū)崿F(xiàn)歷史搜索功能的全過(guò)程(h5同理)

    最近在使用微信小程序開(kāi)發(fā)的時(shí)候遇到了一個(gè)需求,需要實(shí)現(xiàn)歷史搜索記錄的功能,所以下面這篇文章主要給大家介紹了關(guān)于微信小程序?qū)崿F(xiàn)歷史搜索功能(h5同理)的相關(guān)資料,需要的朋友可以參考下
    2022-12-12
  • IScroll5 中文API參數(shù)說(shuō)明和調(diào)用方法

    IScroll5 中文API參數(shù)說(shuō)明和調(diào)用方法

    IScroll是移動(dòng)頁(yè)面上被使用的一款仿系統(tǒng)滾動(dòng)插件。IScroll5相對(duì)于之前的IScroll4改進(jìn)了許多,使得大家可以更方便的定制所需的功能了。
    2016-05-05
  • JavaScript?微任務(wù)和宏任務(wù)講解

    JavaScript?微任務(wù)和宏任務(wù)講解

    這篇文章主要分享了JavaScript?微任務(wù)和宏任務(wù)講解,在js中,我們一般將所有的任務(wù)都分成兩類(lèi),一種是同步任務(wù),另外一種是異步任務(wù)。而在異步任務(wù)中,又有著更加細(xì)致的分類(lèi),那就是微任務(wù)和宏任務(wù),下面來(lái)一起學(xué)習(xí)js中的微任務(wù)和宏任務(wù)吧
    2021-12-12
  • Navigator?sendBeacon頁(yè)面關(guān)閉也能發(fā)送請(qǐng)求方法示例

    Navigator?sendBeacon頁(yè)面關(guān)閉也能發(fā)送請(qǐng)求方法示例

    這篇文章主要為大家介紹了Navigator?sendBeacon頁(yè)面關(guān)閉也能發(fā)送請(qǐng)求的方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06

最新評(píng)論