如何使用条件验证从数据属性中检索参数?
How do I retrieve the parameter from the data attribute with conditional validation?
我正在尝试向某些代码添加条件验证器。它基本上可以工作,除了一件事:我需要从 html 属性而不是 jquery 代码中检索参数。我一直无法弄清楚如何做到这一点。目前我的代码似乎将代码 "depends" 部分中 return 语句的结果作为参数发送到 'genrule' 部分。因此,'genrule' 从数据属性中接收 'true' 而不是 '50' 或 '500'。
这是我一直在使用的 jsfiddle 的 link:http://jsfiddle.net/iceape/9eyy2h1f/5/
下面的嵌入代码似乎没有执行。
$.validator.addMethod('genrule', function(value, element, param) {
console.log("addmethod: " + param + " " + param[0] + " " + param[1]);
console.log("value: " + value);
return (value >= param);
});
$('#test').validate({
debug: true,
rules: {
foo: {
required: true,
genrule: {
depends: function(element) {
console.log("bar: " + $('#bar').val());
return ($('#bar').val() === "0");
}
}
},
bar: {
required: true,
genrule: {
depends: function(element) {
return ($('#foo').val() === "0");
}
}
}
},
submitHandler: function(form) {
alert('Success');
return false;
}
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<script src="https://ajax.aspnetcdn.com/ajax/jquery.validate/1.11.1/jquery.validate.min.js"></script>
<form id="test">
<input id="foo" name="foo" type="text" data-rule-genrule="500" data-msg-genrule="If bar is 0, then foo must be >= 500" />
<br/>
<input id="bar" name="bar" type="text" data-rule-genrule="50" data-msg-genrule="If foo is 0, then bar must be >= 50" />
<br/>
<input type="submit" />
</form>
编辑:
JSFiddle 的最终工作代码:http://jsfiddle.net/iceape/9eyy2h1f/
SO 上的最终工作代码:
$.validator.addMethod('genrule', function(value, element, param) {
return (value >= param);
});
$('#test').validate({
rules: {
foo: {
required: function(element) {
return $.trim($('#bar').val()).length === 0;
},
genrule: {
param: $('#foo').data('rule-genrule'),
depends: function(element) {
return ($.trim($('#foo').val()).length > 0);
}
}
},
bar: {
required: function(element) {
return $.trim($('#foo').val()).length === 0;
},
genrule: {
param: $('#bar').data('rule-genrule'),
depends: function(element) {
return ($.trim($('#bar').val()).length > 0);
}
}
}
},
submitHandler: function(form) {
alert('Success');
return false;
}
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<script src="https://ajax.aspnetcdn.com/ajax/jquery.validate/1.11.1/jquery.validate.min.js"></script>
<form id="test">
<input id="foo" name="foo" type="text" data-rule-genrule="500" data-msg-genrule="Foo must be >= 500" />
<br/>
<input id="bar" name="bar" type="text" data-rule-genrule="50" data-msg-genrule="Bar must be >= 50" />
<br/>
<input type="submit" />
</form>
genrule
is receiving true
instead of 50
or 500
from the data attributes.
您可以通过多种方式、各种内联属性或通过插件的方法之一为该插件声明规则。但是,您不能同时执行这两项操作,并且 .validate()
方法中的 rules
对象将始终优先于任何内联属性。
你的 genrule
参数总是得到一个布尔值,因为你在这里发送一个布尔值...
rules: {
foo: {
genrule: {
depends: function(element) {
return ($('#bar').val() === "0"); // <- this is your "genrule" `param`
....
相反,当 true
...
时发送 500
rules: {
foo: {
genrule: {
param: 500,
depends: function(element) {
return $('#bar').val() === "0");
}
或者,您可以使用 the .data()
method.
获取 data
属性的值
rules: {
foo: {
genrule: {
param: $('#foo').data('rule-genrule'), // value of `data-rule-genrule`
depends: function(element) {
return ($('#bar').val() === "0");
}
....
我这里也看出了一个误区...
console.log("addmethod: " + param + " " + param[0] + " " + param[1]);
您不会有 param[0]
、param[1]
等,因为您的 param
只是 500
或 [=16= 的单个参数].您的 param
需要类似于 [10,100]
才能将多个参数发送到自定义规则中。
我正在尝试向某些代码添加条件验证器。它基本上可以工作,除了一件事:我需要从 html 属性而不是 jquery 代码中检索参数。我一直无法弄清楚如何做到这一点。目前我的代码似乎将代码 "depends" 部分中 return 语句的结果作为参数发送到 'genrule' 部分。因此,'genrule' 从数据属性中接收 'true' 而不是 '50' 或 '500'。
这是我一直在使用的 jsfiddle 的 link:http://jsfiddle.net/iceape/9eyy2h1f/5/
下面的嵌入代码似乎没有执行。
$.validator.addMethod('genrule', function(value, element, param) {
console.log("addmethod: " + param + " " + param[0] + " " + param[1]);
console.log("value: " + value);
return (value >= param);
});
$('#test').validate({
debug: true,
rules: {
foo: {
required: true,
genrule: {
depends: function(element) {
console.log("bar: " + $('#bar').val());
return ($('#bar').val() === "0");
}
}
},
bar: {
required: true,
genrule: {
depends: function(element) {
return ($('#foo').val() === "0");
}
}
}
},
submitHandler: function(form) {
alert('Success');
return false;
}
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<script src="https://ajax.aspnetcdn.com/ajax/jquery.validate/1.11.1/jquery.validate.min.js"></script>
<form id="test">
<input id="foo" name="foo" type="text" data-rule-genrule="500" data-msg-genrule="If bar is 0, then foo must be >= 500" />
<br/>
<input id="bar" name="bar" type="text" data-rule-genrule="50" data-msg-genrule="If foo is 0, then bar must be >= 50" />
<br/>
<input type="submit" />
</form>
编辑: JSFiddle 的最终工作代码:http://jsfiddle.net/iceape/9eyy2h1f/
SO 上的最终工作代码:
$.validator.addMethod('genrule', function(value, element, param) {
return (value >= param);
});
$('#test').validate({
rules: {
foo: {
required: function(element) {
return $.trim($('#bar').val()).length === 0;
},
genrule: {
param: $('#foo').data('rule-genrule'),
depends: function(element) {
return ($.trim($('#foo').val()).length > 0);
}
}
},
bar: {
required: function(element) {
return $.trim($('#foo').val()).length === 0;
},
genrule: {
param: $('#bar').data('rule-genrule'),
depends: function(element) {
return ($.trim($('#bar').val()).length > 0);
}
}
}
},
submitHandler: function(form) {
alert('Success');
return false;
}
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<script src="https://ajax.aspnetcdn.com/ajax/jquery.validate/1.11.1/jquery.validate.min.js"></script>
<form id="test">
<input id="foo" name="foo" type="text" data-rule-genrule="500" data-msg-genrule="Foo must be >= 500" />
<br/>
<input id="bar" name="bar" type="text" data-rule-genrule="50" data-msg-genrule="Bar must be >= 50" />
<br/>
<input type="submit" />
</form>
genrule
is receivingtrue
instead of50
or500
from the data attributes.
您可以通过多种方式、各种内联属性或通过插件的方法之一为该插件声明规则。但是,您不能同时执行这两项操作,并且 .validate()
方法中的 rules
对象将始终优先于任何内联属性。
你的 genrule
参数总是得到一个布尔值,因为你在这里发送一个布尔值...
rules: {
foo: {
genrule: {
depends: function(element) {
return ($('#bar').val() === "0"); // <- this is your "genrule" `param`
....
相反,当 true
...
500
rules: {
foo: {
genrule: {
param: 500,
depends: function(element) {
return $('#bar').val() === "0");
}
或者,您可以使用 the .data()
method.
data
属性的值
rules: {
foo: {
genrule: {
param: $('#foo').data('rule-genrule'), // value of `data-rule-genrule`
depends: function(element) {
return ($('#bar').val() === "0");
}
....
我这里也看出了一个误区...
console.log("addmethod: " + param + " " + param[0] + " " + param[1]);
您不会有 param[0]
、param[1]
等,因为您的 param
只是 500
或 [=16= 的单个参数].您的 param
需要类似于 [10,100]
才能将多个参数发送到自定义规则中。