jQuery 验证: $.data($('form')[0], 'validator').settings 返回未定义

Posted

技术标签:

【中文标题】jQuery 验证: $.data($(\'form\')[0], \'validator\').settings 返回未定义【英文标题】:jQuery Validation: $.data($('form')[0], 'validator').settings returns undefinedjQuery 验证: $.data($('form')[0], 'validator').settings 返回未定义 【发布时间】:2014-08-25 20:39:27 【问题描述】:

我有一个 ASP.Net MVC 项目,我正在使用不显眼的 jQuery 验证。 当元素失去焦点时添加验证,我正在调用

$(document).ready(function () 
    // enable validation when an input loses focus.
    var settngs = $.data($('form')[0], 'validator').settings;
    settngs.onfocusout = function (element)  $(element).valid(); ;
);

这是在一个项目上工作,而在另一个项目上抛出此异常,因为 $.data($('form')[0], 'validator') 返回 undefined ($.data($('form')[ 0]) 返回一个空对象):

未捕获的类型错误:无法读取未定义的属性“设置”

然而,当按下提交按钮时,jQuery Validation 工作正常,所以其他一切都应该正确设置。

我在 body 标记的末尾加载这些脚本:(上面列出的函数在 customvalidations.js 中,所以它应该在验证器应用于表单后执行)

<script src="/Staffing/Scripts/jquery-2.1.1.js"></script>
<script src="/Staffing/Scripts/globalize/globalize.js"></script>
<script src="/Staffing/Scripts/globalize/cultures/globalize.culture.de-DE.js"></script>
<script src="/Staffing/Scripts/bootstrap.js"></script>
<script src="/Staffing/Scripts/respond.js"></script>
<script src="/Staffing/Scripts/bootstrap-datepicker.js"></script>
<script src="/Staffing/Scripts/bootstrap-datepicker-globalize.js"></script>
<script src="/Staffing/Scripts/locales/bootstrap-datepicker.de.js"></script>
<script src="/Staffing/Scripts/jquery.unobtrusive-ajax.js"></script>
<script src="/Staffing/Scripts/jquery.validate.js"></script>
<script src="/Staffing/Scripts/jquery.validate.globalize.js"></script>
<script src="/Staffing/Scripts/jquery.validate.unobtrusive.js"></script>
<script src="/Staffing/Scripts/localization/messages_de.js"></script>
<script src="/Staffing/Scripts/customvalidations.js"></script>
<script src="/Staffing/Scripts/uiadditions.js"></script>
<script src="/Staffing/Scripts/default.js"></script>

解决方案: 这是有效的代码:

$(document).ready(function () 
    // enable validation when an input loses focus.
    var allForms = $('form');
    $.each(allForms, function (key, value) 
        var val = $.data(value, 'validator');
        if (val != undefined) 
            var settngs = val.settings;
            settngs.onfocusout = function (element)  $(element).valid(); ;
        );
);

问题是新的验证插件会检查是否存在任何应该验证的元素,并且我在同一页面上有 2 个表单,第一个表单没有任何经过验证的输入元素。

【问题讨论】:

【参考方案1】:

我刚刚升级到 Microsoft.jQuery.Unobtrusive.Validation.3.2.0 包。我遇到了同样的问题。您是否也升级到相同的版本?

如果是这样,我可能会提供我的两分钱:)。经过一番调试,我注意到在 jquery.validate.unobtrusive.js 中进行了以下更改:

以前的版本:

    var $forms = $(selector)
        .parents("form")
        .andSelf()
        .add($(selector).find("form"))
        .filter("form");

新版本:

        $forms = $selector.parents()
                          .addBack()
                          .filter("form")
                          .add($selector.find("form"))
                          .has("[data-val=true]"); // key point!

关键似乎是:has("[data-val=true]")。也就是说,如果您的表单没有任何具有该属性值的后代(如输入元素),则验证助手不会对其进行解析,并且不会将“验证器”数据分配给该表单元素。如果您稍后尝试访问该表单的验证器,则会收到此“未定义”错误。

在我的例子中,发生这种情况的表单实际上并没有使用任何验证,因此它们没有这个属性。然后我可以更改我的自定义验证器逻辑,在更改验证器设置之前先检查验证器是否存在。

希望对您有所帮助。

【讨论】:

这就是原因。请参阅我编辑的问题以了解正在运行的代码。 哇。我们为动态控件选择了不显眼的 razor:在表单下的某处设置一个容器 div 恢复了我们所有损坏的验证。这很难找到,这个答案非常有帮助。谢谢。 是的,绝对有帮助,我的大部分字段都是只读的,而没有的两个字段没有任何 data-val 属性。很难找到,花了大约一个小时。【参考方案2】:

这也可能发生在您没有在表单上调用 validate() 时:

$("#your_form").validate();

就我而言,我的页面上没有 ID 为“your_form”的表单,因此在尝试添加规则时会导致此错误。

【讨论】:

通过 ajax 动态添加表单时为我工作【参考方案3】:

看起来您的项目使用不同类型的验证(其中一个使用不显眼,第二个使用默认)。

请检查您是否在两个项目的 web.config 中使用下一个设置。

<configuration>    
  <appSettings>        
    <add key="ClientValidationEnabled" value="true"/>        
    <add key="UnobtrusivejavascriptEnabled" value="true"/>    
  </appSettings>
</configuration>

您还尝试使用文档中的第一个表单。

如果没有表单 - 你会得到错误

如果有多个表单 - 只有第一个表单会使用 focusout 进行验证。

所以你应该对每个表单做同样的事情:

$(document).ready(function () 
    var $forms = $('form');
    $.each($forms, function (key, value) 
        // enable validation when an input loses focus.
        var settings = $.data(value, 'validator').settings;
        settings.onfocusout = function (element)  $(element).valid(); ;
    );
);

【讨论】:

【参考方案4】:

这样做$.validator.unobtrusive.parse($("#base-modal form")); 解决了我的问题

【讨论】:

【参考方案5】:

先结帐表格数量,我认为您使用的表格不正确。

$(document).ready(function () 
// enable validation when an input loses focus.
   if($('form').length > 0) 
     // $('form')[0] is it proper form?
     var settngs = $.data($('form')[0], 'validator').settings;
     settngs.onfocusout = function (element)  $(element).valid(); ;
   
);

【讨论】:

$('form').length > 0 返回true(页面上有表单)

以上是关于jQuery 验证: $.data($('form')[0], 'validator').settings 返回未定义的主要内容,如果未能解决你的问题,请参考以下文章

使用 Jquery 时引导验证不起作用

Jquery 仅在第二次点击时验证提交表单

jQuery 验证插件:验证多个输入文件

使用JQuery的ajax提交表单能否使用一个变量来获取form的id

jquerymobile怎么提交表单没有反应

验证 Jquery 后从表中获取值