1

我有一个功能:

function validateForm() {
    var result = ''
    $.get(
        '/auth_validate_username/', 
        { 'result': result }, 
        function(data) {
            if (data!=='') {
                // make function validateForm return false
            }
        }
    );
};

我想知道是否有办法在我的条件下做一些适用于get请求上方功能的事情。

我真正想做的是,如果我的 get 请求满足我的条件,则该函数validateForm()返回 false。

有没有办法做到这一点?

编辑:这是我尝试过的

js:

   var validateResult;    

   $('#but_id').click(function(event){

    validateForm().done(function(){       

     if(!validateResult)
         event.preventDefault();
   });
   })

  function validateForm() {
    var result = ''

   return $.get(
     '/auth_validate_username/', 
     { 'result': result }, 
     function(data) {
        if(data!==''){

      validateResult = false;
     }
     }
     );    
    };

html:

 <form  method="post" onsubmit="return validateForm();">

    <input id='username' type="text" name="username"/>

<button type="submit" id='but_id'>Submit</button>

     </form>
4

4 回答 4

2

我假设你正在尝试做这样的事情:

if (validateForm()) {
    doSomething();
}
else {
    displayError();
}

相反,只需这样做:

function validateForm(){
  //...
  $.get(
    '/auth_validate_username/', 
    { 'result': result }, 
    success: function(data) {
      doSomething();
    },
    error: function(data) {
      displayError();
    }
  );
}

您只需要确保您的服务器做出相应的响应。即,您的服务器不应200为对/auth_validate_username.

$.get只是 的简写$.ajax()。在文档中阅读有关回调的更多信息。


根据您的评论!

function doSomething(data, textStatus, jqXHR) {
  $('form').submit();
}
function displayError(jqXHR, textStatus, errorThrown){ ... }
function validateForm(event){
  $.ajax(
    url: '/auth_validate_username/',
    data: {"result": result},
    success: doSomething,
    error: displayError
  );
  return false; // prevent default form submit
}
$('form').submit(validateForm);

很高兴知道这是您从一开始的目标。

于 2012-12-21T10:09:55.570 回答
0

尝试在函数调用中使用 done。

在 html 中

<input type ="button" id="yourButtonId" value="submit" />

在 JavaScript 中

var validateResult;    

$('#yourButtonId').click(function(event){

   validateForm().done(function(){       
         //your code      
         if(!validateResult)
             event.preventDefault();
    });
})

function validateForm() {
  var result = ''

  return $.get(
    '/auth_validate_username/', 
    { 'result': result }, 
    function(data) {
        if(data!==''){
    // make function validateForm return false
          validateResult = false;
    }
    }
  );    
};
于 2012-12-21T10:03:59.440 回答
0

ajax 将在函数完成后完成。所以没有办法做你正在寻找的东西。重新安排您的设计或从 get 中的成功功能提交表单。

这是我在解决方法中的疯狂方法

var validating = false;
var safeSubmit = false;
function validateForm()
{
 validating = true;
 $("#formElementId").ajaxStop(function () {
  if( !validating ) return;
  if( safeSubmit ) $(this).submit();
  validating = false;
  $(this).unbind("ajaxStop");
 });
 var result = ''
 $.get(
    '/auth_validate_username/', 
    { 'result': result }, 
    function(data) {
        if (data!=='') {
            // make function validateForm return false
        }else{
          safeSubmit = true;
          //this could also simply be
          //$("#formElementId").submit();
        }
    }
 );
 return false;
}
于 2012-12-21T10:07:38.933 回答
0

启动 ajax 调用时,使用同步调用可以实现你想要的 'async: false'。在 Chrome 控制台中尝试过并且可以正常工作。

function validateForm() {
  var result = ''
  var retval=true;

  $.ajax(
    '/auth_validate_username/', 
    {
      async: false,
      data: { 'result': result }
    }
  ).done(function ( data ){
    if(data !== ''){
      retval = false;
    }
  });
  return retval;
};
于 2012-12-21T10:10:15.103 回答