Если вы хотите избежать «стандартного действия», вы можете вызвать event.preventDefault()
внутри функции обработчика кликов. Нет необходимости удалять и переустанавливать саму функцию щелчка.
Кроме того, элемент jquery btn
не будет знать, что делать со свойством "onclick". Это было бы свойством объекта DOM.
Вы не первый, кто придумал эту проблему ;-) Смотрите здесь https://stackoverflow.com/a/14154017/2610061 для возможного решения.
(Похоже, вы должны знать , какое действие вы хотите отложить, поскольку не существует стандартного способа запоздалого запуска любого действия, которое изначально было предотвращено. Вы можете запускать только определенныетакие действия, как .submit()
формы.)
Я подготовил сценарий, который будет соответствовать вашим требованиям. Обратите внимание, что я не фиксирую событие "click" на фактической кнопке , но вместо этого я слушаю событие "submit" в окружающей форме . Форма может быть отправлена либо нажатием кнопки, либо нажатием клавиши возврата после заполнения поля ввода. Текущий обработчик событий будет выполнен в любом случае!
Сначала предотвращается действие по умолчанию, а затем отправляется асинхронный вызов Ajax. Его функция успеха в .done()
выполняет некоторую «значимую» проверку ответа и - в зависимости от ее результата - инициирует отправку формы или нет. В случае сбоя самого вызова Ajax функция .fail()
переходит в действие и выполняет все необходимое ...
$(function() {
$('.validatedForm').on('submit', function(ev) {
ev.preventDefault(); // prevent submission before AJAX call
$.getJSON('http://jsonplaceholder.typicode.com/users/'+$('#q').val())
.done(function(da){
console.log(da);
if (da.address.city!=="Howemouth") { // some meaningful test on the result ...
setTimeout(()=>ev.target.submit(), 3000); // belated form submission!
console.log('Hey, the input was changed, in 3 seconds I will go to google!')
}})
.fail(function(da){console.log(da.status, da.statusText,'- Only user-IDs 1 ... 10 are allowed.');});
});
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<form action="http://google.com" class="validatedForm">
<input name="q" id="q" value="7">
<button>submit</button>
</form>