2010-10-15 205 views
27

我討厭這個由W3C創建的鼠標按鈕混亂!我想知道當我收到mousedown事件時是否按下了鼠標左鍵。檢測鼠標左鍵按

我使用此代碼

// Return true if evt carries left mouse button press 
function detectLeftButton(evt) { 
    // W3C 
    if (window.event == null) { 
    return (evt.button == 0) 
    } 
    // IE 
    else { 
    return (evt.button == 1); 
    } 
} 

但是,它不能在Opera和Chrome的工作,因爲它恰巧window.event也存在那裏。

那麼我該怎麼做?我有一些瀏覽器檢測,但我們都知道它不能依賴一些瀏覽器最近做的所有屏蔽。如何檢測鼠標左鍵RELIABLY?

+0

我認爲'網站前兩個搜索結果:quirksmode.org鼠標左鍵press'會幫助你。 – 2010-10-15 16:28:31

+0

我看過了,裏面什麼也沒有,只有鼠標右鍵的腳本 – 2010-10-15 16:34:38

+0

你可能想看看[jQuery](http://stackoverflow.com/questions/1206203/how-to-distinguish-left-mouse-單擊和右鍵與jQuery)解決了這個問題,或者只是使用[jQuery的mousedown](http://api.jquery.com/mousedown/)並查看'event.which'值。 – jball 2010-10-15 16:36:21

回答

35

已更新的答案。下面將檢測的,並僅在按下鼠標左鍵:

function detectLeftButton(evt) { 
    evt = evt || window.event; 
    if ("buttons" in evt) { 
     return evt.buttons == 1; 
    } 
    var button = evt.which || evt.button; 
    return button == 1; 
} 

有關在JavaScript處理鼠標事件的更多信息,請http://unixpapa.com/js/mouse.html

+1

這不起作用。所有瀏覽器中的左鍵均爲0,但IE – 2010-10-15 16:43:45

+5

這不起作用。在IE瀏覽器以外的所有瀏覽器中,哪個會返回1,哪裏沒有定義。在IE中,我的'button'變量因此將使用事件的'button'屬性值而不是'which',左鍵爲1。 – 2010-10-15 16:46:31

+0

@ avok00,你試過了嗎? – jball 2010-10-15 16:47:57

10

現在有通過IE9 in standards mode支持的W3C standardevent.buttons屬性,和Gecko 15+

W3C completely stuffed了event.button屬性,因此對符合標準的瀏覽器event.button是0,但對於標準之前創建的瀏覽器,event.button是使用1

所以代碼必須避免event.button除舊版瀏覽器外。下面的代碼應該工作:

function detectLeftButton(event) { 
    if ('buttons' in event) { 
     return event.buttons === 1; 
    } else if ('which' in event) { 
     return event.which === 1; 
    } else { 
     return event.button === 1; 
    } 
} 
+0

+1。這看起來像是對我的回答的改進,儘管取決於需求,您可能希望使用「按鈕」(例如,值3表示按下左右鼠標按鈕)執行一次按鍵操作。這個特定的問題似乎意味着OP會想知道是否按下了左按鈕,而不管其他任何按鈕的狀態如何,所以按位比較將是適當的。例如:'return(event.buttons&1)=== 1;' – 2012-11-01 14:48:30

+2

@TimDown - 我認爲不需要按位檢查,因爲沒有它,代碼更簡單。從可用性來看,如果用戶有兩個按鈕,那麼推測它們意味着除了通常意義上的左鍵點擊之外的其他東西。出於同樣的原因,在我自己的代碼中,我還檢查了'!event.metaKey &&!event.ctrlKey &&!event.altKey &&!event.shiftKey'以防止捕獲其他點擊(shift-click與點擊不同)。 – robocat 2012-12-07 00:59:26

0

您可以使用下面的代碼 -

onmouseup="if(window.event.which==1){//code for left click} 
      else if(window.event.which==3){//code for right click}" 
0

即使event.buttons現在工作在Chrome,Safari瀏覽器仍然不支持它。一個解決辦法是使用onmousedown事件和onmouseup事件在文檔或父層級,如: onmousedown事件=「bMouseDown =真正的」 onmouseup =「bMouseDown =假」

0
// 0 left, 2 right, 1 middle, other.. extra buttons, gaming mouses 

var buttonsArray = [false, false, false, false, false, false, false, false, false]; 
var mousePressed = false; 

document.onmousedown = function(e) { 
    buttonsArray[e.button] = true; 
    mousePressed = true; 
}; 

document.onmouseup = function(e) { 
    buttonsArray[e.button] = false; 
    mousePressed = false; 
}; 

document.oncontextmenu = function() { 
    return false; 
} 

說明:當按下鼠標時,我們改變爲true在我們的按鈕陣列中按下按鈕。 當鼠標啓動時,我們將false按鈕更改爲false。

現在我們可以更準確地確定哪個按鈕被按下了,但是我們有一個右鍵單擊的問題..因爲使用該按鈕,我們在瀏覽器中打開一個contextmenu,並且逃脫了我們的控制...因此,我們禁用了上下文菜單,以正確檢測右鍵單擊。如果我們不這樣做,我們也必須解決左鍵點擊......並且它是一種避免這種反應的併發症。

爲了簡化操作,我們可以添加另一個變量mousePressed並在鼠標關閉或關閉時標記。

在鉻上工作完美,我沒有在其他瀏覽器中測試它,但我想它在Firefox和Opera中也可以... IE?我不在乎IE。

享受它!

0

工作過的robocat's answer,你可以很容易地創建一個jQuery延伸像下面

$.fn.mouseButton = function() { 
    if (!(this instanceof MouseEvent || this[0] instanceof MouseEvent)) return null; 
    var e = this[0] || window.event; 
    return e.buttons || e.which || e.button; 
}