utils,原生js做history監聽

2021-10-10 04:37:27 字數 1748 閱讀 4465

function

getqueryvariable

(variable)

//如果key相等,拿整個

}return

(false);

}

①通過hash改變,利用window.onhashchange 監聽。

②通過history的改變,進行js操作載入頁面,然而history並不像hash那樣簡單,因為history的改變,除了瀏覽器的幾個前進後退(使用 history.back(), history.forward()和 history.go() 方法來完成在使用者歷史記錄中向後和向前的跳轉。)等操作會主動觸發popstate 事件,pushstate,replacestate 並不會觸發popstate事件,本篇文章主要解決history監聽的問題,下面來看下具體實現

我們首先完成乙個訂閱-發布模式,然後重寫history.pushstate, history.replacestate,並新增訊息通知,這樣一來只要history的無法實現監聽函式就被我們加上了事件通知,只不過這裡用的不是瀏覽器原生事件,而是通過我們建立的event-bus 來實現通知,然後觸發事件訂閱函式的執行。 廢話不多說,下面我們來做具體操作。

class

depdefined()

notify()

catch

(err)}}

)}}dep.watch =

null

;class

watch

add(dep)

update()

}

下面我們只需要對history的方法進行重寫,並新增event-bus即可,**如下:

var addhistorymethod =

(function()

}else

if(name ===

'pushstate'

|| name ===

'replacestate')}

}}()

) window.addhistorylistener =

addhistorymethod

('historychange');

history.pushstate =

addhistorymethod

('pushstate');

history.replacestate =

addhistorymethod

('replacestate'

);

上面我們給window新增了乙個addhistorylistener事件監聽,類似於 addeventlistener的方法,然後我們有做了history的pushstate, replacestate的改寫,接下來我們測試一下。

window.

addhistorylistener

('history'

,function()

)window.

addhistorylistener

('history'

,function()

)history.

pushstate(,

"page2"

,"/first"

)

觀察上面結果列印;我們發現window的 history改變,我們成功的新增了事件監聽!當然這裡還是有缺陷的,就是少了事件的移除,有興趣的同學可以把接下來的移除也書寫一下,熟悉熟悉。

原生js做列印功能的簡單實現

在需要列印的地方前後加上 function mypringt bdhtml window.document.body.innerhtml 獲取當前頁的html sprnstr 設定列印開始區域 eprnstr 設定列印結束區域 prnhtml bdhtml.substring bdhtml.inde...

關於js 原生原生鏈

可以這麼理解 1 所有的引用型別都有乙個 proto 隱式原型 屬性,屬性值是乙個普通的物件 2 所有的函式都有乙個prototype 顯示原型 屬性,屬性值是乙個普通的物件 3 所有引用型別都有乙個constructor 建構函式 屬性,該屬性 是乙個指標 指向它的建構函式 4 所有引用型別的 p...

原生JS時鐘

charset utf 8 無標題文件title id css wrap wrap ul wrap ul li 鐘錶一圈是360度,一共12個小時 每個小時之間差360 12 30度,每個小時之間差有5個格,所以每個小格之間是30 5 6度 wrap ul li nth of type 1 wrap...