Webフォームは本当に複雑です。拡張可能なフォーム検証のための優れたソリューションは何ですか、できればjQueryで動作するものですか?
背景:
私たちのサイトには少しAjaxがありますが、本当の焦点は約20のマルチページフォームまたは「ウィザード」によるユーザーエクスペリエンスです。これらのフォームは複雑です。
5
を価格フィールドに入力すると、フィールドは5.00
。onSubmit
にバインドするよりも汎用性が高い必要があります。Ajaxを使用して、同じページから複数のフォームを順番に投稿することがあります。 (たとえば、ユーザーがサインアップして1回でウィジェットを作成できるようにしますが、レガシーシステムのために、そのフローには2つのPOSTリクエストが必要です。)現在、 jQuery Validation ライブラリを使用していますが、フォームはその機能を超えているようです。私は <angular /> 、 Knockout 、および Backbone.js のようなものを見てきましたが、それらがあまりにも心配ですヘビー級またはフロントエンドを書き換える必要があります。
(これはコミュニティwikiである必要があります。)
これは恥知らずなプラグですが、私が設計した framework をボランティアしてもいいですか?注釈(Hibernate Validatorに似ています)に基づいて構築しました。カスタム制約をサポートしており、非常に強力だと感じています。 ここ はStackoverflowの質問でもあり、フレームワークのレビューをお願いしました。
5
から5.00
)。以下に例を示します。
以下に、組み込みの制約を使用した標準検証を示します。
<input id = "myInput"
name = "myInput"
type = "text"
class = "regula-validation"
data-constraints = '@NotEmpty @IsNumeric @Between(min=1, max=5)' />
jQuery(document).ready(function() {
// must call regula.binnd() first. The best place would be in an
// onload handler. This function looks for elements with
// a class name of "regula-validation" and binds the
// appropriate constraints to the elements
regula.bind();
jQuery("#myForm").submit(function() {
// this function performs the actual validation
var validationResults = regula.validate();
for(var index in validationResults) {
var validationResult = validationResults[index];
alert(validationResult.message);
}
});
});
ご覧のとおり、制約違反のみを処理しているため、エラーメッセージを表示する方法は完全にユーザー次第です。
カスタム制約の例を次に示します。
regula.custom({
name: "MustBe42",
defaultMessage: "The answer must be equal to 42",
validator: function() {
return this.value == 42;
}
});
そしてその使用:
<input id = "theAnswerToLifeTheUniverseAndEverything"
name = "theAnswerToLifeTheUniverseAndEverything"
value = ""
class = "regula-validation"
data-constraints = "@MustBe42" />
バリデータはJavascript関数であるため、何でも実行できます(これにより、副作用に関する質問に対処します)。
パラメーターを受け入れる別の制約の例を次に示します。
regula.custom({
name: "DivisibleBy",
defaultMessage: "{label} must be divisible by {divisor}",
params: ["divisor"],
validator: function(params) {
var divisor = params["divisor"];
return (this.value % divisor) == 0;
}
});
そして使用法:
<input id = "number"
name = "number"
value = ""
class = "regula-validation"
data-constraints = "@DivisibleBy(divisor=3, label='The Number')" />
検証グループの使用例を次に示します。
<input id = "score"
name = "score"
type = "text"
class = "regula-validation"
data-constraints = '@IsNumeric(label="Score",
message="{label} needs to be a number!"
groups=[FirstGroup, SecondGroup, ThirdGroup]' />
<input id = "age"
name = "age"
type = "text"
class = "regula-validation"
data-constraints = '@IsNumeric(label="Age",
message="{label} needs to be a number!"
groups=[SecondGroup]' />
<input id = "name"
name = "name"
type = "text"
class = "regula-validation"
data-constraints = '@NotEmpty(label="Name",
message="{label} cannot be empty!"
groups=[FirstGroup]' />
そして、FirstGroup
のみを検証するスニペット(したがって、score
とname
のみが検証されます):
var constraintViolations = regula.validate({groups: [regula.Group.FirstGroup]});
var messages = "";
for(var index in constraintViolations) {
var constraintViolation = constraintViolations[index];
messages += constraintViolation.message + "\n";
}
if(messages != "") {
alert(messages);
}
試してみる予定がある場合は、バージョン1.1.1をダウンロードすることをお勧めします。現在のドキュメントは、そのバージョンに特に一致しています。 1.2.1では、複合制約のサポートを追加しましたが、それを反映するようにドキュメントを更新していません。
これですべての懸念に対処できない場合、またはこれがあなたが探しているものではない場合、私は理解しています。私はそれをそこに置くだけだと思った。また、あなたがそれをチェックアウトした場合、バージョンを反映するようにドキュメントを更新することを確認します1.2.1。私は学校と仕事で忙しかったので、それをする時間がありませんでした。
更新#1
Sohnee はクライアント側の検証に言及しています。私は実際にRegulaとSpring 3の統合に取り組んでいます。願わくば、近いうちに(また、仕事と学校に依存して)それをリリースできることを願っています。統合は、Hibernate検証制約をRegula検証制約に変換することにより機能します。この方法では、検証コードを1回(ほとんど)書くだけで済みます。ただし、カスタム制約の場合、Javascript側(カスタムバリデーター)でコードを記述する必要があります。ただし、Hibernateの検証制約を使用してサーバー側のコードに注釈を付けたら、クライアント側で何もする必要はありません。これらの制約は、クライアント側のフォーム要素に自動的に適用されます。
Matthew Abbott は、 RegulaをASP.NET MVCと統合する も可能になりました。
更新#2
Hibernate Validatorを使用したRegulaとSpring 3.0.x Web MVCの統合を示すデモwebapp(mavenized) github があります。それは実際に文書化されたものでも何でもありません。概念実証です。統合とその仕組みに関するドキュメントをgithubページに追加する予定です。
更新#3
wiki のドキュメントを更新し、最新バージョンに対応するようになりました1.2.2(私は作りました少しのバグ修正。これが1.2.2の理由です)。
私はこれを jQuery formValidator をさまざまな環境全体と組み合わせて数回使用しました。設定に1時間以上かかることはめったにないので、これが役立つことを願っています。
乾杯!
jQuery Validation プラグインは良い仕事をしていると思います。 metadata プラグインと組み合わせて、サーバー側の検証パラメーターをクライアントに渡します。また、検証に共通のパターンを使用できるようにすべてのフォームにいくつかのキーポイントをラップし、いくつかの例外/カスタム状態を使用しました。これには、カスタムアラートメッセージと表示が含まれます。
箱から出してすぐに望むすべてを行うわけではありませんが、これは私が見た中で最良のオプションであり、デフォルトの動作です。繰り返しますが、メタデータ(属性 "data-meta")を使用します。そして、それはあなたの意志に曲げることができます。また、クライアント側の入力要素へのコントロールバインディングにメタデータを使用しています。これにより、クライアント側のロジックがサーバー側から分割されますが、長い目で見ればサーバー側のロジックからjsを注入しようとする方が簡単です。
Parsley.js は、執筆時点(2013年8月)でニースで人気のある選択肢のようです。
チームの誰かがjQuery Toolsのバリデーターに気付いたので、自分でこれに答えます!
pattern
フィールドは、ユーザーが特定のパターンでのみテストを入力できるようにします。onFail
およびonSuccess
更新:はい、jQuery Toolsのバリデータツールチップでサイトのチャンクを再実装しました。素晴らしい!
サーバー側の検証は揺れ動きます。
必要に応じてAJAXリクエストを介してこのような検証の結果を提供するか、クライアント側の検証も追加するサーバー側フレームワークを使用します。ただし、2回記述しないでください。
function isEmpty(text) {
if(text == undefined) {
return true;
}
if(text.replace(/\s+/g, ' ').length == 0) {
return true;
}
return false;
}
function isValidBoolean(text) {
if(text == undefined || (text.toLowerCase() != "true" && text.toLowerCase() != "false")) {
return false;
}
return true;
}
function isValidDouble(text) {
var out = parseFloat(text);
if(isNaN(out)) {
return false;
}
return true;
}
function isValidLong(text) {
var out = parseInt(text);
if(isNaN(out)) {
return false;
}
return true;
}
function isValidDate(text) {
if(Date.parseString(text, 'MM/dd/yyyy HH:mm:ss') == null) {
return false;
}
return true;
}
function hasDuplicates(array) {
var valuesSoFar = {};
for (var i = 0; i < array.length; ++i) {
var value = array[i];
if (Object.prototype.hasOwnProperty.call(valuesSoFar, value)) {
return true;
}
valuesSoFar[value] = true;
}
return false;
}
JQuery Validationプラグインを使用してください。今まで失敗したことはない