如何验证接收日期的文本输入字段,从现在起4到8周之间?

时间:2018-05-14 09:09:46

标签: javascript jquery jquery-validate

我有几个输入字段。而且,我正在使用jQuery Validation Plugin验证这些字段,可以在这里找到:https://jqueryvalidation.org/

我可以验证输入文本字段和输入接收日期值的文本字段。但是,我需要确保收到的日期是从今天起的4到8周。怎么做?

HTML:

<form>
    Name: <input type="text" maxlength="50" class="nf-givenname"><br/> <br/> 
    date that does not work: 

    <input type="text" maxlength="45" class="nf-date-picker" name="Date">
    <br/> <br/> 

    <input type="submit" value="Submit" class="btn-save date"  commandtype="Save">
</form>

到目前为止, jQuery代码对我来说如下:

$(document).ready(function() {
    var $form = $("form");
    $form.validate({
        submitHandler: function() {
            //
        }
    });

    // Ensures the classNames associated with the form elements can be used for validation
    $.validator.addClassRules = function(className, rules) {
        if (className.constructor === String) {
            var obj = {};
            obj[className] = rules;
            className = obj;
        }

        $.each(className, function(n, r) {
            $("." + n).each(function(i, e) {
                var self = $(e);
                self.rules("add", r);
            });
        });
    };

    $.validator.addMethod(
        "dateRange",
        function(value, element, params) {
            console.log("value is" + value);
            try {
                console.log(
                    "Entered value is" +
                        value +
                        " params.from  is" +
                        params.from +
                        " param to is" +
                        params.to
                );
                if (value > params.from && value < params.to) {
                    return true;
                }
            } catch (e) {}
            return false;
        },
        "Please enter date within range (4 to 8 weeks)"
    );

    var formattedDate = new Date()
            .toJSON()
            .slice(0, 10)
            .split("-")
            .reverse()
            .join("-"),
        dateTokens = formattedDate.split("-"),
        dt = new Date(dateTokens[2], parseInt(dateTokens[1], 10) - 1, dateTokens[0]), // months are 0 based, so need to add 1
        inFourWeeks = new Date(dt.getTime() + 28 * 24 * 60 * 60 * 1000)
            .toJSON()
            .slice(0, 10)
            .split("-")
            .reverse()
            .join("-"),
        inEightWeeks = new Date(dt.getTime() + 56 * 24 * 60 * 60 * 1000)
            .toJSON()
            .slice(0, 10)
            .split("-")
            .reverse()
            .join("-");

    var fromDate = inFourWeeks;
    var toDate = inEightWeeks;

    $(".nf-date-picker").addClass("myDateFieldRangeValidate");

    $.validator.addClassRules({
                myDateFieldRangeValidate: {
            dateRange: {
                from: fromDate,
                to: toDate
            }
        },

        "nf-givenname": {
            required: true,
            messages: {
                required: "Please specify your given (first) name"
            }
        },

        "nf-date-picker": {
            required: true,
            messages: {
                required: "Please choose a date"
            }
        }
    });
});

我创造了一支笔来展示我目前正在努力的目标。该工作的开源链接如下:https://codepen.io/hellouniverse/pen/aGjoKw?editors=1012

1 个答案:

答案 0 :(得分:1)

问题是messages属性,addClassRules()方法似乎完全不支持该属性。我不知道这是否适合您,但我将规则对象保存到var rules并循环将其设置为name属性。这样您就可以以默认方式添加规则。这是你的选择吗?

编辑:我为默认的日期检查添加了自定义验证方法。它会验证输入的日期是否介于4到8周之间。日期格式设置为 dd / mm / yyyy 。这应该让你去...

&#13;
&#13;
var $form = $("form");
  
var rules = {
    "nf-givenname": {
		    required: true,
        messages: {
            required: "Please specify your given (first) name"
	      }
		},
		"nf-date-picker": {
			  required: true,
			  date: true
        //dateISO: true
		},
		"txt_dob": {
		    required: true
		}
};
  
$form.validate({
    submitHandler: function(form) {
        //
		}
});


// Date format is dd/mm/yyyy for the validation!
$.validator.methods.date = function(value, element) {
    var dates = {
        "today": new Date(),
        "four_weeks": new Date(new Date().getTime() + (1000 * 60 * 60 * 24 * 28)),
        "eight_weeks": new Date(new Date().getTime() + (1000 * 60 * 60 * 24 * 56))
    };
    
    
    for (var k in dates) {
        if (dates.hasOwnProperty(k)) {
            var dd = dates[k].getDate();
            var mm = dates[k].getMonth()+1;
            
            if (dd < 10) dd = '0' + dd;
            if (mm < 10) mm = '0' + mm;
           
            dates[k] = dd + '/' + mm + '/' + dates[k].getFullYear();
        }
    }

    var date_from = dates["four_weeks"].split("/");
    var date_to = dates["eight_weeks"].split("/");
    var val =  value.split("/");

    var from = new Date(
        date_from[2],
        parseInt(date_from[1])-1, date_from[0]
    );
    
    var to = new Date(
        date_to[2],
        parseInt(date_to[1])-1, date_to[0]
    );
    
    var check = new Date(
        val[2],
        parseInt(val[1])-1, val[0]
    );

    return this.optional(element) || (check > from && check < to);
}
  
//------ Only for this test to prevent snippet reload.
$form.on('submit', function(e){
    e.preventDefault();
});
//------ 
  
  
for (var k in rules) {
    if (rules.hasOwnProperty(k)) {
        $('.' + k).attr('name', k).rules('add', rules[k]);
    }
}
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.17.0/jquery.validate.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.17.0/additional-methods.min.js"></script>

<form>
	Name: 
  <input type="text" maxlength="50" class="nf-givenname">
  <br/> <br/> 
	date that does not work:
	<input type="text" maxlength="45" class="nf-date-picker hasDatepicker">
	<br/> <br/> 
	date that does  work: 
	<input type="text" class="txt_dob" name="loreumipsum" />
	
	<input type="submit" value="Submit" class="btn-save date"  commandtype="Save">
</form>
&#13;
&#13;
&#13;