jQuery Validation Plugin,addMethod更改要验证的元素值

时间:2013-08-27 10:06:46

标签: jquery forms jquery-validate

我正在使用jQuery验证插件,我已经添加了自己的规则来检查我们的事件编号。多年来,用户有多种方式键入它们,我们尝试识别任何方式。

官方格式为0123S 230813

但已知用户输入123-S 230813或123-S-230813。

它们都是有效的,但我真正想要的是官方价值。

所以我用自己的规则使用addMethod方法创建,它将验证以上所有内容并且它有效,但我真正喜欢它在顶部做的是用官方格式更新表单元素,如果是的话用户输入的内容是否正确。这就是我正在努力的目标。

下面的addMethod代码。我希望改变元素值并返回它会完成这项工作,但它似乎也没有,并且从查找this.optional(元素)这不是它的目的。

我可以这样做,或者我会更好地在表单.submit()上进行格式化,然后只验证validate插件中的正则表达式吗?

// ois incident number validator
jQuery.validator.addMethod("oisIncidentNo", function(value, element) {

var oisInc = value;
var validInc = false;

// strip spaces and dashes
oisInc = oisInc.replace(/ /g, '');
oisInc = oisInc.replace(/-/g, '');

// loop over the ois no and insert padded 0s at the front to make
// up the full correct number
if (oisInc.length<11 ){
    for(i=oisInc.length; i<11; i++ )
    {
        oisInc='0'+oisInc;
    }
}

// upper case it and put a space between the serial no and the date
oisInc=oisInc.toUpperCase();
oisInc=oisInc.substr(0, 5) + ' ' + oisInc.substr(5);    

// test the regex
validInc=/[0-9][0-9][0-9][0-9][A-Z] [0-9][0-9][0-9][0-9][0-9][0-9]/.test(oisInc);

// if the incident no is valid write the properly formatted one back
if (validInc) element.val(oisInc);

return this.optional(element) || validInc;
}, jQuery.format("Please enter a valid OIS Incident No format 1234S 270813."));

1 个答案:

答案 0 :(得分:0)

引用OP:

  

“我可以这样做,或者我会更好地在表单.submit()上进行格式化,然后只验证validate插件中的正则表达式吗?”

你试过吗?发生了什么事?

我没有试过这个,但是我想象一个场景,在你以编程方式更改自定义规则/方法函数中元素的值之后,它将触发另一个验证测试并进入循环。虽然你可能能够围绕任何无限递归进行编程......我只是觉得不应该这样做。

我认为简单地从用户验证表单的数据会更安全。然后在submitHandler回调函数中,在将数据发送到服务器之前对数据进行重新分解。这更典型,IMO。当submitHandler回调函数触发时,表单已经通过验证,因此不会发生另一个验证测试。

$(document).ready(function() {

    $.validator.addMethod("oisIncidentNo", function(value, element) {
        // your custom validation
    }, "Please enter a valid OIS Incident No format 1234S 270813.");

    $('#myform').validate({
        // your rules, options, and/or callback functions,
        rules: {
            myField: {
                oisIncidentNo: true
            }
        },
        submitHandler: function(form) {
            // re-factor any data here
            // send data with an .ajax() or a form.submit()
        }
    });

});