2016-04-04 27 views
0

Ajax'ı öğreniyorum. Bir json dosyasında (users.json) varolan seçili kullanıcının olup olmadığını kontrol etmek için ajax kullanarak bir formu doğrulamam gerekir. Var checkPseudo'nun değerini almam lazım. Aslında bu var her zaman "tanımsız" dır.Form doğrulama: Eşzamansız dönüş değeri alma

Bu, asenkron geliştirme ile klasik bir sorun olduğunu düşünüyorum.

Not: Jquery kitaplığını kullanamıyorum.

İşte İlk argüman olarak pseudo geçmek unutuyorsunuz

<!-- This is my form --> 

<form method="post" id="frmInscription" action="adduser.php" onsubmit="return formValidation(this)"> 
    Pseudo :<input name="pseudo" type="text" /><br /> 
    <input type="submit" name="send" value="Submit" /> 
</form> 


<!-- javascript functions to validate the form --> 

function makeRequestCheckPseudo(callback){ 
    if(xhr = createXhr()){ // returns an xhr object 
     xhr.open("GET", "users.json", true); 
     xhr.onreadystatechange = function(){ 
      if(xhr.readyState == 4 && xhr.status == 200){ 
       //I use a callback function to get the ajax responseText in the function formValidation(frm) 
       callback.apply(xhr); 
       return callback(); //I'm not sure if I need to return the callback function 
      }     
     } 
     xhr.send(null); 
    }; 
} 

function formValidation(form){ 
    var pseudo = form.elements["name"].value;     
    var checkPseudo = makeRequestCheckPseudo(function(){ 
     var jsonPseudos = JSON.parse(this.responseText); // here I get the datas from users.json by ajax response 
     if(!jsonPseudos[pseudo]){ //if pseudo is present in the json object properties 
      alert("pseudo is not present in users.json !"); 
      return true; // I want to send my form 
     } else { 
      alert("pseudo is present users.json !"); 
      return false; // I don't want to send my form   
     } 
    }); 
    return checkPseudo; // should be "true" or "false" but I get "undefined" 
    //if checkPseudo is false the form will not be send 
    //if checkPseudo is true the form will be send 
} 
+0

Öğe değerlerini almak için hata yapıyorsunuz, bu 'var pseudo = form.elements ["pseudo"]. value; '; – itzmukeshy7

cevap

1

zaman uyumsuz programlarının nasıl çalıştığını olmasıdır çünkü.

function formValidation(form){ 
    var pseudo = form.elements["pseudo"].value;     
    if(xhr = createXhr()){ // returns an xhr object 
    xhr.open("GET", "users.json", true); 
    xhr.onreadystatechange = function(){ 
     if(xhr.readyState == 4 && xhr.status == 200){ 
     var jsonPseudos = JSON.parse(this.responseText); // here I get the datas from users.json by ajax response 
     if(!jsonPseudos[pseudo]){ //if pseudo is present in the json object properties 
      alert("pseudo is not present in users.json !"); 
      return true; // I want to send my form 
     } else { 
      alert("pseudo is present users.json !"); 
      return false; // I don't want to send my form   
     }    
    } 
    xhr.send(null); 
    } 
} 

bir deneyin);

Ne yapabilirsiniz doğrulama sonra elle formu en bu deneyin yöntemini

function makeRequestCheckPseudo(pseudo, callback) { 
    if (xhr = createXhr()) { // returns an xhr object 
    xhr.open("GET", "users.json", true); 
    xhr.onreadystatechange = function() { 
     if (xhr.readyState == 4 && xhr.status == 200) { 
     //I use a callback function to get the ajax responseText in the function formValidation(frm) 
     callback.apply(xhr); 
     callback(); //I'm not sure if I need to return the callback function 
     } 
    } 
    xhr.send(null); 
    }; 
} 

function formValidation(form) { 
    var pseudo = form.elements["name"].value; 
    var checkPseudo = makeRequestCheckPseudo(function() { 
    var jsonPseudos = JSON.parse(this.responseText); // here I get the datas from users.json by ajax response 
    if (!jsonPseudos[pseudo]) { //if pseudo is present in the json object properties 
     alert("pseudo is not present in users.json !"); 
     form.submit(); //if the validation is successfull then manually trigger the form submit 
    } else { 
     alert("pseudo is present users.json !"); 
    } 
    }); 
    return false; //prevent the default action 
} 
+0

Çözümünüz çalışıyor! Çok teşekkür ederim beyefendi ! Sana başka bir soru sorabilir miyim? Yalancı doğrulamadan sonra ikinci bir ajax doğrulama yapmam gerekirse ne olur? Örnek: ajax ile sözde kontrol ettikten sonra email.json e-posta olup olmadığını kontrol etmek istiyorum. Kodumdaki en iyi an nerede bu ikinci ajax doğrulama yapmak zorundayım? İlk ajax doğrulama? – zm455

+0

'form.submit(); 'ikinci ajax isteğiyle değiştirilmeli, sonra bu başarı işleyicisinin içinde' form.submit(); –

+0

Tamam Anlıyorum. Çok teşekkür ederim. O zaman yapmak istediğim gibi bir değer vermek mümkün değildir, çünkü ajax böyle çalışır. Efendim Şu anda sizin için oy veremiyorum çünkü yeterince itibarım yok ama geri döneceğime söz veriyorum çünkü günüme kızgınsın. Benim saygım var lütfen – zm455

0

benim kodudur. Sorunu çözebilirim.

function formValidation(form){ 
    var pseudo = form.elements["name"].value;     
    var checkPseudo = makeRequestCheckPseudo(pseudo, function(){ 
     // rest of the code 
    }) 
} 

Ve bu hat halinde

:

return callback();//I'm not sure if I need to return the callback function 

Sana geri arama() işlevi dönmek gerekiyor sanırım. Aksi takdirde dönüş değeri hattında checkPseudo ayarlı olmayacak:

var checkPseudo = makeRequestCheckPseudo(pseudo, function(){ 
    // rest of the code 
} 
+0

@Teklifiniz için teşekkür ederiz. Aslında, kodumu burada düzenlemem gerekiyor çünkü bu "yalancı" argümanları geçerek bazı testler deniyordum. Üretim kodumda bu "yalancı" argümanı kullanmıyorum ama çok teşekkür ederim! – zm455

0

göndermek çağrı başarılı olursa o zaman, formu önlemek varsayılan olarak olmaktır tek bir işlev ve bir alanı yanlış yoldan atlıyorsunuz: var pseudo = form.elements["name"].value;