2013-07-08 39 views
1

我工作的網絡應用程序是在只有2個按鈕的鼠標期間設計和開發的。現在市場上有超過3個按鈕的鼠標,所有這些額外按鈕在使用我們的應用程序時都會造成嚴重破壞。如何攔截使用JavaScript的各種按鈕按下鼠標?

我的目的是讓用戶只按下鼠標左鍵並禁用鼠標上的所有其他按鈕。因爲我沒有訪問用戶系統的權限,所以我必須通過瀏覽器本身來實現這一點(可能通過使用JavaScript)。

我該如何解決這個問題?任何指針都會很有幫助。

回答

1

W3C事件模型是否足夠通過event object傳遞鼠標信息。這意味着您實際上可以閱讀哪個鼠標按鈕被點擊。實施例

document.body.addEventListener('click', function(event) { 
    console.log('mouse button clicked: ', event.which); 
}, false); 

使用該信息它的相當瑣碎,只允許左點擊,其由值1表示。

document.body.addEventListener('click', function(event) { 
    if(event.which === 1) { 
     // do something 
    } else { 
     event.stopPropagation(); 
     event.preventDefault(); 
    } 
}, false); 
+0

Hello @jAndy。感謝您的迴應。我有一個有5個按鈕的鼠標。該代碼檢測鼠標左鍵,中鍵和右鍵,但沒有檢測到鼠標左(右)側可用按鈕的點擊。當我使用鼠標側面的按鈕時,Web控制檯不顯示任何內容。所以這些事件似乎沒有被發現。或者它可能是其他原因? – Rishabh

+0

@Rishabh afaik瀏覽器默認只支持三鍵鼠標。任何其他「點擊」都需要通過該鼠標製造商的特殊驅動程序或軟件提供。但即使如此,我不認爲這些「額外的」鼠標按鈕會被瀏覽器識別。但是,您可以通過在文檔上附加單擊處理程序來嘗試它,並在單擊這些按鈕時將事件對象記錄到控制檯。無論如何,如果您只想允許左鍵點擊,無論如何您都不必關心其他點擊。 – jAndy

0

我覺得這是你會得到禁用按鈕

document.addEventListener('click', function(e){ 
    if(e.which === 2 || e.which === 3) { // 2 = middle scroll button || 3 = right click 
     e.preventDefault(); 
     e.stopPropagation(); 
     return false; 
    } 
}); 

而是單擊,如果它不工作,你可以嘗試在最近「的keydown」或' keyup'

1

這取決於瀏覽器和文檔模式。

這就是我們如何調整prototype.js buttonmaps以適用於所有瀏覽器。包括IE10中的docmode < 9.

function _isButtonForDOMEvents(event, code) { 
     return event.which ? (event.which === code + 1) : (event.button === code); 
    } 

    //var legacyButtonMap = { 0: 1, 1: 4, 2: 2 }; 
    function _isButtonForLegacyEvents(event, code) { 
     switch (code) { //Fix where IE10 in DocMode lt9 caused isLeftClick to fail 
      case 0: return event.button == 0 || event.button == 1; 
      case 1: return event.button == 4; 
      case 2: return event.button == 2; 
      default: return false; 
     } 
    } 

    function _isButtonForWebKit(event, code) { 
     switch (code) { 
      case 0: return event.which == 1 && !event.metaKey; 
      case 1: return event.which == 2 || (event.which == 1 && event.metaKey); 
      case 2: return event.which == 3; 
      default: return false; 
     } 
    }