9

LiveValidation 拡張機能を使用する Web フォームがあります。ユーザーが米国を選択した場合、都道府県フィールドが州の略語のリスト内にある必要があるという条件付きルールがあります。

私の問題は、ユーザーが米国を選択してから戻って回答を変更した場合、古いテキスト文字列を入力できるように検証ルールを削除する必要があることです。構文を 4 重にチェックしましたが、関数はエラー オブジェクトではなく liveValidation オブジェクトを返していますが、ルールは削除されていません。アドバイスをいただければ幸いです。

スクリプトは次のとおりです。

            if($('#edit-submitted-state-or-province').length){    
            var field12 = new LiveValidation('edit-submitted-state-or-province', { validMessage: " ", onlyOnBlur: true });
            field12.add( Validate.Presence,  { failureMessage: "Please enter your state or province." }  );
            }
            $('#edit-submitted-country').change(function() {
                var stateList = new Array("","AK"..."WY");
                if($("#edit-submitted-country").val() == "United States"){
                    field12.add( Validate.Inclusion, {within: stateList, failureMessage: "Please enter a valid 2-letter state abbreviation."});
                }
                else{
                    field12.remove( Validate.Inclusion, {within: stateList, failureMessage: "Please enter a valid 2-letter state abbreviation."});
                }
            });
4

1 に答える 1

4

おそらくこれに答えるには遅すぎるかもしれませんが、ここに行きます...

LiveValidation.remove のドキュメントには、「検証の追加に使用したものとまったく同じ引数を渡す必要がある」と記載されています。検証関数 (Validate.Inclusion) は同じですが、パラメーター オブジェクトは毎回異なります。「見た目」が同じであることは問題ではありません (つまり、追加したオブジェクトと削除したオブジェクトの間ですべてのプロパティの値を比較した場合の結果)、それは同じ object でなければならないことを意味します。これを確実にする唯一の方法は、パラメーター オブジェクトの宣言を、検証オブジェクトを操作するコールバックのに移動して、コールバックが呼び出されるたびに作成されるのではなく、一度だけ作成されるようにすることです。

コードは次のとおりです(ところで、IDの名前を変更しました)。また、検証チェックを一度しか追加できないことも確認しました。

$(function() {

var field12,
    added = false,
    stateList = ["", "AK", "CO", "WY"]; // etc
    params = {
        within: stateList,
        failureMessage: "Please enter a valid 2-letter state abbreviation."
    };    

if ($('#state').length) {    
  field12 = new LiveValidation('state', {
      validMessage: " ",
      onlyOnBlur: true
  });

  field12.add(Validate.Presence, {
      failureMessage: "Please enter your state or province."
  });

}

$('#country').change(function() {
  if ($("#country").val() == "United States") {
      if (!added) {
          field12.add(Validate.Inclusion, params);
          added = true;
      }
  }
  else {
      if (added) {
          field12.remove(Validate.Inclusion, params);
          added = false;
      }
  }
});

});
于 2011-06-08T23:44:03.840 に答える