JavaScript hashchange 事件
關於事件處理函式註冊,可以參閱如何註冊事件處理函式一章節。
hashchange 事件是在hash值改變時觸發,那麼首先解決hash是什麼。
可能大家知道location.hash屬性,它可以設定或者獲取URL的錨部分,也就是從#號開始的部分。
http://www.softwhy.com/ant.html#do,#do就是連結的錨部分。
當錨部分的值發生改變時,hashchange 事件就會觸發。
首先介紹一下錨點連結特點:
(1).利用錨點連結也實現定位效果,具體參閱HTML 錨點定位一章節。
(2).伺服器不會接收到錨點的內容。
(3).錨點值的改變不會重新整理頁面,可以產生錨點定位改變效果。
觸發hashchange事件主要手段主要有如下幾種:
(1).點選頁面的錨點連結修改hash值。
(2).location物件的hash和href屬性重置錨點連結值。
瀏覽器支援:
(1).IE8+瀏覽器支援此事件。
(2).edge瀏覽器支援此事件。
(3).火狐瀏覽器支援此事件。
(4).Opera瀏覽器支援此事件。
(5).谷歌瀏覽器支援此事件。
(6).safria瀏覽器支援此事件。
下面通過程式碼例項演示一下如何觸發hashchange事件。
此事件也有很強的實際應用價值,文章的最後會給出一個利用此事件實現的選項卡效果。
程式碼例項:
[HTML] 純文字檢視 複製程式碼執行程式碼<!DOCTYPE html> <html> <head> <meta charset=" utf-8"> <meta name="author" content="http://www.softwhy.com/" /> <title>螞蟻部落</title> <style type="text/css"> a{ width:60px; height:20px; background:#F90; font-size:12px; text-align:center; line-height:20px; position:fixed; right:0px; top:50px; cursor:pointer; display:block; text-decoration:none; } #ant{ width:100%; height:50px; line-height:50px; text-align:center; background:#CCC; margin-top:300px; } </style> <script> window.onhashchange = function () { let odiv = document.getElementById("ant"); odiv.innerHTML = "螞蟻部落"; } </script> </head> <body style="height:1200px;"> <a href="#ant">點選定位</a> <div id="ant"></div> </body> </html>
程式碼分析如下:
(1).點選連結後,能夠觸發事件,因為連結的錨點(hash)發生改變,觀察位址列。
(2).第一次點選後,需要手動刪除位址列中的錨點,進行下一次測試,否則無法演示效果。
上面僅僅是演示了hashchange事件觸發的一個場景,其實利用此事件可以進行一些遍歷的操作。
主要基於如下幾點:
(1).hash值的修改不會重新整理頁面。
(2).可以通過一些物件屬性獲取新的hash值。
(3).當hansh值改變時,利用hashchange事件處理函式達成我們的目標。
下面看一個選項卡切換例項:
[HTML] 純文字檢視 複製程式碼執行程式碼<!DOCTYPE html> <html> <head> <meta charset=" utf-8"> <meta name="author" content="http://www.softwhy.com/" /> <title>螞蟻部落</title> <style> *{ margin:0; padding:0; } a{ text-decoration: none; color:#fff; } .task-list{ list-style: none; overflow: hidden; width: 500px; margin:auto; padding: 10px; border:1px solid #DCDCDC; border-bottom:none; background: #2aabd2; } .task-list li{ float: left; margin-right: 30px; } .task-list li>a{ padding:10px 15px; } .task-content{ width: 500px; margin:auto; height:100px; padding: 10px; border:1px solid #DCDCDC; } .task-content div{ display: none; padding: 15px; } .task-content div.active{ display: block; } </style> <script> let hashStr; function watchHash(){ let hash = window.location.hash.slice(1); hashStr = hash; if(hashStr){ let divList=document.querySelectorAll(".task-content div"); let odiv=document.querySelector("#"+hashStr); for(let index=0;index<divList.length;index++){ divList[index].classList.remove("active"); } odiv.classList.add("active"); } } window.onload=function(){ watchHash(); addEventListener("hashchange",watchHash); } </script> </head> <body> <ul class="task-list"> <li><a href="#one">標題一</a></li> <li><a href="#two">標題二</a></li> <li><a href="#tree">標題三</a></li> </ul> <div class="task-content"> <div id="one" class="active">螞蟻部落一</div> <div id="two">螞蟻部落二</div> <div id="tree">螞蟻部落三</div> </div> </body> </html>
上述程式碼利用hashchange事件實現了選項卡切換效果,下面簡單介紹一下實現原理。
(1).預設只有第一個選項卡內容是顯示的。
(2).標題連結的href的恰好與它相關聯的內容div的id屬性值相對應。
(2).點選標題會修改url的hash值,那麼就會觸發hashchange事件。
(3).事件處理函式獲取新的hash值,通過此值獲取將要顯示的內容div。
(4).通過for迴圈首先將所有的內容div隱藏,然後再將應該顯示的div顯示出來。
相關閱讀:
(1).slice方法參閱JavaScript 字串slice()一章節。
(2).document.querySelectorAll方法參閱querySelectorAll() 方法一章節。
(3).document.querySelector方法參閱querySelector() 方法一章節。
(4).classList屬性參閱JavaScript classList 屬性一章節
相關文章
- JavaScript事件JavaScript事件
- JavaScript 事件JavaScript事件
- javaScript事件(一)事件流JavaScript事件
- javaScript事件(三)事件物件JavaScript事件物件
- JavaScript dragstart 事件JavaScript事件
- JavaScript drag 事件JavaScript事件
- JavaScript dragend 事件JavaScript事件
- JavaScript dragenter 事件JavaScript事件
- JavaScript dragover 事件JavaScriptGo事件
- JavaScript dragleave 事件JavaScript事件
- JavaScript drop 事件JavaScript事件
- JavaScript storage 事件JavaScript事件
- JavaScript mouseout 事件JavaScript事件
- JavaScript事件模型JavaScript事件模型
- JavaScript mouseenter 事件JavaScript事件
- JavaScript animationIteration 事件JavaScript事件
- JavaScript animationStart 事件JavaScript事件
- JavaScript dblclick 事件JavaScript事件
- JavaScript mousemove 事件JavaScript事件
- JavaScript input 事件JavaScript事件
- JavaScript reset 事件JavaScript事件
- JavaScript resize 事件JavaScript事件
- JavaScript mousedown 事件JavaScript事件
- JavaScript focus 事件JavaScript事件
- JavaScript blur 事件JavaScript事件
- JavaScript mouseup 事件JavaScript事件
- JavaScript mouseover 事件JavaScript事件
- JavaScript 事件冒泡JavaScript事件
- JavaScript submit 事件JavaScriptMIT事件
- JavaScript change 事件JavaScript事件
- JavaScript animationEnd 事件JavaScript事件
- JavaScript transitionEnd 事件JavaScript事件
- JavaScript click 事件JavaScript事件
- JavaScript abort事件JavaScript事件
- JavaScript scroll 事件JavaScript事件
- javascript blur事件JavaScript事件
- javascript事件操作JavaScript事件
- JavaScript 事件物件JavaScript事件物件