2009-09-28 139 views
9

我已經注意到了live()功能的jQuery的一個奇怪的現象:jQuery的生活(「點擊」)進行實彈射擊右鍵單擊

<a href="#" id="normal">normal</a> 
<a href="#" id="live">live</a> 

$('#normal').click(clickHandler); 
$('#live').live('click', clickHandler); 

function clickHandler() { 
    alert("Clicked"); 
    return false; 
} 

這很好,很正常,直到你的「活」右鍵單擊鏈接並觸發處理程序,然後不顯示上下文菜單。事件處理程序根本不會在「正常」鏈接上觸發(如預期的那樣)。

我已經能夠通過改變處理這一解決它:

function clickHandler(e) { 
    if (e.button != 0) return true; 
    // normal handler code here 
    return false; 
} 

但是,這真的很煩有將它添加到所有的事件處理程序。有沒有更好的方式讓事件處理程序僅像常規點擊處理程序那樣觸發?

+1

你如何在將來問一個問題? – PetersenDidIt

+0

我很高興看到你的解決方法在這裏,並立即嘗試在我自己的應用程序,雖然我現在右鍵點擊的鏈接可以被捕獲和忽略,我仍然沒有看到我的右鍵單擊上下文菜單上這些。此外,我的鼠標中鍵點擊(在新標籤中打開)也不起作用。但是,至少經理人可以早點回來! – Funka

+0

實際上,如果我反覆快速地右鍵單擊,似乎偶爾會出現上下文菜單....嗯。 – Funka

回答

9

這是一個known issue

這似乎是Firefox不火上爲元素 click事件的 右鍵單擊,儘管它觸發一個 鼠標按下和鼠標鬆開。但是,它 確實document上點擊事件!由於.live在文檔級別捕獲 事件,因此它看到 元素的單擊事件,即使 儘管該元素本身沒有。如果 您使用類似mouseup的事件,則 元素p元素和document 將會看到該事件。

您的解決方法是您現在可以做的最好的解決方案。它似乎隻影響Firefox(我相信它實際上是Firefox中的錯誤,而不是本身的jQuery)。

另請參見this question昨天問。

0

這是live如何實現的一個不幸後果。它實際上使用事件冒泡,所以你不綁定到錨元素的click事件,你綁定到文檔的click事件。

+0

不,Firefox氣泡右鍵單擊的方式存在缺陷。請參閱http://unixpapa.com/js/mouse.html –

+0

@crescentfresh:我不確定在一篇文章中放置多少信心,「Macintosh版本的Safari當然不會遇到這些問題,因爲Macintoshes只有一個鼠標按鈕「 - 我最後一次使用帶有單鍵鼠標的Mac是在TBL發明Web之前的某個時間;-) – NickFitz

+0

@NickFitz:touché。 –

4

我發現了一個解決方案 - 「修復」了代碼本身的live()

在圍繞2989行的jQuery 1.3.2的未定義源中,有一個叫做liveHandler()的函數。修改代碼以添加一行:

2989: function liveHandler(event) { 
2990:  if (event.type == 'click' && event.button != 0) return true; 

這將停止單擊事件觸發除鼠標左鍵之外的任何其他事件。如果你特別想要的話,你可以很容易地修改代碼以允許「右鍵點擊」事件,但這對我來說很有用,所以它就停留在那裏。

3

實際上,你可以把它改寫爲:

function reattachEvents(){ 
    $(element).unbind('click').click(function(){ 
     //do something 
    }); 
} 

,並調用它,當你添加一個新的DOM元素,它應該有預期的結果(上點右鍵事件沒有觸發)。

+1

是的,但是這會打敗live()的目的不是嗎? – nickf

+0

是真實的,但實時(點擊)的行爲與普通的click()不同,如果您檢測到哪個按鈕被按下,可以修復它,但是您需要確切知道使用哪個瀏覽器(IE在早期版本中的行爲與新版本和所有其他瀏覽器採用「正確」方式)。這是一個更加優雅的解決方案。 – SeanJA

0

我通過使用mousedown事件解決了這個問題。在我的情況下,mousedown和click之間的區別並不重要。