Обнаружение сенсорной панели против мыши в Javascript

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

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

Ответ 1

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

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

Ответ 2

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

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 соответственно. Это должно привести к более точному обнаружению.

Ответ 3

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

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

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

Ответ 4

Событие колеса, вызванное сенсорной панелью, даст намного меньшее событие. DeltaY, 1 или 2, но триггер колесом мыши даст 100,200.

Ответ 5

Другой вариант - сравнить e.wheelDeltaY и e.deltaY или e.deltaMode в Firefox.

function handler(e) {
    var isTouchPad = e.wheelDeltaY ? e.wheelDeltaY === -3 * e.deltaY : e.deltaMode === 0
    // your code
    document.body.textContent = isTouchPad ? "isTouchPad" : "isMouse"
}
document.addEventListener("mousewheel", handler, false);
document.addEventListener("DOMMouseScroll", handler, false);

Ответ 6

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

Ответ 7

От тестирования подключения мыши к компьютеру Mac, у которого есть тачпад, а также к машине с Windows, я могу подвести итог, как мне это удалось.

  1. Определите, содержит ли пользовательский агент навигатора "Mobile" или "Mac OS". из них правда, это, скорее всего, сенсорная система, но работать на устранить это. Установите для логического значения hasTouchPad значение true

  2. Если вышеупомянутое верно, определите события "мыши" и выполните тест как высокий   числа, или частота нецелых чисел или фильтрация Калмана.

  3. Храните их в очереди, и, если эта сумма в очереди превышает пороговое значение,   отключите переменную hasTouchpad и отключите событие.

let isMouseCounts: Array<number> = []

if (Client.hasTouchpad) {
    document.addEventListener('wheel', detectMouseType);
}

function detectMouseType(e:WheelEvent) {
    if (!Client.hasTouchpad) return

    let isMouse = e.deltaX === 0 && !Number.isInteger(e.deltaY)

    isMouseCounts.push(isMouse ? 1 : 0)
    if (isMouseCounts.length > 5) isMouseCounts.shift()

    let sum = isMouseCounts.reduce(function(a, b) { return a + b; });

    if (sum > 3 && e.type === "wheel") {
        console.log("Touchpad disabled")
        document.removeEventListener('wheel', detectMouseType);
        Client.hasTouchpad = false;
    }
}

Ответ 8

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

if ("ontouchstart" in window) ...