如何在jQuery中进行回调?

时间:2013-05-15 17:07:46

标签: jquery jquery-callback

我有两个按钮“保存”和“关闭”。 我需要关闭按钮在重定向回主页之前询问用户是否要保存的问题。以下代码显示了我想要完成的任务。

$('#closeButton').click(function() {
  if(confirm("CloseWarning")) {
    $('#saveButton').click();
    window.location.href = "main.html";
  } else {
    window.location.href = "main.html";
  }
});

但问题是saveButton click事件没有足够的时间在整个页面重定向之前完成。所以我的问题是在这种情况下进行回调的最佳方法是什么,以便点击保存按钮,然后我们重定向到主页面。

3 个答案:

答案 0 :(得分:2)

假设您的保存按钮调用了javascript函数,您可以执行以下操作:

function saveFunction(doRedirect){
    //normal save code
    if(doRedirect)
        window.location.href = "main.html";
}

注意:如果您的“普通保存代码”是AJAX调用,则应在您的ajax请求的成功回调中添加doRedirect检查。

然后你就可以这样使用:

$('#closeButton').click(function() {
  if(confirm("CloseWarning")) {
    saveFunction(true);
  } else {
    window.location.href = "main.html";
  }
});

使用您自己的回调的替代方法:

function saveFuncton(callback){
   //normal save code

   //when done (or on AJAX success)
   if(callback)
      callback(true);//or false if not successful
}

然后......

$('#closeButton').click(function() {
  if(confirm("CloseWarning")) {
    saveFunction(function(success){
       if(success){
          window.location.href = "main.html";
       }
    });
  } else {
    window.location.href = "main.html";
  }
});

HACKY方法(除非你绝对没有其他替代方法,否则不要使用)

var isSaving = false;
$(document).ajaxStop(function () {
    if (isSaving) {
        window.location.href = "main.html";
    }
});

然后......

$('#closeButton').click(function() {
  if(confirm("CloseWarning")) {
    isSaving = true;
    $('#saveButton').click();
  } else {
    window.location.href = "main.html";
  }
});

这可能会起作用,但这实际上取决于你的保存功能如何工作,以及是否还有其他任何东西可能同时进行ajax调用。此外,如果您保存函数执行多个AJAX调用,则此方法可能会失败。这是一种hacky方法,使用它需要您自担风险!

答案 1 :(得分:1)

您可以在触发数据时将数据传递给事件,因此您可以执行以下操作:

$('#closeButton').click(function(e) {
    if(confirm('..')) {
         $('#saveButton').trigger('click', [true]);
    } else {
         window.location.href = "main.html";
    }
});

$('#saveButton').click(function(e, close) {
    // do saving stuff ..
    // for normal clicks "close" will be undefined, otherwise close when done
    if(close) {
        window.location.href = "main.html";
    }
});

如果你想要更多DRY,你可以让saveButton中的结束代码成为closeButton的类似触发器,其中force变量的类别会强制关闭,所以您不会在代码的两个不同部分重复重定向URL。

如果你不能修改你的保存逻辑(这似乎是一个有问题的东西,但没关系......)你可以这样做,假设保存逻辑包含一个AJAX调用而你没有任何其他的AJAX请求开除。如果您这样做,可以在关闭之前检查settings变量以确保其正确:

$('#closeButton').click(function(e) {
    if(confirm('..')) {
         $(document).ajaxComplete(function(e, xhr, settings) {
             window.location.href = "main.html";
         });
         $('#saveButton').click();
    } else {
         window.location.href = "main.html";
    }
});

答案 2 :(得分:0)

无论在saveButton上执行什么脚本,都可以在保存表单时在变量中设置响应。然后检查它的值。这是一个例子:

$('#closeButton').click(function() {
  if(confirm("CloseWarning")) {
    $('#saveButton').click(function(){
         // Code to save the form 
         if(saved == true){
              window.location.href = "main.html";
         }
    });
  } else {
    window.location.href = "main.html";
  }
});