0

(请在阅读之前不要将其标记为重复谢谢^_^)我想实现一个用户注册表单。在用户点击“提交”之前,它会调用一个函数 check_username() 来检查用户名是否可用。如果函数返回 true,则表单将被提交,否则不会。表格是这样的:

<form action="register/sumbit" method="post" onsubmit="return check_username()">
...
</form>

为了实现 check_username 函数,我采用了如何从 AJAX 调用返回响应中提出的方法?,但它对我不起作用。也许我误解了。这是我的功能:

function check_username()
{
  return $.post(url, {data}); //post the input username to sever to see whether it exists. I omitted something for simplicity here
}
check_username().done(
        function(data){
            if(data=="true")//username doesn't exist 
                return true;
            else if(data=="false") 
                            return false;       
            }).fail(function(){});

基本上,我希望 check_username 返回一个布尔值,该值(真或假)将决定表单是否要提交。结果是即使我不点击“提交”,“check_username.done()”也会实现(因此它不应该触发 check_username)。无论用户名是否存在,表单总是被提交。我想要的是,如果用户名存在, check_username 将返回 false 以便不会提交表单。谁能告诉我如何解决这个问题?感谢您的关注!

4

2 回答 2

1

$.post 不返回布尔值,因此结果(一个 jqXHR 对象)将转换为布尔值并为真,因此每次都会提交表单。

更新:由于 submit() 方法即使在手动调用时也会触发 onsubmit 事件,因此您需要存储 $.post 中的成功结果并在 check_username() 中添加条件。

实现此目的的许多可能方法之一:

<form action="register/sumbit" method="post" onsubmit="return check_username()">
...
</form>

var isUsernameValid = false;

function check_username()
{
    if(isUsernameValid){
        return true;
    }else{
        $.post(url, data, successHandler); 
        return false; 
    }        
}

...

// in your $.post().done() handler...
if(data=="true"){ //username doesn't exist 
     isUsernameValid = true;
     $("form").submit();
}
于 2013-08-30T21:54:45.627 回答
0

它永远不会那样工作。您不会从异步操作中获得同步返回。

可以做的是让处理程序check_username()成功提交表单。

<form action="register/sumbit" method="post" onsubmit="return check_username(this);">
...
</form>

function check_username(frm)
{
   var myform = $(frm);
   if (myform.data('checked'))  // already checked username? go ahead and submit
     return true;

   // otherwise, start the username check then return false

   // initialize url, data, etc.

   $.post(url, data, 
     function(data) {
       if (data == "true")
       {
         myform.data('checked', true);
         myform.submit();
       }
     }
   );

   return false;
}  
于 2013-08-30T21:55:31.757 回答