Я написал плагин jQuery для использования на настольных и мобильных устройствах. Я задавался вопросом, есть ли способ с JavaScript, чтобы обнаружить, если устройство имеет возможность сенсорного экрана. Я использую jquery-mobile.js для обнаружения событий сенсорного экрана, и он работает на iOS, Android и т. Д., Но я также хотел бы написать условные операторы, основанные на том, имеет ли устройство пользователя сенсорный экран.
Это возможно?
javascript
jquery
touch
screenm0nkey
источник
источник
Ответы:
Обновление: Пожалуйста, прочитайте ответ blmstr ниже, прежде чем использовать целую библиотеку обнаружения объектов в своем проекте. Обнаружение фактической поддержки касания является более сложным, и Modernizr охватывает только базовый вариант использования.
Modernizr - это отличный и легкий способ обнаружения всех функций на любом сайте.
Он просто добавляет классы в элемент html для каждой функции.
Затем вы можете легко настроить эти функции в CSS и JS. Например:
И Javascript (пример jQuery):
источник
Modernizr.touch
неожиданно возвращаетсяundefined
, у вас может быть настроенный Modernizr (вы можете выбирать) без поддержки обнаружения сенсорных событий.Вы пытались использовать эту функцию? (Это то же самое, что использовал Modernizr.)
ОБНОВЛЕНИЕ 1
document.createEvent("TouchEvent")
начали возвращатьсяtrue
в последнем Chrome (ст. 17). Modernizr обновил это некоторое время назад. Проверьте Модернизр тест здесь .Обновите свою функцию так, чтобы она работала:
ОБНОВЛЕНИЕ 2
Я обнаружил, что вышеупомянутое не работает на IE10 (возвращая false на MS Surface). Вот исправление:
ОБНОВЛЕНИЕ 3
'onmsgesturechange' in window
вернет true в некоторых версиях IE для настольных ПК, так что это ненадежно. Это работает немного надежнее:ОБНОВЛЕНИЕ 2018
Время идет, и есть новые и лучшие способы проверить это. Я в основном извлек и упростил способ проверки Модернизра:
Здесь они используют нестандартную
touch-enabled
функцию медиа-запросов, что, на мой взгляд, является странной и плохой практикой. Но эй, в реальном мире, я думаю, это работает. В будущем (когда они поддерживаются всеми) эти функции медиазапроса могут дать вам те же результаты:pointer
иhover
.Проверьте источник того, как Modernizr делают это .
Хорошую статью, в которой объясняются проблемы с обнаружением касания, смотрите в статье: Stu Cox: вы не можете обнаружить сенсорный экран .
источник
true
илиfalse
. Вы можете прочитать больше об этом здесь: stackoverflow.com/questions/4686583/…in
оператор уже вычисляет логическое значение.'onmsgesturechange'
оценивает истину даже в несенсорных устройствах (ПК).window.navigator.msMaxTouchPoints
кажется более точным. Нашел это здесь .Поскольку Modernizr не обнаруживает IE10 в Windows Phone 8 / WinRT, простое кросс-браузерное решение:
Вам нужно проверять только один раз, так как устройство не будет внезапно поддерживать или не поддерживать касание, поэтому просто сохраните его в переменной, чтобы вы могли использовать его несколько раз более эффективно.
источник
return !!('ontouchstart' in window) || !!('msmaxtouchpoints' in window.navigator);
(объединить оба ответа) Отлично работает и в IE10!'onmsgesturechange' in window
возвращает true на рабочем столе IE10, даже когда сенсорный возможенfunction isTouchDevice() { return 'ontouchstart' in window || !!(navigator.msMaxTouchPoints);}
Используя все комментарии выше, я собрал следующий код, который работает для моих нужд:
Я проверил это на iPad, Android (браузер и Chrome), Blackberry Playbook, iPhone 4s, Windows Phone 8, IE 10, IE 8, IE 10 (Windows 8 с сенсорным экраном), Opera, Chrome и Firefox.
В настоящее время он не работает на Windows Phone 7, и я пока не смог найти решение для этого браузера.
Надеюсь, кто-то найдет это полезным.
источник
true
на моем Firefox 32 на Windows 7 :(С момента внедрения интерактивных медиа функций вы можете просто:
https://www.w3.org/TR/mediaqueries-4/#descdef-media-any-pointer
Обновление (из-за комментариев): вышеупомянутое решение состоит в том, чтобы определить, является ли «грубый указатель» - обычно сенсорный экран - основным устройством ввода. Если вы хотите определить, есть ли у устройства, например, мыши, сенсорный экран, вы можете использовать
any-pointer: coarse
вместо этого.Для получения дополнительной информации посмотрите здесь: Обнаружение, что браузер не имеет мыши и только для касания
источник
(pointer: coarse)
как вы, скорее всего, ориентируетесь только на первичный вход. Может использоваться в производстве, поскольку некоторые неподдерживающие браузеры предназначены только для настольных компьютеров. Об этом есть отличная статья о трюках css .Мне нравится этот:
источник
function isTouchDevice(){ return (window.ontouchstart !== undefined); }
var isTouch = 'ontouchstart' in window;
однако это не работает с последним Chrome (v31),var isTouch = 'createTouch' in window.document;
все еще работает.touchstart
Surface не сможет распознать сенсорное устройство, поскольку IE используетpointer
события.Если вы используете Modernizr , он очень прост в использовании
Modernizr.touch
как упоминалось ранее.Однако я предпочитаю использовать комбинацию
Modernizr.touch
и тестирование пользовательского агента, чтобы быть в безопасности.Если вы не используете Modernizr, вы можете просто заменить
Modernizr.touch
вышеуказанную функцию на('ontouchstart' in document.documentElement)
Также обратите внимание, что тестирование пользовательского агента
iemobile
даст вам более широкий спектр обнаруженных мобильных устройств Microsoft, чемWindows Phone
.Также посмотрите этот ТАК вопрос
источник
/(iphone|ipod|ipad|android|iemobile|blackberry|bada)/.test(window.navigator.userAgent.toLowerCase())
Мы попробовали реализацию modernizr, но обнаружение сенсорных событий больше не является последовательным (IE 10 имеет сенсорные события на рабочем столе Windows, IE 11 работает, потому что упали сенсорные события и добавлен указатель api).
Поэтому мы решили оптимизировать сайт как сенсорный, если не знаем, какой тип ввода у пользователя. Это более надежно, чем любое другое решение.
Наши исследования говорят, что большинство пользователей настольных компьютеров перемещают курсор мыши по экрану, прежде чем щелкнуть, поэтому мы можем обнаружить их и изменить поведение, прежде чем они смогут что-либо щелкнуть или навести курсор мыши.
Это упрощенная версия нашего кода:
источник
Рабочая скрипка
Я достиг этого как этот;
источник
Есть что-то лучше, чем проверить, есть ли у них сенсорный экран, это проверить, используют ли они его, плюс это легче проверить.
источник
Этот работает хорошо даже в планшетах Windows Surface !!!
источник
Я использовал фрагменты кода выше, чтобы определить, есть ли касание, поэтому мои фреймворки fancybox будут отображаться на настольных компьютерах, а не на ощупь. Я заметил, что Opera Mini для Android 4.0 все еще регистрировалась как устройство без сенсорного ввода, когда использовался только код blmstr. (Кто-нибудь знает почему?)
Я закончил тем, что использовал:
источник
/iPhone|iPod|iPad|Android|BlackBerry/
?Самая большая проблема с попыткой обнаружить касание - на гибридных устройствах, которые поддерживают как сенсорное управление, так и трекпад / мышь. Даже если вы в состоянии правильно определить, поддерживает ли устройство пользователя касание, вам действительно нужно определить, какое устройство ввода использует пользователь в данный момент . Здесь есть подробное описание этой проблемы и возможное решение .
По сути, подход к выяснению, касался ли пользователь экрана или использовал мышь / трекпад вместо этого, заключается в регистрации
touchstart
иmouseover
страницы, и события на странице:Действие прикосновения вызовет оба этих события, хотя прежний (
touchstart
) всегда будет первым на большинстве устройств. Таким образом, рассчитывая на эту предсказуемую последовательность событий, вы можете создать механизм, который динамически добавляет или удаляетcan-touch
класс в корне документа, чтобы отразить текущий тип ввода пользователя в данный момент в документе:Подробнее здесь .
источник
Прочтите этот пост , он дает действительно хороший фрагмент кода для того, что делать, когда обнаруживаются сенсорные устройства, или что делать, если вызывается событие touchstart:
источник
Я бы не использовал ширину экрана, чтобы определить, является ли устройство сенсорным. Существуют сенсорные экраны, намного большие, чем 699 пикселей, подумайте о Windows 8. Navigatior.userAgent может быть хорошим, чтобы переопределить ложные предположения.
Я бы порекомендовал проверить этот вопрос на Modernizr.
Вы хотите проверить, поддерживает ли устройство сенсорные события или является сенсорным устройством. К сожалению, это не одно и то же.
источник
Нет, это невозможно. Превосходные ответы даны только частично, потому что любой данный метод будет давать ложные срабатывания и ложные отрицания. Даже браузер не всегда знает, присутствует ли сенсорный экран из-за API-интерфейсов операционной системы, и этот факт может измениться во время сеанса браузера, особенно с соглашениями типа KVM.
Смотрите подробности в этой прекрасной статье:
http://www.stucox.com/blog/you-cant-detect-a-touchscreen/
В статье предлагается пересмотреть предположения, которые заставляют вас хотеть обнаруживать сенсорные экраны, они, вероятно, ошибочны. (Я проверил свое собственное приложение, и мои предположения были неверны!)
В статье делается вывод:
источник
Многие из них работают, но требуют либо jQuery, либо линтеры javascript жалуются на синтаксис. Учитывая, что ваш первоначальный вопрос требует "JavaScript" (не jQuery, не Modernizr) способа решения этой проблемы, вот простая функция, которая работает каждый раз. Это также минимально, как вы можете получить.
Последнее преимущество, которое я упомяну, заключается в том, что этот код не зависит от фреймворка и устройства. Наслаждайтесь!
источник
function isTouchScreen() { return window.matchMedia('(hover: none)').matches;}
Это сработало для меня, так что я здесь добавляю вклад в этот ответ, так как я также ожидал ванильного потока JS, когда Google привел меня сюда.Похоже, что Chrome 24 теперь поддерживает сенсорные события, вероятно, для Windows 8. Поэтому код, размещенный здесь, больше не работает. Вместо того, чтобы пытаться определить, поддерживается ли касание браузером, я теперь связываю события касания и нажатия и проверяю, вызывается ли только одно:
А потом называет это:
Надеюсь это поможет !
источник
Все поддерживаемые браузеры, кроме Firefox для настольных компьютеров, всегда TRUE, потому что Firefox для настольных компьютеров поддерживает адаптивный дизайн для разработчиков, даже если вы нажмете сенсорную кнопку или нет!
Я надеюсь, что Mozilla исправит это в следующей версии.
Я использую рабочий стол Firefox 28.
источник
true
:(jQuery v1.11.3
В предоставленных ответах содержится много полезной информации. Но недавно я потратил много времени, пытаясь связать все воедино в рабочее решение для решения двух задач:
Помимо этого поста и Обнаружения устройств с сенсорным экраном с помощью Javascript , я нашел этот пост Патрика Лаука чрезвычайно полезным: https://hacks.mozilla.org/2013/04/detecting-touch-its-the-why-not-the-how /
Вот код ...
Важный!
*.on( events [, selector ] [, data ], handler )
потребности способ иметь селектор, как правило , элемент, который может обрабатывать «touchstart» событие, или любое другое подобное событие , связанное со штрихами. В данном случае это элемент гиперссылки «а».Теперь вам не нужно обрабатывать обычное нажатие мыши в JavaScript, потому что вы можете использовать CSS для обработки этих событий, используя селекторы для элемента «a» гиперссылки, например:
Примечание: есть и другие селекторы ...
источник
или
было бы более тщательной проверкой, я полагаю.
источник
ua
относится кnavigator.userAgent
. Также обнаружение по ширине экрана может дать ложный результат, если кто-то открывает браузер в не полноэкранном режиме.Я использую:
в JQuery Mobile 1.0.1
источник
Я также много боролся с различными вариантами того, как определить в Javascript, отображается ли страница на устройстве с сенсорным экраном или нет. ИМО, на данный момент не существует никакой реальной возможности правильно ее определить. Браузеры либо сообщают о событиях касания на настольных компьютерах (поскольку ОС может быть готова к касанию), либо некоторые решения работают не на всех мобильных устройствах.
В конце я понял, что с самого начала придерживался неправильного подхода: если бы моя страница выглядела одинаково на сенсорных и не сенсорных устройствах, мне, возможно, не пришлось бы вообще беспокоиться об обнаружении свойства: мой сценарий был деактивировать всплывающие подсказки над кнопками на сенсорных устройствах, поскольку они приводят к двойному нажатию, когда я хотел одним нажатием активировать кнопку.
Мое решение состояло в том, чтобы реорганизовать вид так, чтобы над кнопкой не требовалась всплывающая подсказка, и в итоге мне не нужно было обнаруживать сенсорное устройство из Javascript методами, у которых у всех есть свои недостатки .
источник
Вы можете установить модернизатор и использовать простое сенсорное событие. Это очень эффективно и работает на каждом устройстве, которое я тестировал, включая поверхность Windows!
Я создал jsFiddle
источник
Практический ответ, кажется, тот, который рассматривает контекст:
1) Публичный сайт (без входа в систему)
Код пользовательского интерфейса для совместной работы с обоими вариантами.
2) Вход на сайт
Захватите, произошло ли перемещение мыши в форме входа, и сохраните это в скрытом вводе. Значение передается с учетными данными для входа и добавляется в сеанс пользователя , поэтому его можно использовать на время сеанса.
Jquery для добавления только на страницу входа:
(+1 к @Dave Burt и +1 к @Martin Lantzsch за их ответы)
источник
Проблема
Из-за гибридных устройств, которые используют комбинацию сенсорного и мышиного ввода, вы должны быть в состоянии динамически изменять состояние / переменную, которая контролирует, должен ли выполняться фрагмент кода, если пользователь сенсорный или нет.
Сенсорные устройства также стреляют
mousemove
на кране.Решение
touchstart
событие не будет запущено, затем установите его в значение true.Протестировано на Safari iOS и Chrome для Android.
Примечание: не уверен на 100% в событиях указателя для MS Surface и т. Д.
Codepen демо
источник
Собственно, я исследовал этот вопрос и рассмотрел все ситуации. потому что это большая проблема и для моего проекта. Итак, я дошел до функции ниже, она работает для всех версий всех браузеров на всех устройствах:
Подсказка : безусловно,
isTouchDevice
просто возвращаетboolean
значения.источник
Объем
support
объекта jQuery :И теперь вы можете проверить это где угодно, например так:
источник
Это, кажется, работает хорошо для меня до сих пор:
источник
Когда мышь присоединена, можно предположить с довольно высокой скоростью (я бы сказал, практически 100%), что пользователь перемещает мышь на минимальное расстояние после того, как страница готова - без какого-либо щелчка. Механизм ниже обнаруживает это. В случае обнаружения я рассматриваю это как признак отсутствия поддержки касания или, если она поддерживается, незначительной важности при использовании мыши. Сенсорное устройство предполагается, если не обнаружено.
РЕДАКТИРОВАТЬ Этот подход может не соответствовать всем целям. Он может использоваться для управления функциональностью, которая активируется на основе взаимодействия с пользователем на загруженной странице, например, в программе просмотра изображений. Приведенный ниже код также оставит событие mousemove привязанным к устройствам без мыши, как сейчас. Другие подходы могут быть лучше.
Грубо говоря, это выглядит так (извините за jQuery, но похоже на чистый Javascript):
источник