HTML5の 'pattern'属性と対応するJSを使用して、いくつかのフォーム検証をテストしています。完全な開示、それは何か違いがあれば私はIE 11を使用して固執しています。新しい要素を追加しない.each()ループ内のJavaScript配列
これまでのところ、スクリプトをループしてHTML入力からパターンを取得し、.test()メソッドのRegExpに変換することができました。検証部分が機能しているようです。
私は例えば、配列にフォームの入力を保存したいと思います:FORMDATA [fieldData、fieldData、fieldData]
...と別の配列、例えばに彼らの検証状態を記憶:validationStates [真、.every()validationStateたらSUBMITボタンを有効に続い
]真、偽...とは(まだいないコードで)真です。
私の問題は、私の配列は1要素だけです - 新しい値は.push()されていません。コンソールは、ループの各パスで上書きされているかのように、各配列が.length 1であることを一貫して報告しています(見ているように、非破壊的な.splice()も試みました)。私は間違って何をしていますか?
$("input").change(function() {
console.clear();
$("[required]").each(function(index) { // find all required form fields
var fieldData, regex; // init variables
var formData = []; // init array for form input data
var validationStates = []; // init array for validation states
fieldData = $(this).val(); // get form values and store
regex = new RegExp($(this).attr("pattern")); // pull regex from pattern(s)
formData.splice(index, 0, fieldData); // store the field inputs in an array
validationStates.push((regex.test(fieldData)));
console.log(formData);
console.log(index);
console.log(validationStates);
});
});
.form-control, .btn {
margin-top: 10px;
}
input:invalid, textarea:invalid {
border: 1px dotted #F33 !important;
color: #E33 !important;
}
input:valid, textarea:valid {
border: 1px dotted #2C8 !important;
color: #2C8;
}
<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form id="validated_form">
<div class="container">
<div class="row">
<div class="col-xs-6">
<input class="form-control" id="name" pattern="^[^\s][a-zA-Z\s-.]*$" placeholder="name" required="" title="only letters and '-'" type="text" />
</div>
<div class="col-xs-6">
<input class="form-control" id="time" pattern="^([0-1]?[0-9]|2[0-3]):[0-5][0-9]" placeholder="time (HH:mm)" required="" title="24H time in HH:mm or H:mm format" type="text" />
</div>
</div>
<div class="row">
<div class="col-xs-12">
<input class="form-control" id="pattern" pattern="^[^<>\s].{5,}$" placeholder="HTML5 pattern matching test (a-z only, more than 5 characters)" required="" title="must be more than 5 characters" type="text" />
</div>
</div>
<div class="row">
<div class="col-xs-offset-4 col-xs-4">
<button class="btn btn-md btn-block btn-info disabled" disabled="true" id="sub" type="submit" value="SUBMIT">Submit Form</button>
</div>
</div>
</div>
</form>
実際には.changeメソッドの上にある必要があります。そうしないと、入力が変更されるたびに上書きされます。 –
excatly彼が何を望んでいる編集:いいえあなたは正しい...フルコードを読んでいない...編集の回答 –
ありがとう!私は両方の配列宣言を$( "input")の上に移動しました。change()そしてそれはそれを処理しました - 今はボタンを有効にする部分で作業する必要があります。 – JRiggles