Я сталкивался с этой проблемой и провел некоторое время, пока не нашел удовлетворительного решения. Моя проблема немного отличалась от первоначального вопроса, так как я хотел отклонить событие ввода при касании за пределами области элемента ввода.
Целенаправленные ответы выше работают, но я думаю, что они не полны, поэтому вот моя попытка, если вы зайдете на эту страницу в поисках того же, что и я:
Решение jQuery
Мы добавляем обработчик событий touchstart
ко всему документу. При касании экрана (неважно, касание это, удержание или прокрутка), он активирует обработчик, а затем мы проверим:
- Представляет ли область касания ввод?
- Сфокусирован ли ввод?
Учитывая эти два условия, мы затем запускаем событие blur()
для удаления фокуса с ввода.
ps: я немного ленив, поэтому просто скопировал строку ответа выше, но вы можете использовать селектор jQuery для документа, если вы хотите сохранить согласованность кода
$(document).on('touchstart', function (e) {
if (!$(e.target).is('.my-input') && $('.my-input').is(':focus')) {
document.activeElement.blur();
}
});
Hammer.JS решение
В качестве альтернативы вы можете использовать Hammer.JS для обработки ваших сенсорных жестов. Допустим, вы хотите отклонить это для события tap
, но клавиатура должна быть там, если пользователь просто прокручивает страницу (или, скажем, удерживает выделенный текст, чтобы он мог скопировать это и вставить в вашу область ввода)
В этой ситуации решение будет:
var hammer = new Hammer(document.body);
hammer.on('tap', function(e) {
if (!$(e.target).is('.search-input') && $('.search-input').is(':focus')) {
document.activeElement.blur();
}
});
Надеюсь, это поможет!