2013-09-19 3 views
0

У меня есть форма, в первых трех полях ввода (fname, lname, addr) есть функция onkeyup, которая проверяет значение входных данных для базы данных. Если есть одно совпадение, функция предлагает всплывающее окно (подтверждение javascript), которое спрашивает, правильно ли записана запись в базе данных, если это будет препопуляцией полей.Несколько подтверждений javascript

Проблема в том, что большинство людей могут печатать быстрее, чем может проверить функция. Если функция находит совпадение с «smi», но пользователи набирают «кузнец» перед всплытием, то подтверждение будет отображаться 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); 
    } 
} 

ответ

1

Использовать «размытие» javascript или «onfocusout» jQuery вместо «onkeyup»

0

Добавить переменную вне startAjax, как «проверка», что вы будете устанавливать «истина», когда вы ждете ответа от базы данных - один раз вы получаете ответ, задаете его «false». Затем, в точке вашего кода, в котором вы звоните в базу данных, проверьте, не ожидаете ли вы ответа (если вы просто пропустите звонок вообще)

Это также помогает задержать первый вызовите бит, например, 100 миллисекунд, так что пользователь может ввести несколько символов перед этим - timeout javascript выполнит эту работу.