2014-05-16 48 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将为所有这些事件启动。 如果您提供更多关于您想要完成的信息,我可以提供更多可能性。