我認爲你有多個挑戰。第一個問題是如何構建的javascript代碼,即如何構建命名空間,這樣你就不會打的名字衝突或有命名您的功能,如
form1validate
form1aftersubmit
form2validate
form2aftersubmit
一個成熟的模式在JavaScript的模塊是使用一個匿名函數來構建一個新的命名範圍。其基本思想是在下面的代碼
(function() {
var foo = 1;
})();
(function() {
if(foo == 1) alert("namespace separation failed!")
})();
SHON我覺得這是blog entry一個很好的介紹。
你面對的第二個問題是如何避免在JavaScript代碼中的所有重複。 對此有幾件武器。
- 函數 - 這個接縫顯而易見,但它經常被遺忘將通用代碼重構成可以完成的功能。在你的情況下,這將是函數將JSON響應中的值複製到表單中,並且像這樣高級函數 - 或函數作爲數據 - 或回調函數,因爲它們通常在javascript中調用。這些是javascript中最強大的武器。在表單和ajax處理的情況下,您可以使用回調來避免表單控制流中的重複。
讓我構建一個例子從我的頭(使用convinence 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)
}
很好的建議,謝謝! – 2011-04-05 13:41:56