使用 jQuery 验证插件验证相关的 select 选项
Validate dependent select options with jQuery Validation plugin
简介
我正在使用 jQuery Validation plugin 来验证表单,然后再将其提交到服务器。对于简单的情况,它效果很好。但是我发现官方文档缺少一些更高级的示例。
想像
假设有一家网店有 3 个地点(柏林、巴黎和罗马)。然而,快递服务只能在一个地点(柏林)提供。请注意:订单可以通过 post 发送到所有三个地点。
如果用户选择与罗马或巴黎相关的快递服务,我想确保验证会显示错误。
问题
我正在尝试验证依赖于彼此选项值的两个 select。
虽然,我不知道如何实现它。
代码
JsFiddle 我的代码
html
<form id="myForm" name="myForm">
<p><b>Order delivery</b></p>
<p>
City<br />
<select name="city" id="city">
<option selected value="">-- Please choose destination --</option>
<option value="1">Berlin</option>
<option value="2">Paris</option>
<option value="3">Rome</option>
</select>
</p>
<p>
Delivery method<br />
<select name="delivery" id="delivery">
<option selected value="">-- Please choose delivery method --</option>
<option value="1">By post</option>
<option value="2">By courier</option>
</select>
</p>
<input type="submit" />
</form>
javascript
$( document ).ready( function () {
jQuery.validator.addMethod("valueIsDeliveryPost", function(elementValue, element, param) {
if (elementValue == 1) {
return true;
} else {
return false;
}
}, "Value must equal param.");
jQuery.validator.addMethod("valueIsDeliveryCourier", function(elementValue, element, param) {
if (elementValue == 2) {
return true;
} else {
return false;
}
}, "Value must equal param.");
jQuery.validator.addMethod("valueIsEqualTo", function(elementValue, element, param) {
return elementValue == param;
}, "Value must equal param.");
jQuery.validator.addMethod("valueIsNotEqualTo", function(elementValue, element, param) {
return elementValue != param;
}, "Value must not equal param.");
$("#myForm").validate({
debug: true,
rules: {
city: {
required: true,
valueIsNotEqualTo: "default"
},
delivery: {
required: true,
valueIsNotEqualTo: "default",
valueIsDeliveryPost: {
param: 1, // if delivery by post is selected
depends: function(element) {
var cityVal = $("#city").val();
if ((cityVal != "") && (cityVal == 1)) { // if Berlin
return false;
} else if ((cityVal != "") && (cityVal == 2)) { // if Paris
return false;
} else if ((cityVal != "") && (cityVal == 3)) { // if Rome
return false;
}/* else {
return true;
}*/
}
},
valueIsDeliveryCourier: {
param: 2, // if delivery by courier is selected
depends: function(element) {
var cityVal = $("#city").val();
if ((cityVal != "") && (cityVal == 1)) { // if Berlin
return true;
} else if ((cityVal != "") && (cityVal == 2)) { // if Paris
return false;
} else if ((cityVal != "") && (cityVal == 3)) { // if Rome
return false;
}/* else {
return true;
}*/
}
}
},
},
messages: {
city: {
required: "Please select your city!",
valueIsNotEqualTo: "Please select your city!"
},
delivery: {
required: "Please select delivery method!",
valueIsNotEqualTo: "Please select delivery method!",
valueIsDeliveryPost: "Delivery by post is possible for all cities!",
valueIsDeliveryCourier: "Courier delivery is possible only in Berlin!"
},
errorElement: "em",
errorPlacement: function (error, element) {
return false;
},
invalidHandler: function(form, validator) {
var errors = validator.numberOfInvalids();
if (errors) {
// Only show first invalid rule message
alert(validator.errorList[0].message);
// Set focus
validator.errorList[0].element.focus();
}
},
highlight: function (element, errorClass, validClass) {
$(element).addClass("is-invalid").removeClass( "is-valid" );
},
unhighlight: function (element, errorClass, validClass) {
$(element).addClass("is-valid").removeClass( "is-invalid" );
},
submitHandler: function(form) {
alert('valid form');
}
}
});
});
终于
我认为问题的原因可能是依赖 select 验证代码的逻辑错误。
我在做什么wong?
请分享您的专业知识和想法。
你的逻辑似乎没问题。
如果您单击 your jsFiddle 中的 "tidy" 按钮,您可以看到您错误地嵌套了 errorElement
、errorPlacement
、invalidHandler
、[= messages
中的 16=]、highlight
和 unhighlight
选项。
这些选项应该是 messages
和 rules
的兄弟选项。
$("#myForm").validate({
rules: {
....
},
messages: {
....
},
errorElement: "em",
errorPlacement: function (error, element) {
....
},
invalidHandler: function(form, validator) {
....
},
highlight: function (element, errorClass, validClass) {
....
},
unhighlight: function (element, errorClass, validClass) {
....
},
submitHandler: function(form) {
....
}
});
注意:我完全同意丹尼尔的观点。首先向用户提供无效选项是没有意义的,并且动态地从 select
.
add/remove option
会容易得多
这是一个非常粗略的概念验证:
$('#city').on('change', function() {
if ($(this).val() == '1') {
$('#delivery option[value="1"]').remove();
}
});
或者你可以 disable the option
by ghosting it out:
$('#city').on('change', function() {
var option = $('#delivery option[value="1"]');
if ($(this).val() == '1') {
option.attr('disabled', true);
} else {
option.attr('disabled', false);
}
});
简介
我正在使用 jQuery Validation plugin 来验证表单,然后再将其提交到服务器。对于简单的情况,它效果很好。但是我发现官方文档缺少一些更高级的示例。
想像
假设有一家网店有 3 个地点(柏林、巴黎和罗马)。然而,快递服务只能在一个地点(柏林)提供。请注意:订单可以通过 post 发送到所有三个地点。
如果用户选择与罗马或巴黎相关的快递服务,我想确保验证会显示错误。
问题
我正在尝试验证依赖于彼此选项值的两个 select。 虽然,我不知道如何实现它。
代码
JsFiddle 我的代码
html
<form id="myForm" name="myForm">
<p><b>Order delivery</b></p>
<p>
City<br />
<select name="city" id="city">
<option selected value="">-- Please choose destination --</option>
<option value="1">Berlin</option>
<option value="2">Paris</option>
<option value="3">Rome</option>
</select>
</p>
<p>
Delivery method<br />
<select name="delivery" id="delivery">
<option selected value="">-- Please choose delivery method --</option>
<option value="1">By post</option>
<option value="2">By courier</option>
</select>
</p>
<input type="submit" />
</form>
javascript
$( document ).ready( function () {
jQuery.validator.addMethod("valueIsDeliveryPost", function(elementValue, element, param) {
if (elementValue == 1) {
return true;
} else {
return false;
}
}, "Value must equal param.");
jQuery.validator.addMethod("valueIsDeliveryCourier", function(elementValue, element, param) {
if (elementValue == 2) {
return true;
} else {
return false;
}
}, "Value must equal param.");
jQuery.validator.addMethod("valueIsEqualTo", function(elementValue, element, param) {
return elementValue == param;
}, "Value must equal param.");
jQuery.validator.addMethod("valueIsNotEqualTo", function(elementValue, element, param) {
return elementValue != param;
}, "Value must not equal param.");
$("#myForm").validate({
debug: true,
rules: {
city: {
required: true,
valueIsNotEqualTo: "default"
},
delivery: {
required: true,
valueIsNotEqualTo: "default",
valueIsDeliveryPost: {
param: 1, // if delivery by post is selected
depends: function(element) {
var cityVal = $("#city").val();
if ((cityVal != "") && (cityVal == 1)) { // if Berlin
return false;
} else if ((cityVal != "") && (cityVal == 2)) { // if Paris
return false;
} else if ((cityVal != "") && (cityVal == 3)) { // if Rome
return false;
}/* else {
return true;
}*/
}
},
valueIsDeliveryCourier: {
param: 2, // if delivery by courier is selected
depends: function(element) {
var cityVal = $("#city").val();
if ((cityVal != "") && (cityVal == 1)) { // if Berlin
return true;
} else if ((cityVal != "") && (cityVal == 2)) { // if Paris
return false;
} else if ((cityVal != "") && (cityVal == 3)) { // if Rome
return false;
}/* else {
return true;
}*/
}
}
},
},
messages: {
city: {
required: "Please select your city!",
valueIsNotEqualTo: "Please select your city!"
},
delivery: {
required: "Please select delivery method!",
valueIsNotEqualTo: "Please select delivery method!",
valueIsDeliveryPost: "Delivery by post is possible for all cities!",
valueIsDeliveryCourier: "Courier delivery is possible only in Berlin!"
},
errorElement: "em",
errorPlacement: function (error, element) {
return false;
},
invalidHandler: function(form, validator) {
var errors = validator.numberOfInvalids();
if (errors) {
// Only show first invalid rule message
alert(validator.errorList[0].message);
// Set focus
validator.errorList[0].element.focus();
}
},
highlight: function (element, errorClass, validClass) {
$(element).addClass("is-invalid").removeClass( "is-valid" );
},
unhighlight: function (element, errorClass, validClass) {
$(element).addClass("is-valid").removeClass( "is-invalid" );
},
submitHandler: function(form) {
alert('valid form');
}
}
});
});
终于
我认为问题的原因可能是依赖 select 验证代码的逻辑错误。
我在做什么wong?
请分享您的专业知识和想法。
你的逻辑似乎没问题。
如果您单击 your jsFiddle 中的 "tidy" 按钮,您可以看到您错误地嵌套了 errorElement
、errorPlacement
、invalidHandler
、[= messages
中的 16=]、highlight
和 unhighlight
选项。
这些选项应该是 messages
和 rules
的兄弟选项。
$("#myForm").validate({
rules: {
....
},
messages: {
....
},
errorElement: "em",
errorPlacement: function (error, element) {
....
},
invalidHandler: function(form, validator) {
....
},
highlight: function (element, errorClass, validClass) {
....
},
unhighlight: function (element, errorClass, validClass) {
....
},
submitHandler: function(form) {
....
}
});
注意:我完全同意丹尼尔的观点。首先向用户提供无效选项是没有意义的,并且动态地从 select
.
option
会容易得多
这是一个非常粗略的概念验证:
$('#city').on('change', function() {
if ($(this).val() == '1') {
$('#delivery option[value="1"]').remove();
}
});
或者你可以 disable the option
by ghosting it out:
$('#city').on('change', function() {
var option = $('#delivery option[value="1"]');
if ($(this).val() == '1') {
option.attr('disabled', true);
} else {
option.attr('disabled', false);
}
});