关于Ajax xmlhttp的问题

我想实现的功能是这样的,利用ajax的异步请求在提交表单之前实现对一个输入框中数据的验证,期待实现的效果是点击提交按钮,如果输入数据符合要求,就提交表单。但是现在实现的效果是点击提交按钮,在校验输入数据符合要求后,还需要再点击一次才能提交表单。
代码如下:
jsp:
< form action="formaction.action" method="post" onsubmit="return formsubmit()">
< input type="submit" value="提交表单">< /form>
js:

 function formsubmit(){
    var xmlhttp;
    xmlhttp=ajaxfun();
    var datavalue=document.getElementById("data").value;
        var url="datacheckaction?data="+datavalue+"&time="+(new Date().getTime());
        xmlhttp.open("post",url,true);  
      xmlhttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");  
      xmlhttp.send(null);
      xmlhttp.onreadystatechange=function(){
            if(xmlhttp.readyState==4 && xmlhttp.status==200){   
                document.getElementById("spandata").innerHTML=xmlhttp.responseText;
            }
        }
    }
    if(document.getElementById("spandata").innerHTML==""){
    return true;
    }else{
    return false;
    }
}

这个xmlhttp.responseText测试了没问题,数据校验通过是个"",校验不通过是个"wrong"。。。
用span和alert测试了几次,也有一些想法但是很快就都否定了,不知道问题在哪里。。。
忘记补充一点,有一个想法是这样的。。spandata这个地方在jsp页面上的初始值有,是"此项不可为空",我觉得最有可能的问题是formsubmit()这个函数的最后几行,判断spandata是否为空是在得到异步请求结果之前,应该是这样。。。但是不知道怎么解决

这个就是异步传输需要考虑的,因为异步传输需要较多时间,结果返回之前,主程序还是运行的,即if(document.getElementById("spandata").innerHTML==""){
return true;
}else{
return false;
}
会继续运行,结果返回之后,这个程序已经先运行完了,所以会出现这样的结果
解决方法可以是,直接在里面对返回的结果在函数里面进行判断,然后直接跳转页面,例如window.location="地址",这种方式进行跳转

ajaxfun怎么实现的,服务器的逻辑是什么

而且xmlhttp.onreadystatechange这个是异步方法,

if(document.getElementById("spandata").innerHTML==""){
return true;
}else{
return false;

这些代码先执行,所以永远返回都是true

你对js异步执行,根本一点概念也没有。

这个就是异步传输需要考虑的,因为异步传输需要较多时间,结果返回之前,主程序还是运行的,即if(document.getElementById("spandata").innerHTML==""){
return true;
}else{
return false;
}
会继续运行,结果返回之后,这个程序已经先运行完了,所以会出现这样的结果
解决方法可以是,直接在里面对返回的结果在函数里面进行判断,然后直接跳转页面,例如window.location="地址",这种方式进行跳转

点击按钮之后先执行验证的方法,验证通过之后再执行提交方法啊