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

hash特點、hashchange事件介紹及其常見應用場景

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

一、hash、hashchange 事件介紹

1、hash 是什么?

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

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

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

2、hashchange 事件

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

二、實際應用場景

1、hash 的簡單應用

頁面中有 3 個不同的a標簽,當點擊不同的a時給filterText賦予不同的值,可利用window.onhashchange事件來實現(xiàn),這樣避免了給每個a標簽分別注冊事件

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

//此函數(shù)監(jiān)聽hash值的變化,來給判斷哪個按鈕被點擊,從而給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 事件的應用

移動端里有這樣一個功能,點擊小圖時在當前頁面上展示大圖,這應該是很常見的場景:

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

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

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

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

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

遇到一個問題,輕應用中的頭部是原生的,當我們的H5頁面中有包含類似日歷、時間、彈出選擇等控件,這個時候的控件背景覆蓋區(qū)域就在頭部之下了,這意味著點擊頭部的時候,這些控件不會隱藏消失,例如返回上一個頁面的時候,日歷等彈出控件就依然堅挺不回家,解決辦法就是利用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、一個小的業(yè)務場景:當用戶進入一個頁面按手機系統(tǒng)自帶的返回按鈕時,彈出一個挽留框,并阻止用戶跳出這一行為。

解決方案:

(1)在進入當前頁面時,通過加 hash 或者 pushState(null,null,window.location.href),在 history 棧中增加一條和當前路徑相同的地址

(2)當用戶點擊返回時,會觸發(fā)window.onhashchange 或 window.onpopstate 事件,讓 hash 或 pushState 行為在用戶要返回時被監(jiān)聽到,此時彈出挽留框,頁面還是之前的頁面沒有變化。

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

一. hasChange 觸發(fā)條件

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

  • 瀏覽器前進后退改變URL
  • 通過a標簽錨點方式改變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)聽事件,但是只有以下兩種情況會觸發(fā)該事件

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

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

  • pushState和replaceState
  • a標簽不能觸發(fā),因為非錨點模式直接跳轉(zhuǎn)了頁面

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

相關(guān)文章

  • Javascript String 字符串操作包

    Javascript String 字符串操作包

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

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

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

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

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

    JavaScript offset實現(xiàn)鼠標坐標獲取和窗口內(nèi)模塊拖動

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

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

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

    玛沁县| 天门市| 阳原县| 高州市| 竹溪县| 台南市| 无为县| 汝南县| 临潭县| 富锦市| 陵川县| 固始县| 拉萨市| 岳普湖县| 衢州市| 博兴县| 揭阳市| 九龙县| 白银市| 湘乡市| 凤阳县| 高密市| 龙门县| 东海县| 垣曲县| 富平县| 长岭县| 桓台县| 奉贤区| 乌拉特前旗| 东海县| 孟村| 娄烦县| 尼勒克县| 甘洛县| 湛江市| 太湖县| 肃北| 珠海市| 泽州县| 商城县|