Лучшей идеей, на мой взгляд, является слушатель mousemove
(в настоящее время лучший ответ).Я считаю, что этот метод нужно немного доработать.Это правда, что сенсорные браузеры эмулируют даже событие mousemove, как вы можете видеть в этом обсуждении iOS , поэтому мы должны быть немного осторожнее.
Имеет смысл, что сенсорныйбраузеры будут эмулировать это событие только тогда, когда пользователь касается экрана (палец пользователя опущен).Это означает, что мы должны добавить тест во время нашего обработчика перемещения мыши, чтобы увидеть, какая кнопка мыши нажата (если есть) во время события.Если ни одна кнопка мыши не нажата, мы можем с уверенностью предположить, что настоящая мышь присутствует.Если кнопка мыши нажата, тест остается безрезультатным.
Так как бы это реализовать?Этот вопрос показывает, что наиболее надежный способ выяснить, какая кнопка мыши нажата во время перемещения мыши, - это фактически прослушивать 3 события на уровне документа: mousemove, mousedown и mouseup.Вверх и вниз будет установлен только глобальный логический флаг.Ход выполнит тест.Если у вас есть ход и логическое значение ложно, мы можем предположить, что мышь присутствует.См. Вопрос для точных примеров кода.
Один последний комментарий. Этот тест не идеален, потому что он не может быть выполнен во время загрузки.Поэтому я бы использовал прогрессивный метод улучшения, как было предложено ранее.По умолчанию показывают версию, которая не поддерживает специфический для мыши интерфейс наведения мыши.Если мышь обнаружена, включите этот режим во время выполнения, используя JS.Это должно выглядеть как можно более незаметно для пользователя.
Чтобы поддержать изменения в конфигурации пользователя (т. Е. Мышь была отключена), вы можете периодически повторять тестирование.Хотя я полагаю, что в этом случае будет лучше просто уведомить пользователя о двух режимах и позволить пользователям вручную переключаться между ними (как, например, выбор мобильного / настольного компьютера, который всегда можно изменить).