将相同事件的对象方法代码设为 DRY
Make object method code DRY for same events
所以我有这个代码块,其中对象中的方法只是重复每个方法的块。
我怎么能'parameterizing'这个方法只用了一次。
我已经尝试了很多方法来将这些方法重写为一个带有 'pattern' 参数的可重用块,但是根据我输入的内容会出现很多不同的错误
代码如下:
function applyRegexValidation(){
validator = {
email: /^(([^<>()\[\]\.,;:\s@"]+(\.[^<>()\[\]\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/,
postcode: /^(GIR 0AA)|((([A-PR-UWYZ][0-9][0-9]?)|(([A-PR-UWYZ][A-HK-Y][0-9][0-9]?)|(([A-PR-UWYZ]][0-9][A-HJKSTUW])|([A-PR-UWYZ][A-HK-Y][0-9][ABEHMNPRVWXY])))) ?[0-9][ABD-HJLNP-UW-Z]{2})$/i,
dob: /^(0[1-9]|1\d|2\d|3[01])\/(0[1-9]|1[0-2])\/(19|20)\d{2}$/,
companyReg: /^[OSCLIPRN]{2}[0-9]{6}|[0-9]{8}$/,
phone: /^[0-9]{11,18}$/,
text: /^[a-zA-Z ]*$/
};
var RegexCheck = {
email: function () {
var isEmpty, pattern, result, elem = this.value;
isEmpty = !elem;
pattern = validator.email;
result = pattern.test(elem);
if (result === false || isEmpty) {
$(this).closest('div').removeClass('has-success');
$(this).closest('div').addClass("has-feedback has-error");
$(this).attr("data-valid", "false");
}
else {
$(this).closest('div').removeClass('has-error');
$(this).closest('div').addClass("has-feedback has-success");
$(this).attr("data-valid", "true");
}
},
postcode: function () {
var isEmpty, pattern, result, elem = this.value;
isEmpty = !elem;
pattern = validator.postcode;
result = pattern.test(elem);
if (result === false || isEmpty) {
$(this).closest('div').removeClass('has-success');
$(this).closest('div').addClass("has-feedback has-error");
$(this).attr("data-valid", "false");
}
else {
$(this).closest('div').removeClass('has-error');
$(this).closest('div').addClass("has-feedback has-success");
$(this).attr("data-valid", "true");
}
},
dob: function () {
var isEmpty, pattern, result, elem = this.value;
isEmpty = !elem;
pattern = validator.dob;
result = pattern.test(elem);
if (result === false || isEmpty) {
$(this).closest('div').removeClass('has-success');
$(this).closest('div').addClass("has-feedback has-error");
$(this).attr("data-valid", "false");
}
else {
$(this).closest('div').removeClass('has-error');
$(this).closest('div').addClass("has-feedback has-success");
$(this).attr("data-valid", "true");
}
},
companyReg: function () {
var isEmpty, pattern, result, elem = this.value;
isEmpty = !elem;
pattern = validator.companyReg;
result = pattern.test(elem);
if (result === false || isEmpty) {
$(this).closest('div').removeClass('has-success');
$(this).closest('div').addClass("has-feedback has-error");
$(this).attr("data-valid", "false");
}
else {
$(this).closest('div').removeClass('has-error');
$(this).closest('div').addClass("has-feedback has-success");
$(this).attr("data-valid", "true");
}
},
phone: function () {
var isEmpty, pattern, result, elem = this.value;
isEmpty = !elem;
pattern = validator.phone;
result = pattern.test(elem);
if (result === false || isEmpty) {
$(this).closest('div').removeClass('has-success');
$(this).closest('div').addClass("has-feedback has-error");
$(this).attr("data-valid", "false");
}
else {
$(this).closest('div').removeClass('has-error');
$(this).closest('div').addClass("has-feedback has-success");
$(this).attr("data-valid", "true");
}
}
};
$('form [type=email]').on('input blur', RegexCheck.email);
$('form [type=tel]').on('input blur', RegexCheck.phone);
$('form [bf-datatype=dob]').on('input blur', RegexCheck.dob);
$('form [bf-datatype=companyReg]').on('input blur', RegexCheck.companyReg);
$('form [bf-datatype=postcode]').on('input blur', RegexCheck.postcode);
}
可能是这样的:
function applyRegexValidation() {
validator = {
email: /^(([^<>()\[\]\.,;:\s@"]+(\.[^<>()\[\]\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/,
postcode: /^(GIR 0AA)|((([A-PR-UWYZ][0-9][0-9]?)|(([A-PR-UWYZ][A-HK-Y][0-9][0-9]?)|(([A-PR-UWYZ]][0-9][A-HJKSTUW])|([A-PR-UWYZ][A-HK-Y][0-9][ABEHMNPRVWXY])))) ?[0-9][ABD-HJLNP-UW-Z]{2})$/i,
dob: /^(0[1-9]|1\d|2\d|3[01])\/(0[1-9]|1[0-2])\/(19|20)\d{2}$/,
companyReg: /^[OSCLIPRN]{2}[0-9]{6}|[0-9]{8}$/,
phone: /^[0-9]{11,18}$/,
text: /^[a-zA-Z ]*$/
};
function RegexCheck() {
var isEmpty, pattern, result, classesToRemove, classesToAdd, dataValid, elem = this.value;
isEmpty = !elem;
// "$(this).prop('type')" works for 'type=*', for the 'bf-datatype=*' find a way to get a key to search in 'validator'
pattern = validator[$(this).prop('type')];
result = pattern.test(elem);
dataValid = (result !== false && !isEmpty);
classesToRemove = dataValid ? 'has-error' : 'has-success';
classesToAdd = dataValid ? 'has-feedback has-success' : 'has-feedback has-error';
$(this).closest('div')
.removeClass(classesToRemove)
.addClass(classesToAdd)
.attr("data-valid", dataValid);
}
$('form').on('input blur', RegexCheck);
}
所以我有这个代码块,其中对象中的方法只是重复每个方法的块。
我怎么能'parameterizing'这个方法只用了一次。
我已经尝试了很多方法来将这些方法重写为一个带有 'pattern' 参数的可重用块,但是根据我输入的内容会出现很多不同的错误
代码如下:
function applyRegexValidation(){
validator = {
email: /^(([^<>()\[\]\.,;:\s@"]+(\.[^<>()\[\]\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/,
postcode: /^(GIR 0AA)|((([A-PR-UWYZ][0-9][0-9]?)|(([A-PR-UWYZ][A-HK-Y][0-9][0-9]?)|(([A-PR-UWYZ]][0-9][A-HJKSTUW])|([A-PR-UWYZ][A-HK-Y][0-9][ABEHMNPRVWXY])))) ?[0-9][ABD-HJLNP-UW-Z]{2})$/i,
dob: /^(0[1-9]|1\d|2\d|3[01])\/(0[1-9]|1[0-2])\/(19|20)\d{2}$/,
companyReg: /^[OSCLIPRN]{2}[0-9]{6}|[0-9]{8}$/,
phone: /^[0-9]{11,18}$/,
text: /^[a-zA-Z ]*$/
};
var RegexCheck = {
email: function () {
var isEmpty, pattern, result, elem = this.value;
isEmpty = !elem;
pattern = validator.email;
result = pattern.test(elem);
if (result === false || isEmpty) {
$(this).closest('div').removeClass('has-success');
$(this).closest('div').addClass("has-feedback has-error");
$(this).attr("data-valid", "false");
}
else {
$(this).closest('div').removeClass('has-error');
$(this).closest('div').addClass("has-feedback has-success");
$(this).attr("data-valid", "true");
}
},
postcode: function () {
var isEmpty, pattern, result, elem = this.value;
isEmpty = !elem;
pattern = validator.postcode;
result = pattern.test(elem);
if (result === false || isEmpty) {
$(this).closest('div').removeClass('has-success');
$(this).closest('div').addClass("has-feedback has-error");
$(this).attr("data-valid", "false");
}
else {
$(this).closest('div').removeClass('has-error');
$(this).closest('div').addClass("has-feedback has-success");
$(this).attr("data-valid", "true");
}
},
dob: function () {
var isEmpty, pattern, result, elem = this.value;
isEmpty = !elem;
pattern = validator.dob;
result = pattern.test(elem);
if (result === false || isEmpty) {
$(this).closest('div').removeClass('has-success');
$(this).closest('div').addClass("has-feedback has-error");
$(this).attr("data-valid", "false");
}
else {
$(this).closest('div').removeClass('has-error');
$(this).closest('div').addClass("has-feedback has-success");
$(this).attr("data-valid", "true");
}
},
companyReg: function () {
var isEmpty, pattern, result, elem = this.value;
isEmpty = !elem;
pattern = validator.companyReg;
result = pattern.test(elem);
if (result === false || isEmpty) {
$(this).closest('div').removeClass('has-success');
$(this).closest('div').addClass("has-feedback has-error");
$(this).attr("data-valid", "false");
}
else {
$(this).closest('div').removeClass('has-error');
$(this).closest('div').addClass("has-feedback has-success");
$(this).attr("data-valid", "true");
}
},
phone: function () {
var isEmpty, pattern, result, elem = this.value;
isEmpty = !elem;
pattern = validator.phone;
result = pattern.test(elem);
if (result === false || isEmpty) {
$(this).closest('div').removeClass('has-success');
$(this).closest('div').addClass("has-feedback has-error");
$(this).attr("data-valid", "false");
}
else {
$(this).closest('div').removeClass('has-error');
$(this).closest('div').addClass("has-feedback has-success");
$(this).attr("data-valid", "true");
}
}
};
$('form [type=email]').on('input blur', RegexCheck.email);
$('form [type=tel]').on('input blur', RegexCheck.phone);
$('form [bf-datatype=dob]').on('input blur', RegexCheck.dob);
$('form [bf-datatype=companyReg]').on('input blur', RegexCheck.companyReg);
$('form [bf-datatype=postcode]').on('input blur', RegexCheck.postcode);
}
可能是这样的:
function applyRegexValidation() {
validator = {
email: /^(([^<>()\[\]\.,;:\s@"]+(\.[^<>()\[\]\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/,
postcode: /^(GIR 0AA)|((([A-PR-UWYZ][0-9][0-9]?)|(([A-PR-UWYZ][A-HK-Y][0-9][0-9]?)|(([A-PR-UWYZ]][0-9][A-HJKSTUW])|([A-PR-UWYZ][A-HK-Y][0-9][ABEHMNPRVWXY])))) ?[0-9][ABD-HJLNP-UW-Z]{2})$/i,
dob: /^(0[1-9]|1\d|2\d|3[01])\/(0[1-9]|1[0-2])\/(19|20)\d{2}$/,
companyReg: /^[OSCLIPRN]{2}[0-9]{6}|[0-9]{8}$/,
phone: /^[0-9]{11,18}$/,
text: /^[a-zA-Z ]*$/
};
function RegexCheck() {
var isEmpty, pattern, result, classesToRemove, classesToAdd, dataValid, elem = this.value;
isEmpty = !elem;
// "$(this).prop('type')" works for 'type=*', for the 'bf-datatype=*' find a way to get a key to search in 'validator'
pattern = validator[$(this).prop('type')];
result = pattern.test(elem);
dataValid = (result !== false && !isEmpty);
classesToRemove = dataValid ? 'has-error' : 'has-success';
classesToAdd = dataValid ? 'has-feedback has-success' : 'has-feedback has-error';
$(this).closest('div')
.removeClass(classesToRemove)
.addClass(classesToAdd)
.attr("data-valid", dataValid);
}
$('form').on('input blur', RegexCheck);
}