2009-04-30 87 views
8

停止我得到了下面的代码:提交表单不jQuery的AJAX调用

$.ajax({ 
    type: "POST", 
    async: false,    
    url: "CheckIdExist", 
    data: param, 
    success: function(result) { 
     if (result == true){ 
      return false; 
     }         
    }, 
    error: function(error) { 
     alert(error); 
     return false; 
    } 
}); 

如果AJAX返回值为true,窗体需要停止提交。

但它并没有停止提交表单。

请任何帮助。

回答

1

在这种情况下,您需要执行同步http请求,即您必须将the async option设置为false。
在您的版本中,httpxmlrequest是异步的。在onsubmit处理程序返回并且在onsubmit处理程序的上下文之外调用onsuccess回调后,可能会很长时间完成。
“return false”将是匿名函数函数(result){...}的返回值,而不是onsubmit处理函数的返回值。

2

你需要做一个回调。

This entry in the FAQ当我有这个确切的问题时帮了我很多。

getUrlStatus('getStatus.php', function(status) { 
    alert(status); 
}); 

function getUrlStatus(url, callback) { 
    $.ajax({ 
     url: url, 
     complete: function(xhr) { 
      callback(xhr.status); 
     } 
    }); 
} 

原因是你不能在AJAX函数中返回。

由于异步编程的性质,上述代码无法按预期工作。提供的成功处理程序不会立即调用,而是在将来从服务器接收到响应时。所以当我们在$ .ajax调用后立即使用'status'变量时,它的值仍然是未定义的。

1

在一个函数或一个形式的onsubmit你不能把这个代码,成功函数返回它的结果返回给jQuery的AJAX的背景下,而不是形式提交环境。

+0

问题的一部分,但主要问题是ajax函数是异步的,因此不能返回值,因为代码执行不会等待此函数完成。 – Sylverdrag 2009-05-20 11:11:35

15

我假设你有这样的:在AJAX调用

form.submit(function(event) { 
    $.ajax(...); 
}); 

你想return false(或称event.preventDefault())在事件处理函数本身,而不是,如:

form.submit(function(event) { 
    $.ajax(...); 
    event.preventDefault(); 
}); 
+2

非常好 - 使用event.preventDefault()解决了我的问题,并在用户单击我的表单上的按钮时阻止页面刷新。感谢DarkWulf! – 2009-08-22 08:12:22

+0

do not for jquery 1.8.3 – 2012-11-28 07:01:06

1

我也有这个问题,但解决了它通过更改输入类型=“提交”键入=“按钮”,然后只是做你的ajax请求

$("input#submitbutton") 
    { 
          $.ajax(
         {       type: "POST", 
          async: false,    
          url: "CheckIdExist", 
          data: param, 
          success: function(result) { 
           if (result == true){ 
            //TODO: do you magic 
           }      
           else 
            $("form").submit();   
          }, 
          error: function(error) { 
           alert(error); 
           return false; 
          } 
         }); 
    }); 
7

这个问题的一个小小的变化是: 我想用jQuery和ajax向用户提供错误消息, ,但如果没有错误,然后进行正常处理。

如果没有错误,假设方法“check”返回空的响应,并且如果有任何错误,则返回错误。

然后,你可以做这样的事情在你准备功能:

$("#theform").submit(function() { 
    var data = { ... } 
    $.get('/check', data, 
     function(resp) { 
      if (resp.length > 0) { 
       $("#error").html(resp); 
      } else { 
       $("#theform").unbind('submit'); 
       $("#theform").submit(); 
      } 
    }); 
    event.preventDefault(); 
}); 

那么,它是如何工作的?当外部提交函数被触发时,它会构建AJAX调用所需的数据(这里是更高级别的函数get)。该调用已安排好,并且主要操作线程立即继续,但提交无条件停止,因此没有任何明显的情况发生。

过了一段时间,AJAX调用返回请求的结果。如果非空,结果会显示给用户。

但是,如果响应为空,则提交功能将被解除绑定。这可以防止系统通过外部提交功能进行额外的呼叫。内部提交函数被调用。这触发了一个实际的表单提交到表单的目标,生活如预期般继续。