Knimet
2015-08-27 13:12
采纳率: 63.3%
浏览 1.7k

关于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是否为空是在得到异步请求结果之前,应该是这样。。。但是不知道怎么解决

  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

5条回答 默认 最新

  • 路痴的旅行 2015-08-27 14:55
    已采纳

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

    打赏 评论
  • threenewbee 2015-08-27 14:43

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

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

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

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

    打赏 评论
  • threenewbee 2015-08-27 14:43

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

    打赏 评论
  • 路痴的旅行 2015-08-27 14:55

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

    打赏 评论
  • yuke198907 2015-08-28 00:49

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

    打赏 评论

相关推荐 更多相似问题