2011-10-29 73 views
19

我正在編寫一個HTML5畫布繪製應用程序,並且我需要能夠判斷在鼠標移動事件期間是否按下鼠標左鍵。在Chrome,這個工程:Firefox Mousemove event.which

if (event.which == 1) { <do stuff> } 

但在Firefox,event.which 總是是1,無論按鈕是否被按下。

如何檢測mousemove事件期間是否按下鼠標按鈕?

+0

試試你想在onmousedown事件中做什麼而不是在onmousemove事件:) – Marwan

+2

那麼,我現在有一個解決方案,我在mousedown事件上設置了一個變量(is_drawing)爲true,然後在mouseup/mouseout事件中將其設置爲false。但是我不喜歡這個,因爲如果鼠標離開畫布然後又回來了,那麼在再次點擊之前,圖形不會重新啓動。所以真正的解決方案將是一個真正的幫助。 – snostorm

回答

11

總之,你不能。 MDN,例如,explains

當鼠標按鈕事件發生時,一些額外的屬性 可用於確定被按下的是哪個鼠標按鈕和鼠標指針的位置 。可以使用事件的按鈕屬性 來確定按下哪個按鈕,其中 左側按鈕可能值爲0,中間按鈕爲1,右側按鈕爲2。 如果您以不同方式配置鼠標,這些值可能與 不同。

...

按鈕和細節屬性只適用於鼠標按鈕 相關的事件,而不是鼠標移動事件。對於鼠標移動事件, 例如,這兩個屬性將被設置爲0。

如果你願意,你可以設置全局mousedownmouseup處理,在適當的時間,然後設置標誌在任何時候,你可以用準確度的相對程度決定了/是否按下了哪個鼠標按鈕。

7

您應該使用一個變量來保存mousedown的狀態。 當畫布上你mousedown其設置爲true,當你mouseup對文檔設置爲false ..

這樣,無論你點擊它會被清除..

像這樣的事情

var isMouseDown = false; 

var draw = document.getElementById('draw'); 

document.addEventListener('mouseup', 
          function(){ 
           isMouseDown = false; 
          }, 
          false); 

draw.addEventListener('mousedown', 
         function(e){ 
          e.preventDefault(); // cancel element drag.. 
          isMouseDown = true; 
         }, 
         false); 

draw.addEventListener('mousemove', 
         function(e){ 
          if (isMouseDown){ 
           // do the drawing .. 
          } 
         }, 
         false); 

演示在http://jsfiddle.net/gaby/8JbaX/

+0

對,這就是我目前正在做的事情。我曾希望有一個更好的解決方案,但如果這是我能做的,我想是的。 :P – snostorm

+0

so upvote snostorm這個答案 – Marwan

+0

對,謝謝你提醒我。 * upvotes * – snostorm

2

其實,你可以檢查event.buttons在Firefox,它告訴你,如果左鍵,右鍵或沒有被按下。您將需要一個if語句來與Chrome區分開來,因爲它沒有event.buttons

0

我用這個僞填充工具以避免火狐的mouseMove問題:

function fixWhich(e) { 
    if (!e.which && e.button) { // if no which, but button (IE8-) 
     if (e.button & 1) 
      e.which = 1; // left 
     else if (e.button & 4) 
      e.which = 2; // middle 
     else if (e.button & 2) 
      e.which = 3; // right 

    } 
    if (e.buttons) { //if there's buttons, i set new option buttondown (FF) 
     if (e.buttons & 1) 
      e.buttondown = 1; // left 
     else if (e.buttons & 4) 
      e.buttondown = 2; // middle 
     else if (e.buttons & 2) 
      e.buttondown = 3; // right 

    } 
} 

我把它稱爲「僞」,因爲它迫使我下來檢查一下按鍵,同時移動這樣:

if (e.buttondown === 1) { 
     //do anything 
    } 

而不是正常的:

if (e.which === 1) { 
     //do anything 
    }