Обработка событий тачскринов на JavaScript
Обработка событий тачскринов на JavaScript
С развитием рынка мобильных устройств появилась необходимость дорабатывать сайты для более комфортного просмотра на планшетах и смартфонах. Так появилась адаптивная верстка. Но одной верстки недостаточно, кроме отображения требуется наладить взаимодействие web-приложения с пользователем, используя такие действия, как листание, мультитач и поворот экрана. Вот как это реализуется на JavaScript.
Начнем с самого простого - поворот экрана. При повороте экрана объекту window передается событие onorientationchange. В обработчике события проверяются значения clientWidth и clientHeight, на основании их соотношения определяется вертикальное или горизонтальное положение экрана. Использование этих значений позволяет избавиться от специфичных для разных браузеров значений типа screen.orientation. Для максимальной поддержки различных браузеров, обработчик поворота надо дублировать обработчиком события onresize - изменение размеров окна браузера.
Code (JavaScript) : Убрать нумерацию
- <script type="text/javascript">
- // Обработчик поворота экрана
- function change_orientation() {
- alert('Screen: '+screen.width+' '+screen.height);
- }
- // Установка обработчика поворота экрана
- if (window.onorientationchange) {
- window.onorientationchange=function() {
- change_orientation();
- }
- }
- else {
- window.onresize = function() {
- change_orientation();
- }
- }
- </script>
Свойство объекта TouchEvent | Описание |
---|---|
touches | Все нажатия |
targetTouches | Все нажатия в границах элемента, в котором произошло событие |
changedTouches | Изменившиеся нажатия с момента последнего нажатия (это полезно применять в обработчиках ontouchmove и ontouchend, а также для фильтрации новых и отпущенных нажатий) |
Каждая из трех перечисленных коллекций свойств Touch, в свою очередь, имеет свойства, по которым можно точно отследить координаты нажатия и элементы web-страницы, на которых эти нажатия произошли.
Свойство объекта Touch | Описание |
---|---|
clientX, clientY | Координаты нажатия относительно границ видимой области браузера |
screenX, screenY | Координаты нажатия относительно границ экрана |
pageX, pageY | Координаты нажатия относительно границ web-страницы, включая позицию вертикальной и горизонтальной прокрутки |
identifier | Числовой идентификатор нажатия для его отслеживания между событиями |
target | Элемент web-страницы, в границах которого произошло событие |
Обработчик события привязывается к документу целиком или к конкретному элементу web-страницы, который должен отвечать за взаимодействие с тачскрином. Например, полоса прокрутки или область с пролистываемым контентом.
Code (HTML) : Убрать нумерацию
- <div id="container" ontouchstart="multitouch(event);">Touch me</div>
Code (JavaScript) : Убрать нумерацию
- <script type="text/javascript">
- // Обработчик мультитача
- function multitouch(event) {
- // Подавить событие
- event.preventDefault();
- // Обработать массив с координатами нажатий
- for (var i=0; i<event.touches.length; i++) {
- // Получить координаты каждого нажатия
- var left=event.touches[i].pageX;
- var top=event.touches[i].pageY;
- // Выполнить с ними нужные действия
- }
- }
- </script>
Следующее действие - перетаскивание объектов. Если на стационарных компьютерах это было достаточно сложно реализовать, то на мобильных устройствах с тачскринами перетаскивание элементов web-страницы реализуется буквально несколькими строчками кода. Все основано на событии ontouchmove.
Code (HTML) : Убрать нумерацию
- <div id="floating" ontouchmove="move_object(event);">Drag me</div>
Code (JavaScript) : Убрать нумерацию
- <script type="text/javascript">
- // Перетаскивание элемента
- function move_object(event) {
- // Подавить событие
- event.preventDefault();
- var left=event.touches[0].pageX;
- var top=event.touches[0].pageY;
- // Переместить элемент
- var el=document.getElementById('floating');
- el.style.top=top+'px';
- el.style.left=left+'px';
- }
- </script>
Ну и последнее на сегодня - листание. Это комбинированное событие, начинающееся с нажатия и заканчивающееся сдвигом нажатия влево или вправо на определенное расстояние. Для определения расстояния при первоначальном нажатии надо сохранить координаты события, а в обработчике движения отслеживать разницу между текущими и сохраненными координатами нажатия. Как только разница будет превышать определенное значение, событие листания можно считать состоявшимся. Направление листания определяется по тому, больше или меньше текущие координаты сохраненных.
Code (HTML) : Убрать нумерацию
- <div ontouchstart="turn_start(event);" ontouchmove="turn_page(event);">Turn me</div>
Code (JavaScript) : Убрать нумерацию
- <script type="text/javascript">
- var touch_position; // Координата нажатия
- function turn_start(event) {
- // При начальном нажатии получить координаты
- touch_position = event.touches[0].pageX;
- }
- function turn_page(event) {
- // При движении нажатия отслеживать направление движения
- var tmp_move = touch_position-event.touches[0].pageX;
- // Сдвиг достаточный?
- if (Math.abs(tmp_move)<10) { return false; }
- if (tmp_move<0) {
- // Листаем вправо
- }
- else {
- // Листаем влево
- }
- }
- </script>
На демонстрационной странице вы можете посмотреть все описанные действия: обработку поворота экрана, перетаскивание элементов, мультитач и литстание. Смотреть страницу надо с мобильных устройств, на стационарных компьютерах ничего работать не будет.
Просмотров: 29066 | Комментариев: 5
Метки: JavaScript
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
Freelancer
(15.05.2018 в 12:17):
Финальное листание правильнее выполнять на событие touchend, а в touchmove фиксировать только сдвиг, иначе будет множественное срабатывание листания.
ManHunter
(04.02.2018 в 00:50):
В чем проблема? Мышь прекрасно работает через OTG, события все те же, что и на десктопе.
Дмитрий
(02.02.2018 в 23:39):
А как сделать одновременно чтобы и мышка работала и тач?
Cooller
(20.09.2015 в 22:15):
Спасибо, очень помогло!
cyberdjon
(01.08.2014 в 16:29):
Классная статья. Спасибо.
Добавить комментарий
Заполните форму для добавления комментария