最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

一、hash、hashchange 事件介紹

1、hash 是什么?

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

  • 使用瀏覽器訪問網(wǎng)頁時(shí),如果網(wǎng)頁URL中帶有hash,頁面就會(huì)定位到 id(或name)與hash值一樣的元素的位置;
  • hash 還有另一個(gè)特點(diǎn),它的改變不會(huì)導(dǎo)致頁面重新加載;
  • hash 值瀏覽器是不會(huì)隨請(qǐng)求發(fā)送到服務(wù)器端的;
  • 通過 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)用

頁面中有 3 個(gè)不同的a標(biāo)簽,當(dāng)點(diǎn)擊不同的a時(shí)給filterText賦予不同的值,可利用window.onhashchange事件來實(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)聽hash值的變化,來給判斷哪個(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īng)該是很常見的場(chǎng)景:

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

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

也就是說,如果依次訪問 a.html、b.html、b.html#abc,然后點(diǎn)擊后退,此時(shí)會(huì)返回 b.html 而不是 a.html。而且,由于hash改變了,所以會(huì)觸發(fā)hashchange事件。這樣一來,只要在進(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)聽原生輕應(yīng)用跳轉(zhuǎn)

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

//頁面初始化中添加hashchange的監(jiān)聽
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è)頁面按手機(jī)系統(tǒng)自帶的返回按鈕時(shí),彈出一個(gè)挽留框,并阻止用戶跳出這一行為。

解決方案:

(1)在進(jìn)入當(dāng)前頁面時(shí),通過加 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)聽到,此時(shí)彈出挽留框,頁面還是之前的頁面沒有變化。

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

一. hasChange 觸發(fā)條件

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

  • 瀏覽器前進(jìn)后退改變URL
  • 通過a標(biāo)簽錨點(diǎn)方式改變URL。
  • 通過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)聽事件,但是只有以下兩種情況會(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)了頁面

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

相關(guān)文章

  • Javascript String 字符串操作包

    Javascript String 字符串操作包

    提供一個(gè) JS String 包,包含了一些常用的對(duì)字符串操作的函數(shù),詳細(xì)的請(qǐng)看源碼及演示
    2010-10-10
  • 深入分析下javascript中的[]()+!

    深入分析下javascript中的[]()+!

    本文是筆者遇到的一個(gè)很無奈的題目之后,不得不仔細(xì)研究一番,有需要的小伙伴來參考下吧。
    2015-07-07
  • JavaScript中使用構(gòu)造器創(chuàng)建對(duì)象無需new的情況說明

    JavaScript中使用構(gòu)造器創(chuàng)建對(duì)象無需new的情況說明

    JS中創(chuàng)建對(duì)象可以直接使用直接量的方式,這里討論的是定義一個(gè)構(gòu)造器(function)的情況
    2012-03-03
  • JavaScript offset實(shí)現(xiàn)鼠標(biāo)坐標(biāo)獲取和窗口內(nèi)模塊拖動(dòng)

    JavaScript offset實(shí)現(xiàn)鼠標(biāo)坐標(biāo)獲取和窗口內(nèi)模塊拖動(dòng)

    在頁面開發(fā)時(shí)我們少不了各種鼠標(biāo)交互動(dòng)作,那么JavaScript中如何實(shí)現(xiàn)鼠標(biāo)坐標(biāo)獲取和窗口內(nèi)模塊拖動(dòng),本文就詳細(xì)的介紹一下,感興趣的可以了解一下
    2021-05-05
  • 在微信小程序里使用watch和computed的方法

    在微信小程序里使用watch和computed的方法

    這篇文章主要介紹了在微信小程序里使用watch和computed的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-08-08
  • 最新評(píng)論

    革吉县| 中超| 安岳县| 黑河市| 香格里拉县| 南川市| 葵青区| 广河县| 阿拉尔市| 南京市| 珲春市| 日照市| 龙口市| 安达市| 苍南县| 微博| 临安市| 融水| 周至县| 荔浦县| 蓬安县| 余姚市| 酒泉市| 新丰县| 杭锦旗| 开阳县| 大洼县| 天水市| 安吉县| 洛南县| 临漳县| 商城县| 饶河县| 彝良县| 阿拉善盟| 襄樊市| 延安市| 兴安盟| 中牟县| 龙陵县| 宁强县|