Добро пожаловать в команду веб-разработчиков Futu,несоответствие
Однажды сделал для компании страницу введения адаптивной платы, в основном о корректировке стандартов тарификации, начальник сказал, что придает этому большое значение, и было много подходящих людей, поэтому он также сообщил о нескольких проблемах, с которыми не часто сталкивался, одна из которых было околоtouchstart
а такжеclick
проблема события. Запишите сюда, исправления приветствуются.
1. Вопросы
В полдень наконец-то была запущена страница введения платы, которая разрабатывалась несколько дней. Одноклассники по эксплуатации уверенно разослали сообщение о продвижении стандартной страницы зарядки, а потом мы все пошли обедать. Во время обеда я получил отзыв от клиента в группе WeChat: самая критическая часть нашей страницы - нажатие на детали зарядки не отвечает!
Затем мы проверили отчеты об ошибках и журналы внешнего интерфейса и не нашли подсказки. Подтвердите среду с клиентом, клиент использует ПК с Windows.
Но как ни странно, я протестировал несколько устройств и до сих пор не могу воспроизвести проблему. Я не могу воспроизвести эту проблему на машине моего коллеги.
2. Отслеживаемость
Мы повторно изучили код привязки событий и обнаружили, что на самом деле он очень прост.
var tap = 'ontouchstart' in window ? 'touchstart' : 'click';
wrap.addEvenListener(tap, function(){
signUp();
});
Единственное, что немного особенного, это то, что наша страница является адаптивной.Чтобы избежать задержки в 300 мс при нажатии на мобильный терминал, мы сделали суждение перед привязкой, и мобильный терминал привязан.touchstart
событие, сторона ПК связанаclick
мероприятие. Однако этот код также выглядит безвредным для людей и животных и не приводит к тому, что клики не реагируют.
3. Позиционирование
Мы снова запросили у клиента более подробную информацию об окружающей среде и получили очень важную информацию: клиент использует ноутбук Lenovo. Поскольку некоторые коллеги в группе обратили на это внимание, когда вышел Surface, я помню, что Lenovo в то время также выпускала много ноутбуков с сенсорным экраном. Поэтому я снова связался с клиентом и подтвердил, что он использует ноутбук Lenovo с сенсорным экраном.
На данный момент проблема очень ясна, и проблема, в конечном счете, связана с привязанным событием «щелчок». Мы лишь приблизительно определили, поддерживает ли устройство сенсорные события во время обнаружения, но проигнорировали тот факт, что это могут быть устройства ПК, поддерживающие сенсорные события, и клиенты могут по-прежнему работать, щелкая мышью. На самом деле это отражает то, что мы игнорировали разнообразие пользовательских устройств и делали слишком много предположений о пользовательском устройстве при разработке, что в конечном итоге привело нас к мысли, что это мобильный телефон, а это оказался настоящий ноутбук.
Подводя итог, ключевые моменты таковы:
- Некоторые устройства ПК имеют сенсорные экраны и поддерживают
touchstart
а такжеclick
мероприятие; - Пользовательский триггер
touchstart
События по умолчанию неизбежно приведут к срабатываниюclick
событие, но вызываетclick
события, которые не обязательно приводят кtouchstart
событие срабатывает; - Когда такое устройство подключено к внешней мыши, оно будет привязано указанным выше методом привязки.
touchstart
события, но действия мыши могут запускать толькоclick
, Привести кtouchstart
не срабатывает;
4. Решения
До сих пор причина проблемы была проанализирована, и как с ней бороться, стало проблемой. Суть этого вопроса заключается в том, чтобы определить стратегию использования события «клик» на разных устройствах. Его условно делят на следующие категории:
1. Оба используют событие клика
- Преимущества: при самоадаптации поддерживаются разные устройства, нет проблем с совместимостью, а стоимость разработки низкая;
- Недостатки: На мобильном терминале есть задержка в 300мс (хотя коллеги говорят, что вообще ее не ощущают)
2. Определите, является ли устройство мобильным терминалом через UA, а затем подтвердите тип события.
function isMobile() {
return navigator.userAgent.match(/(blackberry|configuration\/cldc|hp |hp-|htc |htc_|htc-|iemobile|kindle|midp|mmp|motorola|mobile|nokia|opera mini|opera |Googlebot-Mobile|YahooSeeker\/M1A1-R2D2|android|iphone|ipod|mobi|palm|palmos|pocket|portalmmm|ppc;|smartphone|sonyericsson|sqh|spv|symbian|treo|up.browser|up.link|vodafone|windows ce|xda |xda_)/i) ? true : false;
}
var tap = isMobile() ? 'touchstart' : 'click';
- Преимущества: при самоадаптации стоимость разработки низкая, а тип события щелчка определяется типом устройства, что может решить большинство проблем, а работа пользователя больше соответствует ожиданиям;
- Недостатки: Он не может удовлетворить все ситуации.Если пользователь подключает внешнюю мышь к iPad или телефону Android (идентифицированному как мобильное устройство), этот метод не будет работать (PS: Вы должны сделать это, и я не FUCK сказать).
3. Все используют щелчок, решите проблему задержки в 300 миллисекунд с помощью FastClick.
//引入FastClick
var FastClick = require('tool-fastclick');
//页面初始化时调用
new FastClick(document.body);
- Достоинства: Стоимость разработки невысокая и относительно невысокая, а в 1 и 2 проблем не будет
- Недостатки: Внедрение дополнительных сторонних библиотек, будут ли у FastClick другие ямки? Это не гарантируется
Примечание:
tool-fastclick
Это версия группового форка FastClick, и в настоящее время нет открытого исходного кода. Мы исправили некоторые из существующих проблем, таких как: когда на одной странице есть несколько полей выбора, параметры будут прыгать.
4. Гарантии
На самом деле, лучшее решение — не судить при вязке, аtouchstart
а такжеclick
связать одновременно, но вtouchstart
Временно отменить реакцию на последующие клики при срабатывании.
Есть три конкретных реализации:
- существует
touchstart
Вызывается в ответ на событиеpreventDefault()
метод предотвращения последующегоclick
триггер события - существует
touchstart
Установите некоторые флаги в событии или отменитеclick
привязка событий, чтобыclick
Когда событие запускается, логика, которую мы связываем, не будет запущена, и она возобновится через определенный период времени (например, 300–500 мс). - Напрямую ограничивайте обработчик событий, чтобы гарантировать, что в течение периода времени (300–500 мс) обработчик событий будет запущен только один раз.
Конечно, как и выше, у каждого варианта есть свои плюсы и минусы.
Вариант 1 отменяет последующее наблюдениеclick
Запуск событий может привести к некоторым зависимостям, когда несколько привязок событий накладываются друг на друга или сотрудничают несколько людей.click
Ошибка в логике события.
Принцип схемы 2 и схемы 3 в основном одинаков, реализация имеет определенную сложность, и по сути является халтурной схемой, неприменимой к некоторым нестандартным сценариям. Например, сцена, требующая быстрых и непрерывных кликов, или сцена, где пользователь нажимает очень медленно и т. д.
Короче говоря, нет универсального решения, хе-хе...
наконец
Некоторых людей может больше заинтересовать страница введения платы, упомянутая в начале статьи.здесь.