Java, UX, HTML, CSS, WEB-design

События ввода в браузере: можем ли мы сделать лучше, чем щелчок?

[ad_1]

  • Дастан Кастен

  • 0 Комментарии

События ввода в браузере: можем ли мы сделать лучше, чем щелчок?

  • 8 минут чтения

  • Кодирование, Устройства, Адаптивный дизайн, Дизайн взаимодействия

Краткое резюме ↬

Реагирование на пользовательский ввод, возможно, является основой того, что мы делаем как разработчики интерфейсов. Для создания адаптивных веб-продуктов ключевое значение имеет понимание того, как сенсорное управление, мышь, указатель и действия клавиатуры и браузер взаимодействуют друг с другом. Вы, вероятно, сталкивались с 300-миллисекундной задержкой в ​​мобильных браузерах или боролись с сенсорным перемещением по сравнению с прокруткой. В этой статье мы познакомимся с каскадом событий и используем эти знания для реализации демонстрации события касания, которое поддерживает множество методов ввода, не прерывая работу прокси-браузеров, таких как Opera Mini.

Реагирование на пользовательский ввод, возможно, является основой того, что мы делаем как разработчики интерфейсов. Для создания адаптивных веб-продуктов ключевое значение имеет понимание того, как сенсорное управление, мышь, указатель и действия клавиатуры и браузер взаимодействуют друг с другом. Вы, вероятно, сталкивались с 300-миллисекундной задержкой в ​​мобильных браузерах или боролись с сенсорным перемещением по сравнению с прокруткой.

В этой статье мы познакомимся с каскадом событий и используем эти знания для реализации демонстрации события касания, которое поддерживает множество методов ввода, не прерывая работу прокси-браузеров, таких как Opera Mini.

  • (Не очень) секретные возможности мобильного браузера
  • Создание простого кроссбраузерного автономного списка дел
  • События JavaScript и ответы пользователю
  • Семь смертных грехов реализации JavaScript
  • 7 вещей в JavaScript, которые я хотел бы знать намного раньше в своей карьере

Обзор

Сегодня для взаимодействия с Интернетом используются три основных метода ввода: цифровые курсоры (мышь), тактильный (прямое касание или стилус) и клавиатура. У нас есть доступ к ним в JavaScript через события касания, события мыши, события указателя и события клавиатуры. В этой статье мы в первую очередь рассматриваем взаимодействия с помощью сенсорного экрана и мыши, хотя некоторые события имеют стандартные взаимодействия с помощью клавиатуры, такие как click и submit Мероприятия.

Еще после прыжка! Продолжить чтение ниже ↓

Скорее всего, вы уже применяли обработчики событий касания и мыши. Было время в нашем недалеком прошлом, когда рекомендуемый метод был чем-то вроде этого:


/** DO NOT EVER DO THIS! */
$('a', ('ontouchstart' in window) ? 'touchend' : 'click', handler);

Microsoft взяла на себя инициативу по созданию лучшей, перспективной модели событий с помощью спецификации Pointer Events. События указателя — это абстрактный механизм ввода, который теперь является рекомендацией W3C. События указателя дают пользовательскому агенту (UA) гибкость для размещения многочисленных механизмов ввода в одной системе событий. Мышь, сенсорный экран и стилус — все это примеры, которые легко приходят на ум сегодня, хотя можно вообразить реализации, распространяющиеся на Myo или Ring. Хотя веб-разработчики, кажется, действительно взволнованы этим, не все разработчики браузеров думают так же. А именно, Apple и Google решили в настоящее время не реализовывать события указателя.

Решение Google не обязательно является окончательным, но никакой активной работы над событиями указателя не ведется. Наш ввод и использование событий указателя через полифиллы и альтернативные решения станут частью уравнения, которое в конечном итоге может склонить чашу весов в другую сторону. Apple выступила против событий с указателями в 2012 году, и я не знаю о каком-либо публичном ответе инженеров Safari.

Каскад событий

Когда пользователь касается элемента на мобильном устройстве, браузер запускает множество событий. Это действие обычно запускает серию событий, таких как следующие: touchstarttouchendmouseovermousemovemousedownmouseupclick.

Это связано с обратной совместимостью с сетью. События указателя используют альтернативный подход, запуская встроенные события совместимости: mousemovepointerovermouseoverpointerdownmousedowngotpointercapturepointerupmouseuplostpointercapturepointeroutmouseoutfocusclick.

Спецификация событий позволяет агентам пользователя различаться реализацией событий совместимости. Патрик Лауке и Питер-Пол Кох хранят обширный справочный материал по этой теме, ссылка на который приведена в разделе ресурсов внизу этой статьи.

На следующем рисунке показан каскад событий для следующих действий:

  1. первоначальное нажатие на элемент,
  2. второй тап по элементу,
  3. постукивая по элементу.

Обратите внимание: этот стек событий намеренно игнорирует, где focus и blur события помещаются в этот стек.

Каскад событий на устройствах iOS для двойного нажатия на элемент и последующего нажатия
Каскад событий на устройствах iOS для двойного нажатия на элемент и последующего нажатия. (Изображение: Стивен Дэвис) (Просмотреть большую версию)
Каскад событий на большинстве устройств Android 4.4 для двойного касания элемента и последующего касания
Каскад событий на большинстве устройств Android 4.4 для двойного касания элемента и последующего касания. (Изображение: Стивен Дэвис) (Просмотреть большую версию)
Каскад событий в IE 11 (до того, как были реализованы события касания совместимости) для двойного касания элемента, а затем касания.
Каскад событий в Internet Explorer 11 (до того, как были реализованы события касания совместимости) для двойного касания элемента, а затем касания. (Изображение: Стивен Дэвис) (Просмотреть большую версию)

Применение каскада событий

Большинство веб-сайтов, созданных сегодня для настольных компьютеров, «просто работают» благодаря усилиям разработчиков браузеров. Несмотря на то, что каскад выглядит коряво, консервативный подход к построению для событий мыши, который мы использовали ранее, в целом будет работать.

Конечно, есть загвоздка. Печально известная 300-миллисекундная задержка является самой известной, но взаимодействие между прокруткой, touchmove и pointermove события и отрисовка браузера являются дополнительными проблемами. Избежать 300-миллисекундной задержки легко, если:

  • мы оптимизируем только для современного Chrome для Android и настольных компьютеров, которые используют такие эвристики, как <meta name="viewport" content="width=device-width"> отключить задержку;
  • мы оптимизируем только под iOS, и пользователь делает четкое нажатие, но не быстрый тап и не долгий тап — просто хорошее, нормальное, четкое нажатие на элемент (о, это еще зависит от того, находится ли он в UIWebView или в WKWebView — прочтите выпуск FastClick на эту тему, чтобы хорошенько выплакаться).

Если наша цель состоит в том, чтобы создавать веб-продукты, которые конкурируют с нативными платформами в пользовательском опыте и полировке, нам необходимо уменьшить задержку ответа на взаимодействие. Для этого нам нужно строить примитивные события (down, move и up) и создание собственных составных событий (click, double-click). Конечно, нам все еще нужно включить резервные обработчики для собственных событий для широкой поддержки и доступности.

Для этого требуется немало кода или знаний. Чтобы избежать задержки в 300 миллисекунд (или любой другой продолжительности) в разных браузерах, нам нужно самостоятельно обрабатывать весь жизненный цикл взаимодействия. Для данного {type}down событие, нам нужно будет связать все события, необходимые для выполнения этого действия. Когда взаимодействие будет завершено, нам нужно будет убрать за собой, отвязав все, кроме начального события.

Вы, разработчик веб-сайта, единственный, кто знает, должна ли страница масштабироваться или должно ожидать другое событие двойного нажатия. Если — и только если — вам требуется задержка обратного вызова, если вы допускаете задержку для предполагаемого действия.

По следующей ссылке вы найдете небольшую демонстрацию касания без зависимостей, чтобы проиллюстрировать усилия, необходимые для создания события касания с несколькими входами и малой задержкой. Polymer-gestures — это готовая к использованию реализация тапа и других событий. Несмотря на свое название, он никак не привязан к библиотеке Polymer и может легко использоваться изолированно.

Чтобы было ясно, реализовать это с нуля — плохая идея. Следующее предназначено только для образовательных целей и не должно использоваться в производстве. Существуют готовые решения, такие как FastClick, полимерные жесты и Hammer.js.

  • Демо: Событие касания
  • Код: taps.js

Важные моменты

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


/**
 * If there are pointer events, let the platform handle the input 
 * mechanism abstraction. If not, then it’s on you to handle 
 * between mouse and touch events.
 */

if (hasPointer) {
  tappable.addEventListener(POINTER_DOWN, tapStart, false);
  clickable.addEventListener(POINTER_DOWN, clickStart, false);
}

else {
  tappable.addEventListener('mousedown', tapStart, false);
  clickable.addEventListener('mousedown', clickStart, false);

  if (hasTouch) {
    tappable.addEventListener('touchstart', tapStart, false);
    clickable.addEventListener('touchstart', clickStart, false);
  }
}

clickable.addEventListener('click', clickEnd, false);

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


/**
 * On tapStart we want to bind our move and end events to detect 
 * whether this is a “tap” action.
 * @param {Event} event the browser event object
 */

function tapStart(event) {
  // bind tracking events. “bindEventsFor” is a helper that automatically 
  // binds the appropriate pointer, touch or mouse events based on our 
  // current event type. Additionally, it saves the event target to give 
  // us similar behavior to pointer events’ “setPointerCapture” method.

  bindEventsFor(event.type, event.target);
  if (typeof event.setPointerCapture === 'function') {
    event.currentTarget.setPointerCapture(event.pointerId);
  }

  // prevent the cascade
  event.preventDefault();

  // start our profiler to track time between events
  set(event, 'tapStart', Date.now());
}

/**
 * tapEnd. Our work here is done. Let’s clean up our tracking events.
 * @param {Element} target the html element
 * @param {Event} event the browser event object
 */

function tapEnd(target, event) {
  unbindEventsFor(event.type, target);
  var _id = idFor(event);
  log('Tap', diff(get(_id, 'tapStart'), Date.now()));
  setTimeout(function() {
    delete events[_id];
  });
}

Остальной код должен быть довольно понятным. По правде говоря, это много бухгалтерии. Реализация пользовательских жестов требует тесного взаимодействия с системой событий браузера. Чтобы избавить себя от боли и душевной боли, не делайте этого по очереди во всей кодовой базе; скорее создайте или используйте сильную абстракцию, такую ​​как Hammer.js, полифил jQuery Pointer Events или полимерные жесты.

Вывод

Некоторые события, которые раньше были очень четкими, теперь наполнены двусмысленностью. То click событие раньше означало одно и только одно, но сенсорные экраны усложнили его, поскольку необходимо различать, является ли действие двойным щелчком, прокруткой, событием или каким-либо другим жестом на уровне ОС.

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

С какими неожиданными проблемами вы столкнулись при создании веб-сайтов для нескольких устройств? Какие подходы вы использовали для решения многочисленных моделей взаимодействия в Интернете?

Дополнительные ресурсы

  • «События Pointer завершены, но отсутствие поддержки со стороны Apple по-прежнему мешает сделке», — Питер Брайт.
  • «Прикосновение: введение в события касания и указателя», включая слайды и выступление, Патрик Э. Лауке.
  • «Сеть Apple?» Тим Кадлек
  • «Как избежать задержки клика в 300 мс, доступно», — Тим Кадлек.
  • «Сенсорный стол», Питер-Пол Кох
  • «Заставить Интернет «просто работать» с любым входом: мышью, касанием и событиями указателя», Джейкоб Росси.
  • Библиотека FastClick
  • Hammer.js
  • полимерные жесты
  • Полифилл jQuery PointerEvents
  • «Внедрение пользовательских жестов», Google Developers
Сокрушительная редакция
(да, ал, мл)



[ad_2]
Source: https://smashingmagazine.com

Заключение

Вы ознакомились с статьей — События ввода в браузере: можем ли мы сделать лучше, чем щелчок?

Пожалуйста оцените статью, и напишите комментарий.

Похожие статьи

Добавить комментарий

Ваш адрес email не будет опубликован.

Краткое описание по статье События ввода в браузере: можем ли мы сделать лучше, чем щелчок?

Название: События ввода в браузере: можем ли мы сделать лучше, чем щелчок? . Краткое описание: [ad_1] ⭐ Дастан . Дата публикации: 08.02.2022 . Автор: Алишер Валеев .

Для чего создан сайт Novosti-Nedeli.ru

Данный сайт посвящен новостям мира и мира технологий . Также тут вы найдете руководства по различным девайсам.

Сколько лет сайту?

Возраст составляет 3 года

Кнопка «Наверх»