2014-05-16 50 views
1

對於支持鼠標和觸摸的混合設備,檢測和綁定事件的推薦方式是什麼?檢測混合設備

例如,如果Modernizr的有一個名爲hybrid測試,你可以做這樣的事情:

var handler = null; 

switch (true) { 
    case (Modernizr.hybrid): 
    handler = 'touchstart click'; 
    break; 
    case (Modernizr.touch): 
    handler = 'touchstart'; 
    break; 
    default: 
    handler = 'click'; 
    break; 
} 
+1

只是綁定touchstart每次用點擊一起,這不會傷害任何事件,如果事件不會觸發... – dandavis

回答

4

正如@dandavis在他的評論中所說,將他們全部綁定在一起。您可以對此有點智能:儘管您不知道用戶是否想要使用觸摸或鼠標(或鍵盤或其他輸入設備),但您可以檢測不同的事件模型(指針/ touch) - 因此只綁定可能會觸發的事件。

每個輸入設備可以雖然火click事件,所以一定要確保你總是束縛他們,你就覆蓋:

if ('onpointerdown' in window) { 
    // Bind to Pointer Events: `pointerdown`, `pointerup`, etc 
} 
else { 
    // Bind to mouse events: `mousedown`, `mouseup`, etc 

    if ('ontouchstart' in window) { 
     // Bind to Touch Events: `touchstart`, `touchend`, etc 
    } 
} 
// Bind to keyboard events: `keydown`, `keyup`, etc if 
// necessary; can be problematic though 
// Always bind to `click` events 

更多細節:http://www.stucox.com/blog/the-golden-pattern-for-handling-touch-input/

+0

偉大的迴應和博客文章 - 感謝回答 – cantera

+0

「tap」事件呢?我需要綁定它們以及'touchstart',以便我可以忽略長時間點擊和處理滑動等。除了這些事件之外,單擊事件的綁定還會導致執行兩次回調。 –

+1

@AdamFraser - 'tap'不是一個標準的DOM事件...你使用的是一個庫,也許[hammer.js](http://hammerjs.github.io/)?如果是這樣,我會推薦*使用Hammer的事件模型,而不是將它與標準的觸摸事件(當然不在同一個元素上)混合 - 你可以單獨使用Hammer做你需要的一切。 –

0

不幸的是,you can't detect a touchscreen,因此,你無法檢測hybriddevice。

根據您的示例代碼,click將爲所有這些事件啓動。 如果您提供更多關於您想要完成的信息,我可以提供更多可能性。