我有一个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]),因此它正在处理一个项目,返回一个空对象):
Uncaught TypeError: Cannot read property ‘settings’ of undefined
然而,当按下提交按钮时,jQuery验证工作正常,所以其他一切都应该正确设置.
我在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(); }; }}); });
问题是新的验证插件检查是否存在应该被验证的任何元素,并且在同一页上有两个表单,第一个表单没有任何经过验证的输入元素.
解决方法
我刚刚升级到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]”).也就是说,如果您的表单没有具有该属性值的任何后代(如输入元素),则不会由验证助手进行解析,并且不会将“验证器”数据分配给该表单元素.如果您尝试在稍后阶段访问该表单的验证器,那么您将获得此“未定义”错误.
在我的情况下,发生这种情况的表单实际上并没有使用任何验证,因此他们没有这个属性.然后,我可以更改我的自定义验证器逻辑,以便在更改验证器设置之前先检查验证器是否存在.
希望有帮助.