Определить и связать событие click или touch

Я использую приведенный ниже код для привязки событий «click» или «touchstart» (используя jQuery's on(eventType, function() { ... }) ).

 var what = (navigator.userAgent.match(/iPad/i)) ? 'touchstart' : 'click'; 

Позже:

 $foo.on(what, function() { ... }); 

… который отлично подходит для iPad и «всего остального», но я обеспокоен тем, что у вышеупомянутого кода есть «видение iPad-туннеля» …

Мои вопросы):

Все остальные устройства (например, планшеты Android) аналогично называются событиями «touchstart»? Если да, то как я могу улучшить вышеуказанный код, чтобы я мог учитывать эти типы событий?

Другими словами, как я могу объяснить более широкий диапазон сенсорных устройств в коде выше (а не iPad)?


EDIT # 1

Что вы думаете об этом:

 var foo = ('ontouchstart' in window) ? 'touchstart' : ((window.DocumentTouch && document instanceof DocumentTouch) ? 'tap' : 'click'); 

Примечание. Большая часть приведенной выше логики находится здесь .

Вышеприведенное, похоже, работает для Firefox / iPad … На данный момент мне больше нечего тестировать.

Что мне нравится в этом, так это то, что я не нюхаю UA. 🙂

Правильно ли tap по умолчанию для всех других сенсорных устройств?


EDIT # 2

Здесь есть интересная информация , которая ссылается на следующее:

Создание быстрых кнопок для мобильных веб-приложений

Не прямой ответ на самом деле, но дает множество подробностей о ситуации, когда разработчики сталкиваются с событиями, связанными с кликами, для нескольких платформ и устройств.


ИЗМЕНИТЬ № 3

Некоторая хорошая информация здесь тоже:

События для Android и iPhone

Android и iPhone версии WebKit имеют несколько событий касания:

 touchstart - triggered when a touch is initiated. Mouse equivalent - mouseDown touchmove - triggered when a touch moves. Mouse equivalent - mouseMove touchend - triggered when a touch ends. Mouse equivalent - mouseUp. This one is a bit special on the iPhone - see below touchcancel - bit of a mystery 

После прочтения этого, я думаю, что я изменю код выше:

 var foo = (('ontouchstart' in window) || (window.DocumentTouch && document instanceof DocumentTouch)) ? 'touchstart' : 'click'; 

Когда я впервые задал свой вопрос – не имея доступа ни к чему, кроме iPad / iPhone, я предположил, что touchstart был событием, специфичным для iOS; Теперь он выглядит как touchstart и click будет охватывать большинство, если не всех, оснований для сенсорных устройств.


Август 2014 года:

Если это поможет, я разместил здесь некоторые полезные классы:

  • Mhulse / no-x.js :

    [No-js] [no-touch] Утилиты JavaScript для размещения шаблонов HTML, которые будут добавлять js или touch классы для использования в CSS и / или JS.

И iOS, и Android имеют события касания, но Windows использует события MSPointer в IE. Если вам требуется решение для нескольких устройств, попробуйте pointer.js или узнайте из него:

https://github.com/borismus/pointer.js

Я бы настоятельно рекомендовал против использования UA, чтобы определить, находитесь ли вы в сенсорной среде.

Вместо этого используйте Modernizr: http://modernizr.com/. Приведенный ниже код распознает что-либо, кроме Windows 7 телефона, потому что Windows 7 не запускает обычные события касания браузера. Однако WP8, скорее всего, будет правильно распознан.

 if (Modernizr.touch){ // bind to touchstart, touchmove, etc and watch `event.streamId` } else { // bind to normal click, mousemove, etc } 

Это может сработать для вас:

 var clickEvent = ((document.ontouchstart!==null)?'click':'touchstart'); $("#mylink").on(clickEvent, myClickHandler);