Как отложить возврат функции до тех пор, пока не будут выполнены щелчки
-
06-07-2019 - |
Вопрос
Следующая функция confirmDialog вызывается на полпути через другую функцию jquery.Когда этот confirmDialog возвращает true, предполагается, что другая функция продолжит работу...но это не так.Причина этого, по-видимому, заключается в том, что вся функция confirmDialog уже выполнена (возвращая false) к моменту нажатия кнопки продолжить.Как я могу отложить возврат чего-либо до тех пор, пока не будут нажаты кнопки?
(Или, если я совершенно не на том пути, в чем проблема и как мне ее исправить?)
function confirmDialog(message) {
....
$('input#continue', conf_dialog).click(function() {
$(this).unbind();
$('p',conf_dialog).fadeOut().text('Are you really sure you want to '+message).fadeIn();
$(this).click(function() {
$(conf_dialog).remove();
return true;
});
});
$('input#cancel', conf_dialog).click(function() {
$(conf_dialog).remove();
return false;
});
}
Решение
function callingFunction() {
$('a').click(function() {
confirmDialog('are you sure?', dialogConfirmed);
// the rest of the function is in dialogConfirmed so doesnt
// get run unless the confirm button is pressed
})
}
function dialogConfirmed() {
// put the rest of your function here
}
function confirmDialog(message, callback) {
...
$('input#continue', conf_dialog).click(function() {
callback()
$(conf_dialog).remove();
return false;
}),
$('input#cancel', conf_dialog).click(function() {
$(conf_dialog).remove();
return false;
})
...
}
Другие советы
Я не уверен, что ты можешь.
Только встроенная функция AFAIK, такая как Подтвердить
, alert
или prompt
, может блокироваться при запросе ответа.
Обходной путь - рефакторинг вашего кода для использования обратных вызовов (или использования встроенных функций). Так что это будет означать разделение вашей вызывающей функции на две части и выполнение второй части при получении ввода.
В verifyDialog вы настраиваете обработчики событий, которые будут выполняться при возникновении событий, а не при запуске verifyDialog. Другая проблема заключается в том, что вы возвращаете true или false внутри функции события, так что это не будет применяться к внешней функции verifyDialong.
Часть, основанная на нажатиях кнопок, должна быть пересмотрена. Возможно, поместите его в другую функцию и вызовите из обработчиков щелчков:
var afterConfirm = function(bool) {
if(bool) {
//continue clicked
} else {
//cancel clicked
}
//do for both cases here
}
//inside confirmDialog input#continue
$(this).click(function() {
$(conf_dialog).remove();
afterConfirm(true);
});
Возможно, вы захотите изучить возможность использования отложенных объектов.Вот две ссылки, которые их объясняют.
http://www.sitepen.com/blog/2009/03/31/queued-demystifying-deferreds/
http://api.dojotoolkit.org/jsdoc/1.3/dojo .Отложенный
Используя отложенный, вы могли бы воспользоваться своей вызывающей функцией:
function doSomething () {
// this functions does something before calling confirmDialog
if (confirmDialog) {
// handle ok
} else {
// handle cancel
}
// just to be difficult lets have more code here
}
и реорганизуйте его во что-то вроде этого:
function doSomethingRefactored() {
// this functions does something before calling confirmDialog
var handleCancel = function() { /* handle cancel */};
var handleOk = function() { /* handle ok */};
var doAfter = function() { /* just to be difficult lets have more code here */};
var d = new dojo.deferred();
d.addBoth(handleOk, handleCancel);
d.addCallback(doAfter);
confirmDialog(message, d);
return d;
}
- confirmDialog должен быть обновлен для вызова d.callback() или d.errback() вместо возврата true или false
- если функция, вызывающая doSomething, должна дождаться завершения работы doSomething, она может добавить свои собственные функции в цепочку обратного вызова
Надеюсь, это поможет...это будет иметь гораздо больше смысла после прочтения статьи sitepen.
Вы можете добавить тайм-аут до вызова следующей функции