如何延迟函数返回直到发生单击后

时间:2009-06-23 16:38:09

标签: javascript jquery return-value

以下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;
    }); 
}

5 个答案:

答案 0 :(得分:1)

我不确定你能不能。 AFAIK只有confirmalertprompt这样的内置函数可以在请求答案时阻止。

一般的解决方法是重构代码以使用回调(或使用内置函数)。这意味着将调用函数分成两部分,并在获得输入时执行第二部分。

答案 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;
}
  • ConfirmDialog必须是 更新为调用d.callback()或 d.errback()而不是返回true 或者假的
  • 如果调用的函数 doSomething需要等待 doSomething来完成它可以添加它 自己的回调链函数

希望这会有所帮助......阅读sitepen文章后,它会更有意义。

答案 3 :(得分:0)

您可以在调用下一个函数之前添加超时

http://www.w3schools.com/htmldom/met_win_settimeout.asp

答案 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;
  })
  ...
}