就像我在标题上所述, 我想在我的脚本中添加多个函数.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>
答案 0 :(得分:2)
只是一个猜测,因为我无法从您发布的有限代码中重现您的问题,但我会说您忘记在每个输入元素上包含name
属性。 jQuery Validate插件在每个输入上都需要唯一的name
。
See the "Markup recommendations" section on the General Guidelines page:
“输入元素的
name
属性是'必需的', 没有它,验证插件不起作用。通常name
和id
属性应具有相同的值。“
<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);