在multi-select元素上使用jquery验证远程

在multi-select元素上使用jquery验证远程,jquery,validation,jquery-validate,html-select,Jquery,Validation,Jquery Validate,Html Select,我已经使用jquery一段时间了,最近才开始使用这个选项 当我对输入元素使用远程验证时,效果非常好(电子邮件、电话等)。我现在正试图让它与一个多选元素一起工作。我不明白远程验证什么时候启动。我第一次在元素中进行选择时,它会触发遥控器,并执行它应该执行的操作。然后,当我按住Ctrl键单击、按住Shift键单击或单击其他位置时,它并不总是执行验证并调用远程ajax方法 <!-- HTML snippet --> <form id="edit_user_form" action=""

我已经使用jquery一段时间了,最近才开始使用这个选项

当我对输入元素使用远程验证时,效果非常好(电子邮件、电话等)。我现在正试图让它与一个多选元素一起工作。我不明白远程验证什么时候启动。我第一次在元素中进行选择时,它会触发遥控器,并执行它应该执行的操作。然后,当我按住Ctrl键单击、按住Shift键单击或单击其他位置时,它并不总是执行验证并调用远程ajax方法

<!-- HTML snippet -->
<form id="edit_user_form" action="" method="post">
    <input type="text" name="username" id="edituser_username"/><br/>
    <select name="roles" id="edituser_roles" size="5" multiple="multiple"></select>
</form>

// jquery snippet
$('#edit_user_form').validate({
    rules: {
        username: { required: true },
        roles: {
            required: true,
            remote: {
                type: "POST",
                url: "/AdminJson/CheckRolesAllowed",
                dataType: "json",
                data: {
                    roles: function () { return $("#edituser_roles").val(); }
                }
            }
        }
    },
我的问题是:多选元素何时调用远程验证?我可以强制它在模糊和在“多重选择”中进行更改时进行验证吗


提前感谢

我在jquery.validate.js中调试后找到了答案。答案有几个部分

第一部分是,出于性能原因,validate插件缓存以前的值(感谢Jörn Zaefferr在正确方向上的提示-)

第二个是,当通过远程入口点时,要与上一个值进行比较的当前选择的值总是第一个被选择的元素,而不是整个元素列表。因此,当您更改选择列表选择但不更改第一个选定项时,验证插件无法识别选定项中的更改

解决方案是按照Jörn的建议,自己在变更处理程序中清除以前的值(建议用于不同的目的,但在这里也适用)

由于我希望每次更改选择时(通过Ctrl键单击、Shift键单击或单键单击)都能完成远程验证,而不必模糊元素,因此更改处理程序已扩展到以下内容:

$("#edituser_roles").change(function () {
    $("#edituser_roles").removeData("previousValue");
    $("#edit_user_form").validate().element("#edituser_roles");
});
$("#edituser_roles").change(function () {
    $("#edituser_roles").removeData("previousValue");
});
$("#edituser_roles").change(function () {
    $("#edituser_roles").removeData("previousValue");
    $("#edit_user_form").validate().element("#edituser_roles");
});