以下confirmdialog函数在另一个jquery函数的中途调用。当这个confirmDialog返回true时,另一个函数应该继续...但它没有。原因似乎是整个confirmDialog函数在单击continue按钮时已经执行(返回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;
});
}
答案 0 :(得分:1)
我不确定你能不能。
AFAIK只有confirm
,alert
或prompt
这样的内置函数可以在请求答案时阻止。
一般的解决方法是重构代码以使用回调(或使用内置函数)。这意味着将调用函数分成两部分,并在获得输入时执行第二部分。
答案 1 :(得分:1)
在confirmDialog中,您正在设置事件处理程序,它将在触发事件时执行,而不是在运行confirmDialog时执行。另一个问题是,你在事件函数中返回true或false,因此不适用于外部函数confirmDialong。
需要重新考虑依赖按钮按下的部分。也许把它放在另一个函数中,并从点击处理程序调用它:
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);
});
答案 2 :(得分:1)
您可能希望研究使用Deferred对象。以下是两个解释它们的链接。
http://www.sitepen.com/blog/2009/03/31/queued-demystifying-deferreds/
http://api.dojotoolkit.org/jsdoc/1.3/dojo.Deferred
使用延期你可以使用你的调用函数:
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;
}
希望这会有所帮助......阅读sitepen文章后,它会更有意义。
答案 3 :(得分:0)
您可以在调用下一个函数之前添加超时
答案 4 :(得分:0)
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;
})
...
}