最近のプロジェクトでは、フォーム検証で開始時間と終了時間の範囲を判断する必要がありました。終了時間は開始時間以上である必要があります。つまり、終了年は開始年より大きい必要があり、開始月と終了月が等しい場合は開始月と終了月を比較し、開始月と終了月も等しい場合は日付を比較します。次に、各検証について、次の関数を使用して比較できます。
関数比較(開始、終了、エラー){
var begin = parseInt(begin,10);
var end = parseInt(end,10);
var diff = 終了 - 開始;
if(diff < 0){
アラート(エラー);
}それ以外{
true を返します。
}
}
このように、検証中に結果が true を返す限り、合格したことになります。のように:
var year = 比較(2001,2003,'年');
var month = 比較(1,2,'月');
var day = Compare(12,13,'day');
alert(年 && 月 && 日); //結果は true------"true"
上記の開始月と終了月、開始日と終了日を変更します。のように:
var year = 比較(2001,2003,'年');
var month = Compare(3,2,'month');
var day = Compare(24,13,'day');
alert(年 && 月 && 日); /結果は false------"false"
実行結果には、「月」、「日」、「false」が順に表示されます。実際、開始月と終了月が間違っている場合は、月の検証の前提条件として年を検証する必要はありません。日の検証の前提条件に合格します。月が検証されます。慎重に分析した結果、上記の関数の 3 つのパラメーターをシングルトン モードで保存することにしました。
{
始まり:2001年、
終了:2003年、
エラー: 「終了年は開始年より大きくなければなりません」
}
ただし、関数のパラメーターを定義したくないのですが、関数は渡されたパラメーターに基づいて自動的に検証できますか?答えは「はい」です。関数の先頭で、まずパラメータの数を決定します。1 より大きい場合、再帰処理が含まれます。再帰的な処理はどのように行うのでしょうか?関数内で次のことを行いました。
var len = 引数.長さ;
if(レン > 1){
var args = Array.prototype.slice.call(arguments);
args.shift(); //最初のパラメータを削除し、残りのパラメータを再帰処理に使用します。
}
引数の場合、Array.shift() メソッドを直接呼び出すことはできません。引数には length 属性がありますが、結局は配列ではないので、Array.slice() メソッドを使用して配列に変換します。議論については、オンラインで詳細を学ぶことができるため、ここでは詳しく説明しません。 len が 1 より大きい場合にのみ処理されるのはなぜですか?パラメータが 1 の場合、次の検証ステップを実行する必要がないためです。再帰処理はいつ行われますか?よく考えてみると、初期値と終了値が等しい場合にのみ必要になるということを理解すると、検証関数を簡単に構築できます。
var diff = parseInt(arguments[0].end,10) - parseInt(arguments[0].begin,10);
if(diff <0 ){
アラート(引数[0].エラー);
false を返します。
}else if(diff == 0){
len > 1 を返しますか? argument.callee.apply(this,args) : true;
}それ以外{
true を返します。
}
上記のコードでは、arguments.callee が関数そのものです。apply の使用法については、Web で関連情報を見つけることができます。
この時点で検証機能は完了しましたが、次の点に注意する必要があります。
今のところはここまでです。 例を見てみましょう。場合によっては、エラー情報をアラートの形式で表示したくない場合は、処理関数をカスタマイズして最後のパラメーターとして渡すことができます。次に、関数の先頭で、次のような処理関数を取得します。
var func = 引数[len - 1];
if(関数の種類 == '関数'){
func(引数[0]);
}
したがって、最終的な処理関数は次のようになります。
関数比較(){
var len = 引数.長さ;
var func = 引数[len - 1];
if(レン > 1){
var args = Array.prototype.slice.call(arguments);
args.shift(); //最初のパラメータを削除し、残りのパラメータを再帰処理に使用します。
}
var diff = parseInt(arguments[0].end,10) - parseInt(arguments[0].begin,10);
if(diff <0 ){
(typeof func == '関数') func(arguments[0].error) :alert(arguments[0].error);
false を返します。
}else if(diff == 0){
len > 1 を返しますか? argument.callee.apply(this,args) : true;
}それ以外{
true を返します。
}
}
関数比較(){
var len = 引数.長さ;
if(レン > 1){
var args = Array.prototype.slice.call(arguments);
args.shift(); //最初のパラメータを削除し、残りのパラメータを再帰処理に使用します。
}
var diff = parseInt(arguments[0].end,10) - parseInt(arguments[0].begin,10);
if(diff <0 ){
アラート(引数[0].エラー);
false を返します。
}else if(diff == 0){
len > 1 を返しますか? argument.callee.apply(this,args) : true;
}それ以外{
true を返します。
}
}