jQuery、より具体的には javascript に関する私の知識は常に非常に限られており、より良くなるために懸命に取り組んでいます。
そのことを念頭に置いて、検証関数とそのエラーメッセージを含むオブジェクトを作成し、それを配列にプッシュしてから、それらすべてのメソッドを呼び出してからのメッセージを報告できるという点で、ある種の「拡張可能な検証フレームワーク」を作成しようとしています。失敗するもの。
最初に、基本的な検証が機能することを確認するために、非常に単純なことを行いました。これは次のとおりです。
var selectedTourDate = $("#tourDate").val();
var list = $("#bookedTourDate *");
var isDateBooked = list.filter(function () {
return (this.innerHTML == selectedTourDate) ;
}).length !== 0;
if (isDateBooked) {
alert("Date invalid");
return;
}
これはうまくいきます。
次に、「フレームワーク」を作成しました。これは次のとおりです。
function Validator(fn, errorMessage) {
this.validationFunction = fn;
this.errorMessage = errorMessage;
};
var validationRunner = {
validators: [],
errorMessages: [],
validationResult: true,
addValidation: function (validator) {
validationRunner.validators.push(validator);
},
validate: function () {
for (var validator = 0; validator < validationRunner.validators.length; validator++) {
if (validationRunner.validators[validator] instanceof Validator) {
var result = validationRunner.validators[validator].validationFunction();
validationResult = validationRunner.validationResult && result;
if (!result)
validationRunner.errorMessages.push(validationRunner.validators[validator].errorMessage);
}
}
},
getErrorMessage: function () {
var message = "<ul>";
for (var errorMessage = 0; errorMessage > validationRunner.errorMessages.length; errorMessage++) {
message += "<li>" + errorMessage + "</li>";
}
message += "</ul>";
return message;
}
}
次に、コードの最初のブロックを次のように変更します。
var selectedTourDate = $("#tourDate").val();
var list = $("#bookedTourDate *");
var tmp = new Validator(function () {
return list.filter(function () {
return (this.innerHTML == selectedTourDate);
}).length !== 0;
}, "Date already booked");
validationRunner.addValidation(tmp);
validationRunner.validate();
var msg = validationRunner.getErrorMessage();
これはまったく機能しません。
問題は、このステートメントの次の点にあるようです。
return (this.innerHTML == selectedTourDate);
「this」は、「filter」メソッドの関数の内部にあるはずなので、リストのhtml要素ではなくValidatorオブジェクトです。
ここでやろうとしていることを達成できるように、これを修正する方法はありますか?