私はあなたのために複数の挑戦があると思います。最初の質問あなたが名前の衝突を戦うか、JavaScriptでのモジュールのための実証済みのパターンの
form1validate
form1aftersubmit
form2validate
form2aftersubmit
一つのようなあなたの関数に名前を付ける必要がないように名前空間を構築する方法、すなわち、javascriptのコードを構造化する方法であるが、使用することです新しい命名スコープを構築するための無名関数。基本的な考え方は、私はこのblog entryが良い入門と思い、次のコード
(function() {
var foo = 1;
})();
(function() {
if(foo == 1) alert("namespace separation failed!")
})();
でSHONです。
あなたが直面する2番目の質問は、JavaScriptコードのすべての繰り返しを回避する方法です。 あなたはこれに対していくつかの武器を持っています。
- 機能 - この継ぎ目ははっきりしていますが、一般的なコードを機能をリファクタリングすることを忘れることがよくあります。あなたの場合、これはjsonレスポンスの値をフォームにコピーする関数になります。
- 高次関数またはデータとして機能します。コールバックはJavaScriptでよく呼ばれます。これらはJavaScriptの中で最も強力な武器です。フォームとAjaxの処理の場合は、コールバックを使用してフォームの制御フローの繰り返しを避けることができます。
私は私の頭のうちの一例を構築してみましょうあなたはおそらくknockout.jsあなたは自分のモデルを更新することができますこの方法のようなフレームワークになりますと、フォームが更新されます
// this is a validator for one form
var form1validator = function() {
if($("input[name=name]",this).attr("value").length < 1 &&
$("input[name=organisation]",this).attr("value").length < 1)
return "Either name or organisation required"
}
// and this for a second form
var form2validator = function() {
if($("input[name=age]",this).attr("value").length < 21
return "Age of 21 required"
}
// and a function to display a validation result
var displayResult = function(r) {
$(this).prepend("<span></span>").text(r);
}
// we use them as higher order functions like that
$("#form1").onSubmit(validator(form1validator, displayResult, function() {
//on submit
...send some xhr request or like that
});
$("#form2").onSubmit(validator(form2validator, displayResult, function() {
this.submit() // simply submit form
});
$("#form1b").onSubmit(validator(form1validator, function(r) {
alert("There was an validation error " + r);
}, function() {
//on submit
...send some xhr request or like that
});
// the validator function itself would be defined as
function validator(formValidator, displayResult, onSubmit) {
var r = formValidator.apply(this)
if(typeof(r) === 'undefined')
onSubmit(this)
else
displayResult(r)
}
おかげさまで、ありがとう! –