jQuery验证插件添加多个.rules()函数

时间:2013-07-03 20:57:41

标签: jquery jquery-validate

就像我在标题上所述, 我想在我的脚本中添加多个函数.rules()。 当我尝试这个时:

$("#braintree-payment-form").validate({});



    $("#month").rules('add', {
        required: true,
        regex: "(0[123456789]|10|11|12)",
        messages : {
            required: "Expiration date is required.",
            regex: "Invalid expiration date."
        }
    });
    $("#year").rules('add', {
        required: true,
        regex: "([0-9][0-9])",
        messages : {
            required: "Expiration date is required.",
            regex: "Invalid expiration date."
        }
    });


    $("#cardNum").rules('add', {
        required: true,
        regex: "(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11})",
        messages : {
            required: "Credit card number is required.",
            regex: "Invalid credit card number"
        }
    });

仅应用了最后一个.rules(),并且它也应用于第一个输入元素而不是相应的id。

提前致谢:)

以下是我目前使用的表单:

<form action="#" method="POST" id="braintree-payment-form">
    <p>
      <label>Card Number</label>
      <input type="text" size="20" autocomplete="off" name='number' id='number' data-encrypted-name="number"/>
    </p>
    <p>
      <label>CVV</label>
      <input type="text" size="4" autocomplete="off" name='cvv' data-encrypted-name="cvv" id='cvv'/>
    </p>
    <p>
      <label>Expiration (MM/YYYY)</label>
      <input type="text" size="2" data-encrypted-name="month" id="month" name = 'month' /> / <input type="text" size="4" data-encrypted-name="year" id="year" name='year' />
    </p>
    <input type="submit" id="submit" name='braintree'/>
  </form>

4 个答案:

答案 0 :(得分:2)

只是一个猜测,因为我无法从您发布的有限代码中重现您的问题,但我会说您忘记在每个输入元素上包含name属性。 jQuery Validate插件在每个输入上都需要唯一的name

See the "Markup recommendations" section on the General Guidelines page

  

“输入元素的name属性是'必需的',   没有它,验证插件不起作用。通常nameid   属性应具有相同的值。“

<form id="braintree-payment-form">  
     <input type="text" name="month" id="month" data-encrypted-name="month" />
     <input type="text" name="year" id="year" data-encrypted-name="year" />
     <input type="text" name="cardNum" id="cardNum" data-encrypted-name="cardNum" />
     <input type="submit" />
</form> 

否则,您的代码工作正常:http://jsfiddle.net/hc2Bj/2/

OP发布HTML后编辑:

我还注意到您在jQuery中定位#cardNum,但我在发布的HTML中没有看到id="cardNum"

答案 1 :(得分:0)

我已经成功地使用了带有braintree.js的jQuery验证器插件。 我要做的第一件事是将braintree.js下载到我的本地而不是托管版本。然后我编辑了文件:

element.removeAttribute("name");
找到了

。我只是简单地评论出来了:

/*element.removeAttribute("name");*/

它位于文件的最后一行。

我还在验证脚本

之前放置了braintree的初始化
var braintree = Braintree.create("<%=SESSION("ENCRYPTIONKEY")%>");
braintree.onSubmitEncryptForm('donation-form', null);

如您所见,我正在为加密密钥集成一些服务器端代码, 在表单完成后我不会调用任何函数。

我使用常规提交按钮,同时触发验证器和braintree.js。 Braintree创建与字段同名的新隐藏输入。 jQuery验证器正常验证,因为它只查看输入名称的第一个实例。然后在jQuery验证器的submitHandler方法中,我删除了name属性,但创建了一个名为“xname”的新“name”属性。这是因为如果braintree在结尾处返回错误,我们必须允许用户重新提交表单。我将了解接下来的工作方式。

submitHandler: function(form) {
// braintree has duplicated our fields as hidden encrypted.
// now change the name attribute from each field so it won't be submitted

$("input[data-encrypted-name]").each(function(){
$this = $(this);
var thisname = $this.attr("name");
$this.attr("xname",thisname);
$this.removeAttr("name");
}).promise().done(function(){ 
ajaxpost();             });                     

} //结束submitHandler

ajaxpost调用是$ .ajax函数,它发布到PHP文件。这是一个技巧部分,因为我得到Braintree的响应并使用“结果”键创建我自己的JSON。如果结果也不是“成功”,则它将是“错误”或“无效”。

如果是“错误”或“无效”,我会调用一个恢复字段原始名称的函数。

    var reinstate = function(){
    // if the form has already been submitted, but braintree returns errors,
    // we have to reinstate the original field names.

    $("input[xname]").each(function(){
        $this = $(this);
        var thisxname = $this.attr("xname");
        $this.attr("name",thisxname);
        $this.removeAttr("xname");
    });
}

现在用户可以再试一次。希望这可以帮助。考虑到我实施的所有ajax和服务器端处理解决方案,我知道这个解释非常多毛。

TL;博士 你必须阻止braintree删除名称属性,然后在提交之前自己完成。

答案 2 :(得分:0)

大家好我解决这个问题

$('#purchase_form').validate({
        rules: {
            name: {
                required: true
            },
            number: {
                required: true,
                minlength: 13,
                maxlength: 19
            },
            month: {
                required: true,
                regex: "(0[123456789]|10|11|12)"
            },
            year: {
                required: true,
                regex: "([0-9][0-9])"
            },
            cvv: {
                required: true,
                minlength: 3,
                maxlength: 4
            },
        },
        submitHandler: function (form) {
            $('#purchase_form').hide();
            $('#processing').show();

            braintree.encryptForm($(form));

            $.ajax({
                type: "POST",
                url: base_url+'items/purchase_direct',
                data: $(form).serialize(),
                dataType: "json",
                success: function (response) {
                    if(response.status == 'error')
                    {
                        $('#number_direct').attr('name','number');
                        $('#cvv_direct').attr('name','cvv');
                    }
                    else
                    {
                        $('#purchase_form').hide();
                        $('#processing').hide();
                        $('#purchaseconfirm').show();

                    }
                }
            });
            return false;
        }
    });

添加braintree.encryptForm($(form));在submitHandler里面.. 这使得braintree在那里删除了输入名称。如果它再次失败,我将再次添加输入名称。

不要忘记删除braintree.onSubmitEncryptForm('braintree-payment-form',optionalCallback);

抱歉我的英语..

答案 3 :(得分:0)

有一种方法可以扩展验证器对象以添加多个规则。 See the documentation here.

var newRules = {name: {required: true}, email: {required: true} }; //your object of new rules

$.validator.addClassRules(newRules);