1

最近、私は新しいプロジェクトに取り組んでおり、jQuery 検証プラグインを使用して JavaScript フォームの検証を行うことにしました。

残念ながら、テキストボックスに文字を入力するたびに成功イベントがトリガーされるという問題が発生しました。

私のhtmlフォームを見てください:-

<table id="tible">
   <tr>
      <td>
         <center>
            <label for="nom">Nom:<em class="red">*</em></label>
         </center>
      </td>
      <td >
         <input type="text" name="nom" id="nom"  placeholder="nom ici" required data-rule-required="true" style="width:200px;" data-msg-required="Veuillez entrer votre Nom" data-msg-success="cool"/>
      </td>
      <td>
      </td>
   </tr>
   <tr>
      <td>
         <center>
            <label for="prenom">Prénom:<em class="red">*</em></label>
         </center>
      </td>
      <td  >
         <input type="text"  placeholder="pr&eacute;nom ici" name="prenom" required data-rule-required="true" data-msg-required="Veuillez entrer votre prénom(un seul suffit)" id="prenom" style="width:200px;"/>
      </td>
      <td></td>
   </tr>
   <tr>
      <td>
         <center>
            <label for="email">Email:<em class="red">*</em></label>
         </center>
      </td>
      <td >
         <input type="email" name="email" id="email" required data-rule-required="true" data-rule-email="true" placeholder="Email ici" data-msg-required="Veuillez entrez votre adresse Email " data-msg-email="Veuillez entrez une adresse Email valide" style="width:200px;"/>
      </td>
      <td class="td2">
      </td>
   </tr>
   <tr>
      <td>
         <center>
            <label for="adresse">Adresse:<em class="red">*</em></label>
         </center>
      </td>
      <td >
         <input type="text" data-msg-required="Veuillez renseigner une adresse valide" data-rule-required="true" placeholder="Adresse ici" name="adresse" id="adresse" style="width:200px;"/>
      </td>
      <td class="td2"></td>
   </tr>
   <tr>
      <td >
         <center>
            <label for="tel1">T&eacute;l&eacute;phone 1:<em class="red">*</em></label>
         </center>
      </td>
      <td>
         <input type="text"  data-msg-required="Veuillez entrer un numéro de téléphone (mobile/fixe)"  data-rule-required="true" name="tel1" id="tel1" placeholder="Numéro principal ici" style="width:200px;"/>
      </td>
      <td class="td2"></td>
   </tr>
   <tr>
      <td >
         <center>
            <label for="tel2">T&eacute;l&eacute;phone 2:</label>
         </center>
      </td>
      <td>    
         <input type="text" name="tel2" id="tel2" placeholder="Numéro secondaire ici" style="width:200px;"/>     
      </td>
      <td class="td2"></td>
   </tr>
   <tr>
      <td>
         <center>
            <label for="pays">Pays:<em class="red">*</em></label>
         </center>
      </td>
      <td>
         <select name="pays" id="pays"  size="1" id="pays"  style="width:200px;" data-rule-required="true" data-msg-required="Veuillez selectionner votre pays">
            <option  value="" selected>choisissez votre pays</option>
            <option  value="pays1"><?php echo 'Cote D\'ivoire'; ?></option>
         </select>
      </td>
      <td class="td2"></td>
   </tr>
   <tr>
      <td>
         <center>
            <label for="ville">Ville:<em class="red">*</em></label>
         </center>
      </td>
      <td>
         <select name="ville" id="ville"  size="1" id="ville"  style="width:200px;"  data-rule-required="true" data-msg-required="Veuillez selectionner votre ville">
            <option  value="" selected>choisissez votre ville</option>
         </select>
      </td>
      <td class="td2"></td>
   </tr>
</table>
<div class="acceptance">
   <!--<a href="#" onClick="document.getElementById('inscription').submit()"  class="cusbtn" >Ok</a>--><input type="button" class="cusbtn" value="Ok" id="subinscrip"/>&nbsp;&nbsp;&nbsp;&nbsp;<input type="button" onClick="document.getElementById('inscription').reset()" class="cusbtn" value="Annuler" />
</div>
<center>
   <p><em>" les champs ci-dessus contenant ce symbole <span class="red">*</span> sont &agrave; remplir obligatoirement. "</em></p>
</center>
</fieldset>
</form>

検証を処理する jQuery スニペットは次のとおりです。

$("#inscription").validate({
    errorPlacement: function (error, element) {
        error.appendTo(element.parent().next());
    },
    highlight: function (element, errorClass) {
        $(element).removeClass(errorClass);
    },
    success: function (label) {

        label.html("&nbsp;").removeClass('error');
        label.addClass('success');

    }

});

$('#subinscrip').click(function () {
    if ($("#inscription").valid()) {
        $("#inscription").submit();
    }

});

たとえば、フィールド"nom"に文字を入力すると、有効なアイコンが自動的に表示され、文字を入力し続けると、最初の文字の後に入力された文字ごとに、有効なアイコンで新しいラベルが作成され、示されているように複数の行に表示されます次のスクリーンショットで、問題のスクリーンショット これを防ぐにはどうすればよいですか? ありがとう

4

1 に答える 1

1

success問題の原因はコールバックではなく、errorPlacementコールバック関数です。

errorPlacement: function (error, element) {
    error.appendTo(element.parent().next());
},

あなたはappendToそれが発火するたびにそれを伝えています。「追加」とは、すでにあるものに「追加」されることを意味します。 .insertAfter()必要なものに近いはずです...

errorPlacement: function (error, element) {
    error.insertAfter(element.parent().next());
},

highlightコールバック関数を逆に使用しています...

highlight: function (element, errorClass) {
    $(element).removeClass(errorClass);
},

コールバックは、highlight「エラー」を強調するものです。ただし、このコールバックはエラーが発生した場合にのみ発生するという事実にもかかわらず、コードは を削除しています。errorClass

また、通常、highlightコールバックを使用する場合は、コールバックを使用して、エラーが発生したり消えたりしたときにunhighlight物事が適切に切り替わるようにします。

highlight: function (element, errorClass) {
    $(element).addClass(errorClass);
},
unhighlight: function (element, errorClass) {
    $(element).removeClass(errorClass);
},

次に、2つのクラスを誤って切り替えようとしていますsuccess...

success: function (label) {
    label.html("&nbsp;").removeClass('error');
    label.addClass('success');
}

コールバックは、「有効な」フィールドsuccessにメッセージを表示するときに使用するものです。label通常、labelフィールドが有効な場合、メッセージは非表示になります。代わりに、これらのクラスはhighlightおよびunhighlightコールバック関数で切り替える必要がsuccessあり、「有効な」labelコンテンツを処理するためにのみ使用する必要があります。

highlight: function (element, errorClass, validClass) {
    $(element).addClass(errorClass).removeClass('success');
},
unhighlight: function (element, errorClass, validClass) {
    $(element).removeClass(errorClass).addClass('success');
},
success: function (label) {
    label.html("&nbsp;");
}

また、これら 2 つのコールバックは と呼ばれる 3 番目の引数も取りますvalidClass。これは通常、プラグインのデフォルトの「有効な」クラスである と呼ばれvalidます。あなたのものは と呼ばれているので、オプションでsuccess変更できます...successvalidClass

validClass: "success",
highlight: function (element, errorClass, validClass) {
    $(element).addClass(errorClass).removeClass(validClass);
},
unhighlight: function (element, errorClass, validClass) {
    $(element).removeClass(errorClass).addClass(validClass);
},

そして最後に、すべてを修正してもすべてのキーストロークで検証を無効にしたい場合は、このオプションを使用してください...

onkeyup: false

trueデフォルトの機能が壊れるため、そのオプションを決して設定しないでください。

ドキュメントを参照してください: http://jqueryvalidation.org/validate/

于 2013-11-07T23:04:33.983 に答える