還有一點(很多)比這更符合眼球。
首先,你應該真正理解事件冒泡。
也就是說,只要<a>
元素找到「點擊」事件,就已經設置了「點擊」事件處理程序。
這意味着無論處理程序給予該對象將在元素告訴它的父項(它將告訴它們的父項,直到你到達頁面的頂部)之前運行。
切換頁面發生在根元素(<html>
或document.documentElement
)。
所以在同情況下,a.onclick = function() { };
總是將window.onclick = function() { };
處理程序之前發生,因爲冒泡的。
無論其,僅開始劃傷表面...
如果您運行的異步操作的點擊處理程序裏面,這是一個鏈接的點擊,瀏覽器將改變頁面,那麼一旦瀏覽器到達"unload"
階段(以後會更多),所有異步的東西(服務器調用/圖像加載/腳本加載/等)將被忽略(或取消)。
你要麼需要同步你在做什麼(保存到document.cookie
或localStorage
,而不是使AJAX調用,等等),或手動防止<a>
從告訴它的父母發生了什麼事,在事件對象上使用.stopPropagation()
,它被傳遞給事件處理程序。
當然,現在,它並沒有告訴其母公司,它永遠不會達到window
,所以頁面永遠不會改變......
...所以現在,在您的處理程序,如果你想頁面進行更改,在完成異步工作後,必須通過設置window.location = googleEl.href;
手動進行頁面更改,並且在確定完成所有異步工作後執行此操作。
...當然,這不是它的結束......當瀏覽器要更改的頁面,這也觸發一個事件"beforeunload"
和"unload"
事件時,可以從window
聽。再次,相同的異步規則適用...
而爲了讓事情變得更加混亂,只有大多數瀏覽器會觸發"beforeunload"
,有些人不會打擾。
因此,要回答你的問題相關:
的點擊處理程序便會啓動,然後再幾個事件之間,然後"beforeunload"
,然後"unload"
,那麼頁面的變化。
感謝您的回答。我的問題的最後部分說:你如何確保你的點擊事件運行完成?有沒有這樣做的首選方法?謝謝! – user3084728
@ user3084728它會一直運行,然後你得到重定向 –
這取決於,如果你沒有asnc調用,然後點擊事件將在打開鏈接之前完成。 – Adil