Javascript 两次点击后Ajax响应是否有效?

Javascript 两次点击后Ajax响应是否有效?,javascript,ajax,servlets,xmlhttprequest,Javascript,Ajax,Servlets,Xmlhttprequest,我刚刚编写了一个基本的用户登录系统,其中html页面使用javascript将ajax请求发送给servlet,servlet通过数据库进行访问。 这是js代码 var res; function getXMLObject() { var xmlHttp = false; try { xmlHttp = new ActiveXObject("Msxml2.XMLHTTP") // For Old Microsoft Browsers } catch (e) {

我刚刚编写了一个基本的用户登录系统,其中html页面使用javascript将ajax请求发送给servlet,servlet通过数据库进行访问。 这是js代码

var res;
function getXMLObject()
{
   var xmlHttp = false;
   try {
     xmlHttp = new ActiveXObject("Msxml2.XMLHTTP")  // For Old Microsoft Browsers
   }
   catch (e) {
     try {
       xmlHttp = new ActiveXObject("Microsoft.XMLHTTP")  // For Microsoft IE 6.0+
     }
     catch (e2) {
       xmlHttp = false   // No Browser accepts the XMLHTTP Object then false
     }
   }
   if (!xmlHttp && typeof XMLHttpRequest != 'undefined') {
     xmlHttp = new XMLHttpRequest();        //For Mozilla, Opera Browsers
   }
   return xmlHttp;  // Mandatory Statement returning the ajax object created
}

var xmlhttp = new getXMLObject();   //xmlhttp holds the ajax object


function handleServerResponse() {
   if (xmlhttp.readyState == 4) {        
               res=xmlhttp.responseText;
   }
     else {
                    return false;
        alert("Error during AJAX call. Please try again");
     }

}

function ajaxFunction() {
        var veid=document.getElementById("eid").value;
        var vpwd=document.getElementById("pwd").value;
        //window.alert('here inside ajaxFunction'+vconf+' '+vseid);
  if(xmlhttp) {
    xmlhttp.open("GET","check_login?eid="+ veid +"&pwd="+ vpwd,true); //this is the servlet name
    xmlhttp.onreadystatechange  = handleServerResponse;
    xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    xmlhttp.send(null);
  }
}


    function def()
    {
        //window.alert('hi');
        ajaxFunction();            
        //alert('res:'+res);
        if(res=='y')
       {               
                    return true;
       }
       else
       {
                    document.getElementById("uhidden").style.color="#CC0000";
                    document.getElementById("uhidden").innerHTML="Invalid E-Mail ID or Password"
                    return false;                        
       }
    }
但代码只有在点击两次后才能工作:( 有人帮忙吗?

我想你打电话给def()

您的请求是异步的(因为您将open()的第三个参数设置为true),但在def()中,您在发送请求后立即处理结果:

ajaxFunction();            
//alert('res:'+res);
if(res=='y')
此时请求通常尚未完成,结果还不可用


将所有必须与服务器响应一起工作的代码放入handleServerResponse()中您的
def
函数调用
ajaxFunction
,然后立即检查
res
变量。但是
ajaxFunction
只发送AJAX请求;它不等待AJAX响应到达。在从AJAX响应设置变量之前,您的代码正在检查
res
变量

这就是为什么它在第二次单击时工作-不是因为第二次单击的AJAX响应设置了
res
变量,而是因为它仍然是从第一次单击的AJAX响应设置的


解决方案是重新安排代码。将代码移动到接收AJAX响应的位置,以显示无效的登录消息。换句话说,用一些代码替换
res=xmlhttp.responseText;
行,以检查
xmlhttp.responseText
是否为
y
,并显示无效的登录消息。

my firstess是指您的服务器端脚本正在将cookie设置为登录,但…页面没有重新加载ajax调用,因此cookie直到下次才真正生效。您是否尝试调试代码(firebug?)?在第一次调用期间,xmlhttp对象似乎为空。方法调用是如何完成的?(按钮单击\页面提交)确认了帮助,但是在重用方法Ajax函数(URL)时考虑不同的场景使用同一组变量(包括全局变量res;)时,如果全局变量不影响双击问题,是否可以从同一个函数调用多个ajax调用。换句话说,是否可以重用上面指定的方法而不重新排列代码?