У меня раньше была похожая проблема. Насколько я знаю, браузер не выдает событий, когда пользователь вставляет правой кнопкой мыши, или когда они выбирают из списка ранее использованных значений.
В итоге я решил ее достаточно хорошо, связав обработчик событий с событием размытия. Единственный случай, когда это не уловилось, это когда они вставили значение мышью, а затем нажали клавишу Enter для подтверждения. Я смог обойти это с помощью небольшой хакерской атаки:
$(element)
.bind('keydown blur', handlerFunction)
.keydown(function(event) {
if (event.keyCode === 13 /* Enter Key */) {
event.preventDefault();
event.stopPropagation();
}
})
.keyup(function(event) {
if (event.keyCode === 13 /* Enter Key */) {
$(this).closest('form').submit();
}
});
По сути, это работает, потому что jQuery будет выполнять события в том порядке, в котором они были связаны. Обычно отправка формы происходит по нажатию клавиши Enter. Чтобы дать время обработчику keyup выполнить свое волшебство, вам нужно отложить отправку этой формы до тех пор, пока не произойдет событие keyup, чтобы другой обработчик keyup мог запускаться первым.
Итак, вы сказали, что используете плагин, который добавляет задержку перед реакцией на событие пользователя. Это означает, что вы не сможете использовать эту технику дословно. Вместо этого может сработать прямой вызов функции-обработчика перед тем, как разрешить отправку формы. Для этого вы должны изменить последний обработчик keyup на:
.keyup(function(event) { // Part 2
if (event.keyCode === 13 /* Enter Key */) {
handlerFunction.call(this, event); // force it to happen now
$(this).closest('form').submit();
}
});
Как уже упоминал Джош К., вы можете просто связать что-то с событием отправки в вашей форме, чтобы сделать что-то подобное. Однако, если вы выполняете Ajax там, обязательно укажите async: false
в переданных параметрах, потому что в противном случае форма будет отправлена и будет отправлена, не дожидаясь завершения вызова.