多个javascript确认

多个javascript确认,javascript,php,html,ajax,confirm,Javascript,Php,Html,Ajax,Confirm,我有一个表单,在前3个输入字段(fname、lname、addr)上有一个onkeyup函数,它根据数据库检查输入值。如果只有一个匹配项,函数将提供一个弹出窗口(javascript确认),询问数据库中的记录是否正确,如果正确,将预填充字段 问题是,大多数人打字的速度比函数检查的速度快。如果函数发现与“smi”匹配,但用户在弹出窗口前键入“smith”,则确认将连续出现3次 对此我们能做些什么 我试过了,运气不好 function startAjax(){ if(document

我有一个表单,在前3个输入字段(fname、lname、addr)上有一个onkeyup函数,它根据数据库检查输入值。如果只有一个匹配项,函数将提供一个弹出窗口(javascript确认),询问数据库中的记录是否正确,如果正确,将预填充字段

问题是,大多数人打字的速度比函数检查的速度快。如果函数发现与“smi”匹配,但用户在弹出窗口前键入“smith”,则确认将连续出现3次

对此我们能做些什么

我试过了,运气不好

    function startAjax(){
    if(document.getElementById("flag").value == "yes"){
        if (window.XMLHttpRequest){ xmlhttpp=new XMLHttpRequest(); }else{ xmlhttpp=new ActiveXObject("Microsoft.XMLHTTP"); }
        xmlhttpp.onreadystatechange=function(){
            if(xmlhttpp.readyState==4 && xmlhttpp.status==200){
                    var status = xmlhttpp.responseXML.getElementsByTagName('status')[0].firstChild.nodeValue;
                    var fname = xmlhttpp.responseXML.getElementsByTagName('fname')[0].firstChild.nodeValue;
                    var addr = xmlhttpp.responseXML.getElementsByTagName('addr')[0].firstChild.nodeValue;
                    var lname = xmlhttpp.responseXML.getElementsByTagName('lname')[0].firstChild.nodeValue;
                    var city = xmlhttpp.responseXML.getElementsByTagName('city')[0].firstChild.nodeValue;
                    var state = xmlhttpp.responseXML.getElementsByTagName('street')[0].firstChild.nodeValue;
                    var zip = xmlhttpp.responseXML.getElementsByTagName('zip')[0].firstChild.nodeValue;
                    var email = xmlhttpp.responseXML.getElementsByTagName('email')[0].firstChild.nodeValue;

                    document.getElementById("ajax_status").innerHTML=status;
                    if(status == "Found user"){
                        document.getElementById('pop_display').style.display = "block";
                        var confirmMsg = "*User Found*\n\nName: "+fname+" "+lname+"\nAddress: "+addr+"\nCity: "+city+"\nState: "+state+"\nZip: "+zip+"\nEmail: "+email+"\n\nClick 'OK' To populate fields or click 'Cancel' if this is not the correct info.";
                        var fillOrNot = confirm(confirmMsg);
                        if(fillOrNot === true){                     
                            document.getElementById('fname').value = fname;
                            document.getElementById('lname').value = lname;
                            document.getElementById('address').value = addr;
                            document.getElementById('city').value = city;
                            document.getElementById('state').value = state;
                            document.getElementById('zip').value = zip;
                            document.getElementById('email').value = email.trim();
                            document.getElementById('flag').value="no";
                        }else{
                            document.getElementById('flag').value="yes2";
                            document.getElementById("ajax_status").innerHTML="Aborted";
                        }
                        document.getElementById('pop_display').style.display = "none";
                    }                   
            }
        }
        var param1 = document.getElementById('fname').value;
        var param2 = document.getElementById('lname').value;
        var param3 = document.getElementById('address').value;
        var url = "https://www.mywebsite.com/ajaxhandler.php?fname="+param1+"&lname="+param2+"&addr="+param3;
        xmlhttpp.open("GET",url,true);
        xmlhttpp.send(null);
    }
}

在startAjax之外添加一个变量,比如“checking”,当您等待来自数据库的响应时,您将该变量设置为“true”——一旦收到响应,将其设置为“false”。然后,在调用数据库的代码中,检查您是否已经在等待响应(如果是,只需跳过整个通话)


它还有助于将第一次调用延迟一点,比如100毫秒,这样用户就可以在调用之前输入几个字符——javascript将完成这项工作。

使用javascript的“blur”或jQuery的“onfocusout”而不是“onkeyup”