hashchange是什么供填?
hash即URL中“#”字符后面的部分罢猪。使用瀏覽器訪問網(wǎng)頁時,如果網(wǎng)頁URL中帶有hash膳帕,頁面就會定位到id(或name)與hash值一樣的元素的位置,故而又稱之為錨點危彩。hash還有另一個特點,它的改變不會導致頁面重新加載娩缰,因此在單頁應(yīng)用流行的當下,它的用處就更多了拼坎。
而hashchange事件,顧名思義泰鸡,就是hash改變時觸發(fā)的事件。在 caniuse.com 上查一下兼容性可以發(fā)現(xiàn)盛龄,IE8就已經(jīng)支持該事件,但一直以來應(yīng)用甚少啊鸭。
hashchange事件觸發(fā)時,事件對象會有hash改變前的URL(oldURL)和hash改變后的URL(newURL)兩個屬性:
window.addEventListener('hashchange', function(e) {
console.log(e.oldURL);
console.log(e.newURL);
}, false);
它有什么用欧芽?
移動端里有這樣一個功能葛圃,點擊小圖時在當前頁面上展示大圖:
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)即可吃挑。代碼實現(xià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為大圖展示組件對象
imgSlider.hide();
}
}, false);