2009-05-08 11 views
2

Je travaille sur un script de validation de formulaire au travail et j'ai de la difficulté. Le formulaire est destiné à s'assurer que l'utilisateur remplit un nom, un e-mail réel, une catégorie (à partir de la liste déroulante) et une question:validation de formulaire javascript en ligne

Ceci nomme le formulaire et rassemble toutes les données depuis le formulaire :

<script> 

    function checkForm(form1) { 
name = document.getElementById("FieldData0").value; 
category = document.getElementById("FieldData3").value; 
question = document.getElementById("FieldData1").value; 
email = document.getElementById("FieldData2").value; 

Ceci vérifie que quelque chose se trouve dans le champ "nom". Il fonctionne bien et valide exactement comme il se doit, affichant le texte d'erreur:

if (name == "") { 
    hideAllErrors(); 
document.getElementById("nameError").style.display = "inline"; 
document.getElementById("FieldData0").select(); 
document.getElementById("FieldData0").focus(); 
    return false; 

Cela fonctionne également comme il se doit. Il vérifie si le champ email est vide et si elle est vide, affiche un texte d'erreur et sélectionne ce champ:

} else if (email == "") { 
hideAllErrors(); 
document.getElementById("emailError").style.display = "inline"; 
document.getElementById("FieldData2").select(); 
document.getElementById("FieldData2").focus(); 
    return false; 
    } 

Cela fonctionne aussi comme il se doit, fait en sorte que le champ des questions est pas vide:

else if (question == "") { 
hideAllErrors(); 
document.getElementById("questionError").style.display = "inline"; 
document.getElementById("FieldData1").select(); 
document.getElementById("FieldData1").focus(); 
    return false; 
    } 

celui-ci fonctionne en partie - Si aucune chute est sélectionnée vers le bas, il affiche le message d'erreur, mais cela ne l'empêche pas la forme de la soumission, il ne fait qu'afficher le texte d'erreur alors que la forme présente:

else if (category == "") { 
hideAllErrors(); 
document.getElementById("categoryError").style.display = "inline"; 
document.getElementById("FieldData3").select(); 
document.getElementById("FieldData3").focus(); 
    return false; 
    } 

Celui-ci ne fonctionne pas du tout, peu importe où je l'ai mis. J'ai utilisé une variante sur le même script la semaine dernière et ça a bien fonctionné. Ceci est censé vérifier que le message est entré ressemble à une véritable adresse e-mail:

else if (!check_email(document.getElementById("FieldData1").value)) { 
hideAllErrors(); 
document.getElementById("emailError2").style.display = "inline"; 
document.getElementById("FieldData2").select(); 
document.getElementById("FieldData2").focus(); 
    return false; 
    } 

Otherwise it lets the form submit: 


    return true; 
    } 

Ceci vérifie l'e-mail sur:

function check_email(e) { 
ok = "1234567890qwertyuiop[][email protected]_QWERTYUIOPASDFGHJKLZXCVBNM"; 

for(i=0; i < e.length ;i++){ 
if(ok.indexOf(e.charAt(i))<0){ 
return (false); 
} 
} 

if (document.images) { 
re = /(@.*@)|(\.\.)|(^\.)|(^@)|(@$)|(\.$)|(@\.)/; 
re_two = /^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$/; 
if (!e.match(re) && e.match(re_two)) { 
return (-1);   
} 

} 

} 

Cette fonction cache toutes les erreurs afin que l'utilisateur ne soit pas bombardée avec du texte rouge. J'ai essayé de mettre en "document.getElementById (" emailError ") none "" mais qui brise la chose style.display =.":

function hideAllErrors() { 
document.getElementById("nameError").style.display = "none" 
document.getElementById("emailError").style.display = "none" 
document.getElementById("categoryError").style.display = "none" 
document.getElementById("questionError").style.display = "none" 

    } 


</script> 

Et la forme ressemble à ceci:

<form onSubmit="return checkForm();" method="post" action="http://www.emailmeform.com/fid.php?formid=303341io4u" name="form1"> 

<p><div class=error id=nameError>Required: Please enter your name<br/></div><p><strong>Name:</strong> <span></span><br><input type="text" name="FieldData0" id="FieldData0" value="" size="22" tabindex="1" /> 
<label for="name"></label></p> 

<p><div class=error id=emailError>Required: Please enter your email address<br/></div> 
<div class=error id=nameError2>This doesn't look like a real email address, please check and reenter<br/></div> 
<strong><p>Email:</strong> <span>(will not be published)</span><br><input type="text" name="FieldData2" id="FieldData2" value="" size="22" tabindex="2" /> 
<label for="email"></label> 
</p> 

<div class=error id=categoryError>Please select a category from the drop-down menu<br></div> 
<p><strong>Category:</strong> <span></span><br> 
<p><select id="FieldData3" name="FieldData3"> 
<option value="">Please select a category</option> 
<option value="a">a</option> 
<option value="b">b</option> 
<option value="c">c</option> 
<option value="d">d</option> 
<option value="e">e</option> 
<option value="f">f</option> 
<option value="other">Other</option> 
</select><label for="category"></label> 

<p><div class=error id=questionError>Please type your question in the box below:<br></div><label for="question"><strong><p>Your Question:</strong> <span></span></label><br> 

<textarea name="FieldData1" id="FieldData1" cols="50" rows="10"></textarea></p> 

<p><input type="submit" class="btn" value="Submit Question" name="Submit"></p> 
</div> 
</form> 

Le problème est-il l'ordre que j'exécute les vérifications? Je n'arrive pas à comprendre cela. Toute aide serait appréciée.

Répondre

5

J'ai pris la liberté de réécrire votre javascript pour le rendre plus lisible et plus facile à déboguer. Comme l'a mentionné Marc Bernier, l'élément dropdown ne prend pas en charge la fonction select. Je l'ai donc entouré d'une instruction if pour éviter une exception. J'ai également simplifié votre fonction checkEmail, cela semblait plutôt compliqué. Je l'ai renommé isAnInvalidEmail afin de simplifier le code checkForm.

Vous avez également incorrectement nommé le 'emailError2' div dans votre code HTML, ce qui provoquerait une autre exception dans le javascript. Votre HTML est plutôt désordonné et, dans certains cas, invalide. Il y a des guillemets manquants sur certaines valeurs d'attribut et des balises de fin manquantes. Vous devriez envisager d'utiliser le W3C validator pour vous assurer que votre code HTML est propre et conforme aux normes.

J'ai hébergé votre code sur jsbin: http://jsbin.com/iyeco (modifiable via http://jsbin.com/iyeco/edit)

est ici le nettoyé Javascript:

function checkForm() { 
    hideAllErrors(); 
    var formIsValid = 
    showErrorAndFocusIf('FieldData0', isEmpty, 'nameError') 
    && showErrorAndFocusIf('FieldData2', isEmpty, 'emailError') 
    && showErrorAndFocusIf('FieldData2', isAnInvalidEmail, 'emailError2') 
    && showErrorAndFocusIf('FieldData3', isEmpty, 'categoryError') 
    && showErrorAndFocusIf('FieldData1', isEmpty, 'questionError'); 

    /* For debugging, lets prevent the form from submitting. */ 
    if (formIsValid) { 
    alert("Valid form!"); 
    return false; 
    } 

    return formIsValid; 
} 

function showErrorAndFocusIf(fieldId, predicate, errorId) { 
    var field = document.getElementById(fieldId); 
    if (predicate(field)) { 
    document.getElementById(errorId).style.display = 'inline'; 
    if (field.select) { 
     field.select(); 
    } 
    field.focus(); 
    return false; 
    } 

    return true; 
} 

function isEmpty(field) { 
    return field.value == ''; 
} 

function isAnInvalidEmail(field) { 
    var email = field.value; 

    var ok = "1234567890qwertyuiop[][email protected]_QWERTYUIOPASDFGHJKLZXCVBNM"; 

    for(i = 0; i < email.length; i++){ 
    if(ok.indexOf(email.charAt(i)) < 0) { 
     return true; 
    } 
    } 

    re = /(@.*@)|(\.\.)|(^\.)|(^@)|(@$)|(\.$)|(@\.)/; 
    re_two = /^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$/; 
    return re.test(email) || !re_two.test(email); 
} 



function hideAllErrors() { 
    document.getElementById("nameError").style.display = "none" 
    document.getElementById("emailError").style.display = "none" 
    document.getElementById("emailError2").style.display = "none" 
    document.getElementById("categoryError").style.display = "none" 
    document.getElementById("questionError").style.display = "none" 
} 

Et nettoyé HTML:

<form onSubmit="return checkForm();" method="post" action="http://www.emailmeform.com/fid.php?formid=303341io4u" name="form1"> 
    <div> 
    <div class="error" id="nameError"> 
     Required: Please enter your name 
    </div> 
    <label for="FieldData0"><strong>Name:</strong></label> 
    <input type="text" name="FieldData0" id="FieldData0" value="" size="22" tabindex="1" /> 
    </div> 

    <div> 
    <div class="error" id="emailError"> 
     Required: Please enter your email address 
    </div> 
    <div class="error" id="emailError2"> 
     This doesn't look like a real email address, please check and reenter 
    </div> 
    <label for="FieldData2"><strong>Email:</strong>(will not be published)</label> 
    <input type="text" name="FieldData2" id="FieldData2" value="" size="22" tabindex="2" /> 
    </div> 

    <div> 
    <div class="error" id="categoryError"> 
     Please select a category from the drop-down menu 
    </div> 
    <label for="FieldData3"><strong>Category:</strong></label> 
    <select id="FieldData3" name="FieldData3"> 
     <option value="">Please select a category</option> 
     <option value="a">a</option> 
     <option value="b">b</option> 
     <option value="c">c</option> 
     <option value="d">d</option> 
     <option value="e">e</option> 
     <option value="f">f</option> 
     <option value="other">Other</option> 
    </select> 
    </div> 

    <div> 
    <div class="error" id="questionError"> 
     Please type your question in the box below: 
    </div> 
    <label for="FieldData1"><strong>Your Question:</strong></label> 
    <textarea name="FieldData1" id="FieldData1" cols="50" rows="10"></textarea> 
    </div> 

    <input type="submit" class="btn" value="Submit Question" name="Submit"> 
</form> 
+0

Merci pour cette réponse si complète. Je vais prendre votre conseil à cœur. –

+0

Vous êtes les bienvenus. Codage heureux! – brianpeiris

0

Premier problème: déplacez le contenu de cette instruction if dans une fonction ... puis allez à partir de là. Vous avez environ 5 morceaux de code faisant essentiellement la même chose. Suivant: puisque vous n'autorisez qu'un seul message d'erreur à la fois, créez un div générique pour le maintenir et déplacez simplement la chose. Ainsi, vous n'avez pas besoin de garder la trace de certaines erreurs, en afficher d'autres, etc.

Suivant: ne renvoyez que true ou false à partir de votre fonction check_email ... return -1 et false, etc. est incorrect même si javascript est indulgent sur de telles choses. Après avoir nettoyé votre code, il sera beaucoup plus facile de déboguer.

0

Je recommanderais de se débarrasser de l'ensemble de la chaîne sinon else et vérifier individuellement chacun ceci.

var error = 0; 
if (value == '') { 
    error = 1; 
    // other stuff; 
} 

if (value2 == '') { 
    error = 1; 
    // do stuff; 
} 

... 

if (error) { 
    // show error 
} else { 
    // submit form 
} 
+0

pourquoi erreur = 1 | 0? jamais entendu parler de vrai | faux? – roryf

+0

Ce n'est pas beaucoup mieux que le code actuel, il y aurait encore beaucoup de duplication. – brianpeiris

+0

C'est ce que je pensais, il semble que 6 d'une demi-douzaine de l'autre. Merci pour l'aide cependant. –

0

Essayez de remplacer le == pour === qui ne tape pas coulé. Cela pourrait vous aider avec le problème de la liste déroulante.

Votre fonction renvoie false et elle peut également renvoyer -1.

Comme je ne sais pas quel type JavaScript casting fait avec !-1 vous devriez aussi faire ceci:

check_email(...)!==false; 

Au lieu de cela:

!check_email(...) 
1

En ce qui concerne l'erreur sur la liste déroulante, n'appelle pas cette ligne:

document.getElementById ("FieldData1"). select(); Je me souviens avoir eu exactement le même problème il y a quelques semaines.

+0

Vous avez raison, sauf que l'identifiant de la liste déroulante est "FieldData3". – brianpeiris

+0

Ouais, j'essayais de le traiter comme si c'était un champ de texte ordinaire. Mon erreur. –

Questions connexes