2012-12-02 41 views
0

我在我的一個html頁面中使用下面的代碼。 當用戶點擊「搜索引擎」鏈接時,它會在新頁面上打開yahoo.com,在當前頁面上打開Goog​​le。Html onmousedown vs href優先

我測試過這一點,它的工作原理(打開兩個URL),但沒有任何機會,頁面將完成window.location的(重定向到一個不同的頁面)沒有完成HREF命令?

這兩個命令之間有優先順序嗎?

**注意:我知道我可以用不同的方式解決問題,但我對這種特殊情況很好奇。

<html> 
<head> 
    <title></title> 

<script type="text/javascript"> 
    function clickRedirect() { 
     window.location = 'http://www.google.com'; 
    } 
</script> 
<body> 

<a onmousedown="clickRedirect()" href="http://www.yahoo.com" target="_blank">Search Engines</a> 
</body> 
</html> 

回答

3

mousedown事件會先發生,但你可以從你的代碼目前正在努力的事實看,這並不是故事的全部。

現在的問題是:一旦mousedown發生了,並且您設置了window.location,頁面是否會立即被刪除(並且因此不會發生在a元素上點擊默認操作的處理)在頁面被銷燬之前,默認操作是否已完成並被新頁面替換?

答案是:我不認爲這是保證的行爲(任何一種方式),我不會依賴它跨瀏覽器。首先,如果用戶按住鼠標按鈕怎麼辦?由於a元素的默認操作直到click纔會觸發,這需要mouseup

相反,我可能會對衝投注歷史紀錄,有兩種方式:

首先,我會使用click,不mousedown,這一點。用戶不希望頁面在他們只是按住鼠標時換掉。

其次,我會改變你的函數:

function clickRedirect() { 
    setTimeout(function() { 
     window.location = "http://www.google.com"; 
    }, 0); 
} 

現在你專門給瀏覽器有機會在你走之前到另一個頁面,完成點擊的默認操作。

您可能會發現這個在DOM事件規範深埋的更多信息:

...在他們可能會說一些關於應該發生什麼時一個事件正在進行中並且該頁面正在被銷燬。我沒有立即看到任何東西。

+0

謝謝您的詳細信息,這正是我所害怕的 - 訂單不是一成不變的,並且可以無論如何。我也考慮過使用超時(我想你並不是想用零來超時)。 – RuSh

+0

@sharru:不,'0'是有意的,當你需要某些東西是異步的,但幾乎是瞬間的時候,這是一種非常標準的技術:使用'0'設置瀏覽器支持的*最小*超時(通常在5到10之間女士)。足夠短以至於不會被人察覺(我們不會在50-100ms之前注意到事情),但是使用任何超時都可以讓瀏覽器完成事件處理。 (同樣,我會使用'click',而不是'mousedown',這樣你就知道處理已經開始了。) –