2012-05-24 4 views
10

Есть ли способ определить, использует ли клиент сенсорную панель против мыши с Javascript?Обнаружение сенсорной панели против мыши в Javascript

Или, по крайней мере, получить разумную оценку количества пользователей, использующих сенсорные панели, в отличие от мышей?

+1

Вы имеете в виду сенсорное устройство или устройство мыши с сенсорным экраном? Первое различие тривиально, второе невозможно. – apsillers

+0

@ переходники: сенсорное устройство мыши. – Fragsworth

ответ

2

В общем случае, вы не можете делать то, что хотите. ActiveX может позволяет просматривать и проверять USB-устройства, но в лучшем случае, даже если это возможно, это ограничивает вас пользователями IE. Помимо этого, нет никакого способа узнать.

Возможно, вы сможете различать шаблоны в том, как (или как часто) пользователь сенсорной панели перемещает курсор в зависимости от того, как пользователь мыши может перемещать курсор. Дифференциация между физическими устройствами ввода таким образом является абсурдно трудной перспективой и может быть совершенно невозможной, поэтому я включаю здесь ее только для полноты.

7

Вы можете обнаружить события JS.

Сенсорное устройство будет активировать события касания, такие как touchstart в дополнение к событиям мыши.

Устройство без касания будет только запускать события мыши.

+0

Для тех, кто недавно изучил этот вопрос, я искал его, и я не думаю, что это верно во всех браузерах, если они есть. Хотелось бы увидеть источник, показывающий, что трекпады запускают события касания. – minorcase

+1

@minorcase hmm ... теперь, когда я перечитываю вопрос, я не уверен, относится ли OP к портативным устройствам или к любому периферийному устройству с сенсорным вводом. Я согласен, что сенсорная панель (например, подключенная к компьютеру) не будет * видна * как сенсорное устройство. Мой ответ был конкретно о устройстве в целом (т. Е. Мобильном браузере и настольном браузере). –

+1

Итак, чтобы быть понятным, да, если мы говорим о дифференциации щелчка мышью с сенсорной панели, нажмите на что-то вроде ноутбука AFAIK, вы не сможете отличить их от JS. –

-2

Это должно работать:

if ("ontouchstart" in window) ... 
+0

Использование хром, например, с помощью macbook с трекпадом, не имеет этого события –

+0

не работает в хроме, поскольку Дэвид сказал – puppeteer701

9

Эта тема может быть уже решена, но ответ был нет никакого способа, чтобы обнаружить его. Ну, мне нужно было найти решение, это было очень важно. Таким образом, я нашел приемлемое решение этой проблемы:

var scrolling = false; 
var oldTime = 0; 
var newTime = 0; 
var isTouchPad; 
var eventCount = 0; 
var eventCountStart; 

var mouseHandle = function (evt) { 
    var isTouchPadDefined = isTouchPad || typeof isTouchPad !== "undefined"; 
    console.log(isTouchPadDefined); 
    if (!isTouchPadDefined) { 
     if (eventCount === 0) { 
      eventCountStart = new Date().getTime(); 
     } 

     eventCount++; 

     if (new Date().getTime() - eventCountStart > 100) { 
       if (eventCount > 10) { 
        isTouchPad = true; 
       } else { 
        isTouchPad = false; 
       } 
      isTouchPadDefined = true; 
     } 
    } 

    if (isTouchPadDefined) { 
     // here you can do what you want 
     // i just wanted the direction, for swiping, so i have to prevent 
     // the multiple event calls to trigger multiple unwanted actions (trackpad) 
     if (!evt) evt = event; 
     var direction = (evt.detail<0 || evt.wheelDelta>0) ? 1 : -1; 

     if (isTouchPad) { 
      newTime = new Date().getTime(); 

      if (!scrolling && newTime-oldTime > 550) { 
       scrolling = true; 
       if (direction < 0) { 
        // swipe down 
       } else { 
        // swipe up 
       } 
       setTimeout(function() {oldTime = new Date().getTime();scrolling = false}, 500); 
      } 
     } else { 
      if (direction < 0) { 
       // swipe down 
      } else { 
       // swipe up 
      } 
     } 
    } 
} 

и регистрации событий:

document.addEventListener("mousewheel", mouseHandle, false); 
document.addEventListener("DOMMouseScroll", mouseHandle, false); 

Это может понадобиться некоторые оптимизации и, может быть, менее совершенным, но это работает! По крайней мере, он может обнаружить трекпад macbook. Но из-за дизайна я бы сказал, что он должен работать где угодно, где пэд вводит много звонков.

Вот как это работает:

Когда первый пользователь прокручивает, он обнаружит и проверить, что в 50мс не более 5 событий был вызван, что довольно необычно для нормальной мыши, но не для сенсорной панели ,

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

Редактировать: Я оптимизировал код настолько, насколько могу. Он обнаруживает мышеловку во второй раз и мгновенно салфетки на трекпаде. Удалено также много повторяющегося и ненужного кода.

Редактировать 2 Я изменил номера для проверки времени и числа событий, вызванных от 50 до 100 и от 5 до 10 соответственно. Это должно привести к более точному обнаружению.

+1

[Здесь] (http://jsfiddle.net/ucLe3hLa/) - это скрипка с этим кодом для более простого тестирования конечного результата. –

+1

Спасибо. Я использую этот код сейчас на своем производственном сайте, и он работает очень хорошо. Я изменил вашу скрипку, чтобы получить мгновенный результат: https://jsfiddle.net/ucLe3hLa/1/ –

+0

Предположение о «не более 5 событиях в 50 мс» не выполняется для моей мыши. Как вы его придумали? –

0

Вы можете просто проверить, что программное обеспечение драйвера устройства, установленное в локальном пакете, функционирует. Как и в синапсах Windows, elan hardware, как и в UNIX (Linux), вы можете просто проверить, установлен ли пакет, установленный на базовом компьютере.Многие пакеты поставляются в разных форматах в разных версиях Linux и Linux, таких как системы (полностью не Linux), но они используют одно и то же имя пакета для всех. Просто узнал код, чтобы вытащить его. Все еще работаю над этим.

Смежные вопросы