Мне интересно, есть ли простой способ отсрочить событие клика от обработки в течение определенного периода времени. Например, мы могли бы иметьОтложенное событие click
$('#someElement').on('click', 'a', function(event) {
var duration = 1000;
someAsynchronousFunction(); // Start as soon as click occurs
... // Code to delay page transition from taking place for duration specified
});
Таким образом, в этом случае для асинхронной функции будет гарантировано определенное количество времени на запуск. Если он не завершил работу в это время, мне было бы все равно, и я хотел бы продолжить переход на страницу. Я знаю, что это можно сделать что-то близкое с
event.preventDefault();
...
setTimeout(function(){
window.location = $(this).attr('href');
}, duration);
Но это работает только тогда, когда ссылка будучи щелкнул идет на полную страницу. Я хочу иметь дело со ссылками, которые используются для вызовов ajax (которые также не меняют URL).
Я заметил, что библиотека mixpanel имеет функцию track_links, которая, похоже, выполняет задержку при переходе на страницу, хотя эта функция, похоже, не работает с поддержкой ссылок ajax, о которых я упоминал.
Любая помощь будет замечательной! Благодарю.
Редактировать: Поэтому я полагаю, что мой вопрос не совсем ясен, поэтому я постараюсь предоставить более подробную информацию ниже.
Меня не волнует, работает ли функция асинхронной работы! Я только хочу дать ему гарантию, что у него есть определенное количество времени для выполнения, после чего мне все равно, закончится ли оно, и предпочтет продолжить переход на страницу.
Т.е. я хочу отложить не начало асинхронной функции, а начало перехода страницы. Функция async начнет работать, как только произойдет щелчок.
Надеюсь, это немного более понятно!
Я не понимаю, вы хотите выполнить функцию после задержки? Что? – Qchmqs
Я должен быть более конкретным, извините. Я хочу, чтобы асинхронная функция запускалась сразу после нажатия ссылки, но я хочу, чтобы ей было гарантировано определенное количество времени (и, надеюсь, закончить то, что она делает), прежде чем страница будет изменена. – nitarshan
Похоже, вы попадаете в самую старую ловушку в JavaScript: задерживаете что-то в тех надеждах, которые она выполнит после завершения асинхронного события. Не делайте этого: используйте обратный вызов или обещание. Вы не знаете, как долго будет выполняться вызов 'someAsynchronousFunction();'. – msanford