あなたの課題はたくさんあると思います。最初の質問は、javascript コードをどのように構築するか、つまり、名前の衝突と戦ったり、関数に次のような名前を付けたりしないように名前空間を構築する方法です。
form1validate
form1aftersubmit
form2validate
form2aftersubmit
JavaScript のモジュールで実証済みのパターンの 1 つは、匿名関数を使用して新しい名前付けスコープを構築することです。基本的な考え方は、次のコードで示されています
(function() {
var foo = 1;
})();
(function() {
if(foo == 1) alert("namespace separation failed!")
})();
このブログエントリは良い紹介だと思います。
直面する 2 番目の質問は、JavaScript コードでの繰り返しをすべて回避する方法です。これに対していくつかの武器があります。
- 関数 - これは明らかな継ぎ目ですが、一般的なコードを実行可能な関数にリファクタリングすることを忘れがちです。あなたの場合、これはjson応答からフォームに値をコピーする関数などになります
- 高階関数 (またはデータとしての関数) またはコールバック (JavaScript で頻繁に呼び出されるため)。これらは JavaScript の最強の武器です。フォームと ajax の処理の場合、コールバックを使用して、フォームの制御フローでの繰り返しを避けることができます。
頭から例を作成しましょう(説得力のためにjqueryを使用)
// 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)
}