Я хочу провести мероприятие до тех пор, пока я не буду готов его запустить, например
$('.button').live('click', function(e){
e.preventDefault();
// do lots of stuff
e.run() //this proceeds with the normal event
}
Есть ли эквивалент run()
функции, описанной выше?
jquery
jquery-events
масатекского
источник
источник
Ответы:
Нет. Как только событие было отменено, оно отменяется.
Впрочем, вы можете повторно запустить событие позже, используя флаг, чтобы определить, уже запущен ваш пользовательский код или нет - например, это (пожалуйста, игнорируйте явное загрязнение пространства имен):
Более обобщенный вариант (с дополнительным преимуществом предотвращения загрязнения глобального пространства имен) может быть:
Использование:
Бонусный супер-минималистичный плагин jQuery с
Promise
поддержкой:Использование:
источник
lots_of_stuff_already_done = true;
флаг - в противном случае функция не сможет продолжить работу.Более свежая версия принятого ответа.
Краткая версия:
Хороший вариант использования для чего-то подобного - это когда у вас может быть какой-то устаревший код формы, который работает, но вас попросили улучшить форму, добавив что-то вроде проверки адреса электронной почты перед отправкой формы. Вместо того, чтобы копаться в почтовом коде серверной формы, вы можете написать API, а затем обновить свой код переднего плана, чтобы сначала использовать этот API, прежде чем позволить форме выполнять традиционный POST.
Для этого вы можете реализовать код, подобный тому, что я написал здесь:
источник
Вы можете сделать что-то вроде
источник
Переопределите свойство
isDefaultPrevented
следующим образом:ИМХО, это наиболее полный способ перезапуска события с точно такими же данными.
источник
e
не определено должно бытьevt.preventDefault()
. Я пытался редактировать, но мои изменения должны быть> 6 символов, и я просто добавил 2 :(event.isPropagationStopped = function(){ return false; };
. Я также добавил пользовательское свойство к событию, чтобы в обработчике я мог определить, была ли выполнена проверка, препятствующая выполнению действия, чтобы оно не было выполнено снова. Большой!Можно использовать
currentTarget
изevent
. Пример показывает, как приступить к отправке формы. Точно так же вы можете получить функцию изonclick
атрибута и т. Д.источник
submit()
тот же элемент, не вернетесь ли вы к своему коду `` $ ('form'). on ('submit') и повторите его снова и снова?Просто не выполняйте
e.preventDefault();
, или выполняйте это условно.Вы, конечно, не можете изменить, когда происходит исходное событие.
Если вы хотите «воссоздать» исходное событие пользовательского интерфейса через некоторое время (скажем, в обратном вызове для запроса AJAX), вам просто нужно будет подделать его другим способом (как в ответе vzwick) ... хотя я бы Вопрос в юзабилити такого подхода.
источник
Более свежий ответ умело использует
jQuery.one()
https://stackoverflow.com/a/41440902/510905
источник
до тех пор, пока "много вещей" не делает что-то асинхронное, это абсолютно ненужно - событие будет вызывать каждый обработчик по пути в последовательности, поэтому, если на родительском элементе происходит событие onklick, оно срабатывает после onclik- Событие ребенка обработано полностью. javascript здесь не выполняет какую-то «многопоточность», что делает «остановку» обработки событий необходимой. Вывод: «приостанавливать» событие, просто чтобы возобновить его в том же обработчике, не имеет никакого смысла.
если «много вещей» является чем-то асинхронным, это также не имеет смысла, поскольку мешает асинхронным вещам делать то, что они должны делать (асинхронные вещи), и заставляет их вести себя так, как будто все в порядке (где мы возвращаемся к моему первому абзацу) )
источник
async
-fag: api.jquery.com/jQuery.ajax ) ... но создание синхронного ajax-запроса - плохая идея почти во всех случаях, так что было бы лучше найти другое решение.Подход, который я использую, заключается в следующем:
источник
Принятое решение не будет работать, если вы работаете с тегом привязки. В этом случае вы не сможете снова щелкнуть ссылку после звонка
e.preventDefault()
. Это потому, что событие click, сгенерированное jQuery, это просто слой поверх событий собственного браузера. Таким образом, запуск события click для тега привязки не приведет к переходу по ссылке. Вместо этого вы можете использовать библиотеку типа jquery-simulate , которая позволит вам запускать собственные события браузера.Подробнее об этом можно узнать по этой ссылке
источник
Другое решение - использовать window.setTimeout в прослушивателе событий и выполнить код после завершения процесса события. Что-то вроде...
источник
Я знаю, что эта тема старая, но я думаю, что могу внести свой вклад. Вы можете в любое время запустить поведение по умолчанию для определенного элемента в своей функции-обработчике, если вы уже знаете это поведение. Например, когда вы запускаете событие click для кнопки сброса, вы фактически вызываете функцию сброса в ближайшей форме в качестве поведения по умолчанию. В вашей функции обработчика после использования функции protectDefault вы можете вызвать поведение по умолчанию, вызвав функцию сброса в ближайшей форме в любом месте кода вашего обработчика.
источник
Если этот пример может помочь, добавьте «пользовательское подтверждение popin» на некоторые ссылки (я сохраняю код «$ .ui.Modal.confirm», это просто пример обратного вызова, который выполняет исходное действие):
источник