События сенсорных экранов

Источник информации: yournet.kz/blog/js/

Для работы с устройствами с сенсорным экраном в Javascript используются специальные события, на которые следует выполнять какие-либо действия, скажем, это может быть «swipe» (подобие перелистывания), или что-либо ещё.

Имя событияОписание
touchstart Событие срабатывает при возникновении касания к элементу.
touchmove Событие возникает после того как пользователь прикоснулся к элементу, и перемещает палец в другую точку.
touchend Событие возникает после разрыва прикосновения к элементу.
touchenter Событие возникает при условии, что касание происходит в пределах элемента.
touchleave Событие возникает, когда точка соприкосновения выходит за рамки элемента.
touchcancel Событие возникает тогда, когда точка соприкосновения больше не регистрируется на поверхности. К примеру, перемещение за пределы браузера.

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

Стоит отметить:

Объекты, возникающие во время прикосновения к сенсору.

Объект Event может возникать не только при работе с сенсором, но и при других событиях, скажем, это может быть событие onclick, onkeypress, либо что-то в этом роде. При возникновении событий связанный с сенсором, объект будет содержать уникальные свойства, которые содержат подробную информацию о событии прикосновения к сенсору, и другую информацию об этом.

СвойствоОписание свойства
altkeyЗначение логического типа, указывает на то, была ли нажата клавиша alt во время возникновения события на сенсоре.
changedTouchesСписок объектов которые были задействованы на момент действия прикосновения к сенсору:

  • В touchstart, он содержит список пальцев, которые вступили в контакт с сенсорной поверхностью во время этого события touchstart.
  • В touchmove, он содержит список пальцев, которые перешли во время этого события touchmove.
  • В touchend, он содержит список пальцев, которые только что были удалены с сенсорной поверхности во время этого события touchend.
  • В touchenter, он содержит список пальцев, которые вошли сенсорной поверхности во время этого события touchend.
  • В touchend, он содержит список пальцев, которые вышли из сенсорной поверхности во время этого события touchmove

Вы можете использовать свойство lenght, чтобы получить количество объектов касания внутри changedTouches[]

ctrlKeyЛогическое значение, указывающее, была ли нажата клавиша Ctrl во время сенсорного события.
metaKeyЛогическое значение, указывающее, была ли нажата клавиша Meta в момент касания события. Клавиша Meta — специальная клавиша на клавиатурах MIT, Happy Hacking и Sun Microsystems. Обозначается сплошным ромбом.
shiftKeyЛогическое значение, указывающее, была ли нажата клавиша shift во время сенсорного события.
targetTouchesСписок точек соприкосновения, которые происходят в настоящее время с сенсорной поверхностью, и находятся на том же элементе от момента возникновения события.

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

Вы можете использовать свойство lenght, чтобы получить количество объектов касания внутри targetTouches[].

touchesСписок объектов, представляющих все касания точек соприкосновения в настоящее время в контакте с сенсорной поверхностью, независимо от того, на каких элементах сенсорной поверхности находятся точки соприкосновения на данный момент.
typeТип события, которое вызвало объект Event, скажем, это может быть touchstart, touchmove и т.д.
targetЦелевой элемент, связанный с этим событием

Три свойства объекта changedTouches, targetTouches и touches могут содержать информацию о всех объектах соприкосновения с сенсором.

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

Свойства сенсорного объекта

СвойствоОписание
identifierНомерация объекта соприкосновения, каждый объект на сенсоре экрана принимает свой уникльный порядковый номер. Начинается значение с 0, и далее по порядку. Сохраняется значение для каждой точки соприкосновения до того момента, пока палец пользователя не снимается с поверхности.
screenXХ координата точки касания относительно левого края экрана пользователя.
screenYY координаты точки касания по отношению к верхнему краю экрана пользователя.
clientXХ координата точки касания относительно левого края окна просмотра, не включая смещения прокрутки.
clientYY координаты точки касания по отношению к верхнему краю окна просмотра, не включая смещения прокрутки.
pageXХ координата точки касания относительно левого края окна просмотра, в том числе смещения прокрутки.
pageYY координаты точки касания по отношению к верхнему краю окна просмотра, в том числе смещения прокрутки.
radiusXРадиус эллипса, который наиболее близко определяет сенсорную область (например, палец, стилус) вдоль оси х.
radiusYРадиус эллипса, который наиболее близко определяет сенсорную область (например, палец, стилус) вдоль оси y.
rotationAngleУгол (в градусах), эллипс описывается в radiusX и radiusY при повороте по часовой стрелке вокруг центра.
forceВозвращает силу точки касания в виде целого числа от 0 до 1, где 0 нет силы, которая была определена устройством, и 1, максимальное значение.
targetЦелевой элемент точки соприкосновения, может отличаться от элемента на который размещалось событие.

document.body.addEventListener('touchstart', function(e){
 var touchobj = e.changedTouches[0]
 console.log(this.tagName) // возврат BODY
 console.log(touchobj.target) // возвращает целевой элемент
}, false)

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

Пример 1

Здесь можно посмотреть пример использования событий touchmove и touchend, чтобы показать расстояние, пройденное в момент воздействия на сенсор от начала и до конца в блоке div.

В данном примере так же добавлена эмуляция курсора мыши, для устройств без сенсора. Чтобы увидеть реакцию скрипта, на странице примера следует провести курсором по блоку.

Исходники примеров можно взять из архива.

Показать исходный код примера

Пример 2

Здесь рассмотривается пример перемещения элементов (блока DIV) посредством сенсора. Реализовать это дело не сложно, можно сделать так, чтобы блок перемещался по горизонтали или по вертикали, не столь важно направление, сколько возможность реализовать это.

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

Показать исходный код примера

Пример 3

В этом примере определяется события прикосновения к сенсору, а так же одновременный “размах” пальцем на сенсоре (команда «swipe»).

В качестве правила, давайте уточним, какое движение по сенсорной поверхности мы будем рассматривать в качестве команды «swipe». В этом действии будут причастны две переменные, это расстояние, проходимое пальцем по оси x или y, от момента возникновения события touchstart до момента touchend, а так же время, которое потребовалось для этого действия. Используя эти данные, мы можем решить, производил ли пользователь действие, о котором мы говорим, либо нет.

Методом пробы, мы можем определить среднее значение, которое проходит палец по сенсору для этого действия по горизонтали и вертикали. Что касается перемещения пальца по горизонтали, то значения расстояния примерно одинаковы, однако при перемещении с лева на право, скорость значительно выше, примерно на 200 мс. Что касается вертикали, здесь перемещение пальца по сенсору рекомендуется определять при условии не более 100px, чтобы не мешать другим командам, вследствие чего при этом могут быть проблемы с ложным срабатыванием.

Пример определения команды «swipe» от левой стороны в правую (Для устройств, не оснащенных сенсором, так же в примере реализован симулятор для обычной компьютерной мыши).

Показать исходный код примера

По событию touchend мы проверяем, что расстояние, за которое прошел указатель на сенсоре от момента события touchstart до touchend является положительным числом, выше заданного порога значения, в нашем случае это 150. В то же время, мы отсеиваем возможное вертикальное движение менее 100px. Так как вертикальное перемещение курсора может быть выше начальной точки или ниже, мы используем Math.abs().



Пример 4

В примере выше мы рассмотрели определение команды swipe на сенсорных устройствах в направлении правой стороны. Кроме этого можно определять направление курсора на все 4 стороны (вправо, влево, вверх и вниз).
Пример определения команды «swipe» в любом направлении (для устройств, не оснащенных сенсором, в примере реализована поддержка обычного курсора мыши).

Показать исходный код примера

Мы связываем функцию swipedetect() для блока с id #touchsurface2, при возникновении действия «swipe» производиться смена фонового изображения блока div, таким образом, показывая направление движения пальца.