(Jquery Validate) onkeyup: false 适用于一个字段,直到我第二次选择它

Posted

技术标签:

【中文标题】(Jquery Validate) onkeyup: false 适用于一个字段,直到我第二次选择它【英文标题】:(Jquery Validate) onkeyup: false works for a field until I select it a second time 【发布时间】:2021-12-03 05:38:48 【问题描述】:

我正在处理一个大型的遗留 Asp.Net 网络表单项目。我有一个字段可以访问我们的服务器以检查验证的唯一性。此过程中的所有内容都在工作,除了重要字段将在更改焦点后在 keyup 上验证,然后重新关注该字段。该字段是一个简单的 html 输入。在其他事件中,我尝试将 onkeyup 设置为 false。我曾尝试使用自定义 onkeyup。无论我尝试什么,keyup 验证都会不断返回。

用户将专注于该字段并输入他们的数据。在初始输入期间,验证不会触发,直到焦点更改。然后,当用户再次关注该字段时,验证会在每个键上触发。我必须阻止这种行为以减少网络流量。否则,我会称之为好并继续前进。非常感谢任何建议。以下代码是从项目中简化的,但仍然给我提到的行为。如果我能澄清任何事情,请告诉我。

jQuery v3.4.1 jQuery 验证插件 - v1.19.0

<form id="form1" runat="server">
        <div style="padding: 100px;">
            <div class="control-group">
                <label for="claimNumber" class="control-label" style="width: 200px;">Claim #*</label>
                <div class="controls" style="margin-left:20px">
                    <input type="text" class="form-control span3" id="claimNumber" name="claimNumber" maxlength="128"/>
                    <button style="margin-left: 10px">Validate</button>
                </div>
            </div>
        </div>
    </form>
    <script>
        var isUsed;
        var form = $("#form1").show();
        
        var form1ValidationRules = 
             rules: 
                claimNumber: 
                    uniqueClaim: true,
                    required: true
                
            
        ;

        var validateForm = function () 
            $('input,select,textarea', 'div.hide').not('input[type=radio]').each(function () 
                $(this).val('');
            );

            return $("#form1").validate(form1ValidationRules).form();
        ;

        $(document).ready(function () 
            $.validator.addMethod(
                "uniqueClaim",
                function () 
                    console.log("validating");

                    return (isUsed == false)
                ,
                "Claim number is already in use for your company."
            );


            $('form#form1').validate(form1ValidationRules);

            $('#myform').validate(
                onkeyup: false
            );
            
        );
    </script>

【问题讨论】:

您是否在项目中使用不显眼的验证?如果是这样,您的自定义 .validate() 及其所有选项都将被忽略。 我 99% 确定我们没有使用 Unobtrusive。我们今天早上找到了解决方案。我稍后会用解决方案更新帖子。 不确定该解决方案是什么,因为在正确配置插件后onkeyup: false 可以正常工作。 根据您的问题描述... onkeyup 最初似乎只是被禁用,因为该插件默认使用“惰性”验证。然后在重新聚焦字段onkeyup 后,因为这是默认行为。您只是在描述正常的默认值。如果您在正确的初始化过程中成功应用onkeyup: false,那么它始终会被完全禁用。正如我的回答中所解释的,您上面的代码调用了两次.validate()...onkeyup: false 的第二个实例将被忽略。 【参考方案1】:
$('form#form1').validate(form1ValidationRules);

$('#myform').validate(
    onkeyup: false
);

$myform 在哪里?那将是一个带有id="myform" 的表格。您似乎已将 .validate() 附加到此代码中不存在的表单。此调用将被忽略。

如果它应该是同一个表单并且您修复了#myform 选择器,它仍然无法工作,因为您在同一个表单上调用了两次.validate()。第二次调用将被忽略。

如果您在 ASP 项目中使用 Unobtrusive Validation 插件,那么您将在同一个表单上调用 .validate() 三次。由 Unobtrusive 插件自动创建的 .validate() 调用将首先被调用,其他调用将被忽略。

jQuery Validate 插件使用.validate() 一次性初始化表单上的插件。如果.validate()被多次调用,所有后续调用都会被忽略。

拥有 Unobtrusive 的 ASP 用户通常使用 the .setDefaults() method 来覆盖由 Unobtrusive 创建的任何 jQuery Validate 设置。请记住,这会覆盖页面上所有表单的 jQuery Validate 设置。

【讨论】:

$myform 不错,我没看到。我的菜鸟错误。最后,由于我们最终找到了解决方案,该块已经消失了。稍后我将使用上述解决方案更新我的帖子。 @mdsplat-ta,即使没有 Unobtrusive,您的代码也会在同一个表单上调用 .validate() 两次。正如我上面解释的那样,第二个实例......带有onkeyup: false 的那个将被忽略。

以上是关于(Jquery Validate) onkeyup: false 适用于一个字段,直到我第二次选择它的主要内容,如果未能解决你的问题,请参考以下文章

jQuery 验证插件未在 form$.validate() 上进行验证

Jquery validate(submitHandler函数)验证通过发送Ajax

jquery+ajax+form表单验证

求jquery绑定onkeyup代码

求jquery绑定onkeyup代码

js的validate插件异步效验