如果使用 jquery 验证发生验证错误,则将类添加到父 div

2023-12-04

我的输入字段有以下标记:

<div class="required">
    <label for="Name">Name <em>*</em></label>           
    <div class="input large">
        @Html.TextBoxFor(m => m.Name)
        @Html.ValidationMessageFor(m => m.Name)
    </div>
</div>

使用 jquery 验证插件,如果发生错误,它将在输入下方添加一个跨度,并将一个类应用于输入本身,以便可以对错误进行样式设置。我还想做的是将一个类添加到父 div 中,其中包含一个 required 类。例如,如果发生错误,它将是<div class="required error">然后固定后<div class="required valid">与应用于该字段的类和消除误差范围相关。

我该怎么做?我查看了文档站点,但没有看到与向父 div 添加类有关的任何内容。

我考虑过做类似的事情:

if ($('input').hasClass('valid')) {
    $(this).parents('div.required').addClass('valid');

} else if ($('input').hasClass('input-validation-error')) {
    $(this).parents('div.required').addClass('error');
}

但我怎样才能通过验证来运行它呢?就像发生错误或字段变得有效时一样。


访问验证器设置

第一个任务是修改settings表单验证器上的对象。您可以通过以下任一方式执行此操作:

  1. 在通过调用加载所有表单之前jQuery.validator.setDefaults()
  2. 通过传入选项来初始化表单时.validate([options])
  3. 通过在表单上定位验证器对象进行初始化后$("form").data("validator").settings

由于您使用的是 MVC,因此选项#2 是不可能的,因为不引人注目的验证将自动初始化表单。因此,让我们继续使用选项 3 - 这里的目标只是能够自定义表单上的设置。

覆盖默认行为

我们要修改的默认方法是highlight and unhighlight这将强调分别是无效字段或恢复突出显示选项所做的更改。这是他们的默认行为根据源代码:

highlight: function( element, errorClass, validClass ) {
    if ( element.type === "radio" ) {
        this.findByName( element.name ).addClass( errorClass ).removeClass( validClass );
    } else {
        $( element ).addClass( errorClass ).removeClass( validClass );
    }
},
unhighlight: function( element, errorClass, validClass ) {
    if ( element.type === "radio" ) {
        this.findByName( element.name ).removeClass( errorClass ).addClass( validClass );
    } else {
        $( element ).removeClass( errorClass ).addClass( validClass );
    }
}

所以你在这里也有几个选择。

  1. 完全替换那些函数,自己写
  2. 包装这些函数并像平常一样调用它们,但在之前或之后添加您自己的自定义代码。

选项 1 - 更换批发

这条路线非常简单。只要在那里写下你想要的任何内容即可。也许是从源代码中获取种子,也许是做你自己的事情。

var valSettings = $("form").data("validator").settings
valSettings.highlight = function(element, errorClass, validClass) { ... }
valSettings.unhighlight = function(element, errorClass, validClass) { ... }

选项 2 - 包装函数

这侵入性较小,因此在大多数情况下可能更可取。

因为最终你将替换的值valSettings.highlight,您将需要访问原始函数的干净原始版本。您可以保存自己的或获取全局默认值之一

// original highlight function
var highlightOriginal = $("form").data("validator").settings.highlight;
var highlightDefaults = $.validator.defaults.highlight

在包装 JavaScript 函数方面,有几个例子here, here, and here)。这是其中一个的解析示例,这将有助于绑定this跨函数调用的上下文,保留传递的参数的数量,并保留返回值:

function wrap(functionToWrap, beforeFunction) {
    return function () {
        var args = Array.prototype.slice.call(arguments),
        beforeFunction.apply(this, args);
        return functionToWrap.apply(this, args);
    };
};

然后,您还必须快速定义每当调用时您想要触发的任何附加行为。在这种情况下,让我们找到最近的父级div到元素并更新它的类,如下所示:

function highlightDecorator(element, errorClass, validClass) {
    $(element).closest("div").addClass(errorClass).removeClass(validClass);
}

Wrapping It All Up (see what I did there)

$(function () {
  var valSettings = $("form").data("validator").settings
  valSettings.highlight = wrap($.validator.defaults.highlight, highlightDecorator)
  valSettings.unhighlight = wrap($.validator.defaults.unhighlight, unhighlightDecorator)
});

function wrap(functionToWrap, beforeFunction) {
  return function () {
    var args = Array.prototype.slice.call(arguments);
    beforeFunction.apply(this, args);
    return functionToWrap.apply(this, args);
  };
};

function highlightDecorator(element, errorClass, validClass) {
  $(element).closest("div").addClass(errorClass).removeClass(validClass);
}
function unhighlightDecorator(element, errorClass, validClass) {
  $(element).closest("div").addClass(validClass).removeClass(errorClass);
}

因此,当我们组合上述所有函数时,它应该看起来像这样:

堆栈片段中的工作演示和jsFiddle

$(function () {
  var valSettings = $("form").data("validator").settings
	valSettings.highlight = wrap($.validator.defaults.highlight, highlightDecorator)
  valSettings.unhighlight = wrap($.validator.defaults.unhighlight, unhighlightDecorator)
});

function wrap(functionToWrap, beforeFunction) {
  return function () {
    var args = Array.prototype.slice.call(arguments);
    beforeFunction.apply(this, args);
    return functionToWrap.apply(this, args);
  };
};

function highlightDecorator(element, errorClass, validClass) {
  $(element).closest("div").addClass(errorClass).removeClass(validClass);
}
function unhighlightDecorator(element, errorClass, validClass) {
  $(element).closest("div").addClass(validClass).removeClass(errorClass);
}
input.input-validation-error  {
  border: solid 1px red;
}
.input-validation-error label {
  color: red;
}
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.16.0/jquery.validate.min.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validation-unobtrusive/3.2.6/jquery.validate.unobtrusive.min.js"></script>
    
<form action="/Person" method="post">
  
  <div class="required">
    <label for="Name">Name <em>*</em></label>           
    <input id="Name" name="Name" type="text" value="" 
           data-val="true" data-val-required="The Name field is required."/>
    <span class="field-validation-valid" 
          data-valmsg-for="Name" data-valmsg-replace="true"></span>
  </div>
  
  <input type="submit" value="Save" />
  
</form>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如果使用 jquery 验证发生验证错误,则将类添加到父 div 的相关文章

随机推荐

  • JavaScript Unicode 的长度(星体符号)

    我有一个 lt input type text gt 在 HTML 中 每次我添加一个字符时我都会执行if text length lt x 在 JavaScript 中 问题是 Unicode 特殊字符 星体符号 u 具有超过 4 个十六
  • 如何通过代码关闭 Ionic 5 应用程序?

    我找不到在 Ionic 5 系统中关闭应用程序的方法 看起来 Ionic 4 中的方法不适用于 Ionic 5 可以做吗 closeApp this platform backButton subscribeWithPriority 999
  • 本地修改的按值传递的参数会发生什么情况?

    我很清楚 修改按值传递的函数参数在 C C 函数之外是无效的 但编译器允许这样做 但会发生什么 是该论证的本地副本吗 是可修改的在函数内 include
  • 如何在 Sprite Kit、Objective C 中用手指移动击中物体

    我正在尝试制作一个游戏 其中我有一些 SKSpriteNode 并且用户可以通过手指移动来击中它们 我正在使用苹果的新 Sprite 套件 为此 我尝试了一个技巧 将 Sprite X SKSpriteNode 放置在手指所在的位置 当用户
  • 如何将数据表分成两个单独的列

    我有一个数据表 其中有很多列 只有一行 DataSet myDataSet new DataSet da Fill myDataSet myDataTable new DataTable myDataTable myDataSet Tabl
  • 如何将行动态添加到表格布局中

    我在 sqlite 中有某些数据 每次单击 保存 按钮时它都会更新 并且我想将数据显示到表布局中 以便为更新的数据添加更多行 我有某些代码 但它仅显示更新的数据替换以前的数据 并且我想在数据更新时添加更多行 我知道这只是在表格布局中添加一行
  • 如何从 Databricks 笔记本将文本文件上传到 FTP

    我试图找到解决方案 但一无所获 我是这方面的新手 所以如果您知道解决方案 请帮助我 谢谢 Ok I found a solution copy file from ADLS to SFTP from ftplib import FTP TL
  • 正则表达式替换除斜线之外的所有特殊字符?

    我正在尝试制定一些正则表达式 以消除 SharePoint 在创建文件夹时不会采用的所有特殊字符 这些是不允许的字符 我假设下面的底部正则表达式将处理所有这些字符 但我也想用破折号替换 或 lt gt 这就是我到目前为止所拥有的 但如果可能
  • 什么时候纹理内存应该优先于常量内存?

    如果线程之间的数据请求频率非常高 每个线程从特定列中选取至少一个数据 那么在 Pascal 架构中使用常量内存中的数据存储是否比纹理有任何好处 编辑 这是一个拆分版本这个问题改善社区搜索 如果满足对恒定内存使用的期望 则在一般情况下使用恒定
  • Windows 文件复制内部结构(动态加密)

    我必须为 Windows 编写一个即时加密器来加密所有复制的文件 为了实现这一点 我需要一些有关 Windows 如何进行加密的详细信息FileCopy works 所以我需要如下的描述 CreateFile被调用 创建一个目标文件 然后从
  • 在同一头文件中声明、初始化和使用全局变量

    我实际上正在尝试使用在头文件 例如 x h 中初始化的变量 并希望在同一头文件中的内联代码中使用相同的变量 同一变量在另一个文件 例如 y c 中被修改 我怎样才能做到这一点 我想知道这样做的好方法 使用extern保留字 切勿在 h 文件
  • 我需要简单的 Android 动画示例 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 请给我使用 XML 的简单 Android 动画示例 我是 Android 新手
  • 点击手势在 imageView 中不起作用,但在另一个视图中起作用

    我在图像和视频叠加中工作 因为我放置了一个图像视图 我将tapGestureRecognizer分配给该图像视图 但它不起作用 对于视频 我放置了一个MPMoviePlayerController 并将tapGestureRecognize
  • 资源更改时静态绑定不会更新

    我首先想说我对绑定非常陌生 我已经在 WPF 中做了一些事情 但我从未使用过绑定 因为这个概念对我来说有点难以理解 即使我现在正在做的事情也是我从我不完全理解的教程中设法挽救的 在我的应用程序中 我有一个具有静态属性的静态类 并且有一个更改
  • 使用筛子后素数求和仍然很慢

    我尝试了下面的项目欧拉编码挑战 代码给出的答案是正确的 但我不明白为什么它需要近一分钟才能运行 在使用筛子之前 它的完成时间相似 其他用户报告的时间低至毫秒 我认为我在某个地方犯了一个基本错误 The sum of the primes b
  • mini-kanren cond-a cond-u 和 cond-e 有什么区别?

    我尝试在 clojure 中使用 mini kanren 的实现 但一直在努力理解 cond a cond u 和 cond e 之间的区别 我似乎对 cond e 很清楚 但对 cond a 和 cond u 的理解却很糟糕 cond e
  • Android Studio - 如何更改 Android SDK 路径

    当我打开时安卓SDK管理器 from 安卓工作室 显示的SDK路径为 android studio sdk 我想改变这条路 我该怎么做 从 Android Studio 1 0 1 开始 Go to 文件 gt 项目结构进入项目结构 左 g
  • 苹果拒绝应用程序,因为animationDidStop:finished:context:是一个非公共API

    Apple 拒绝了我的应用程序 因为 3 3 1 应用程序只能按照Apple规定的方式使用文档化的API 不得使用或调用任何私有API 应用程序最初必须是用 Objective C C C 或 由 iPhone OS WebKit 引擎执行
  • 有没有办法在浏览器中获取Pyqt5页面的XPATH?

    我正在使用 pyqt5 我希望用户单击嵌入在我的 pyqt5 应用程序中的浏览器来获取他 她单击的元素的 XPATH 知道它是如何完成的 或者是否可行 为了回答这个问题 我使用了以下答案 获取被点击的项目 https stackoverfl
  • 如果使用 jquery 验证发生验证错误,则将类添加到父 div

    我的输入字段有以下标记 div class required div