jquery - 使用css将星号*添加到必填字段并在不需要时清除它

标签 jquery html css kendo-ui

我有一个应用程序,它有无数的字段,其中有些是“必需的”,有些不是,并且使用 jQuery 来完成它似乎是性能密集型的。所以我尝试使用 css 来实现,但没有成功。所以我转向了 Stack Overflow! :)

让我放置代码并尝试解释我想要实现的目标。这是来自 MVC 包装器的 Kendo UI,因此它有一些 Kendo 类,但它不应该改变任何内容。

这是首次加载页面时(在 Chrome 调试窗口中)包装器代码的样子。此时,即首次加载页面时,我想在所有必填字段上向用户显示星号。

<div class="form-group">
    <label><b>Phone</b></label>
    <div>
        <span class="k-widget phonenumber">
        <input required="required" data-val="true" data-val-required="The Phone field is required." id="PhoneNumber" >
    </div>
</div>

有一个定义如下的验证器,它动态地向表单元素添加/删除错误类。

var $validator = $("#form").validate({
    highlight: function (element) {
        $(element).closest('.form-group').removeClass('has-success').addClass('has-error');
    },
    unhighlight: function (element) {
        $(element).closest('.form-group').removeClass('has-error').addClass('has-success');
    },
    errorElement: 'span',
    errorClass: 'help-block',
    errorPlacement: function (error, element) {
        if (element.parent('.input-group').length) {
            error.insertAfter(element.parent());
        } else {
            error.insertAfter(element);
        }
    }
});

目前,当用户单击此字段并失去焦点时,代码如下所示:

<div class="form-group has-error">
    <label><b>Phone</b></label>
    <div>
        <span class="k-widget phonenumber">
        <input required="required" data-val="true" data-val-required="The Phone field is required." id="PhoneNumber" >
        <span for="PhoneNumber" class="help-block">This field is required.</span>
    </div>
</div>

因此 div 获得 has-error 类,并添加一个范围来显示错误消息。

当我们通过在此字段中键入内容来满足此要求时,错误消息将被隐藏,错误类将被删除,并添加 has-success 类,代码如下所示:

<div class="form-group has-success">
    <label><b>Phone</b></label>
    <div>
        <span class="k-widget phonenumber">
        <input required="required" data-val="true" data-val-required="The Phone field is required." id="PhoneNumber" >
        <span for="PhoneNumber" class="help-block" style="display: none;">This field is required.</span>
    </div>
</div>

那么看看这些元素的这种行为,有没有一种方法可以找到具有“required”属性的元素,向上一步找到它们的标签并在它们后面加上一个*。当表单没有错误类时,再次删除该 * 吗?我对找到那种 css 选择器一无所知! :(

我已经使用 jQuery 完成了它,它可以工作,但我仍然不喜欢它,因为表单是如此动态,每当元素的 时我都需要调用这个 AstAdd() 方法>必需的属性更改。 css 方式会更干净。

function AstAdd(){
    $('input[required]').each(function () {
        AstToggle($(this));
        $(this).blur(function () {
            AstToggle($(this));
        });
    });
}
function AstToggle(element) {
    if (element.val() == '') {
        element.closest(":has(label)").find('label').addClass('Asterisk');
    } else {
        element.closest(":has(label)").find('label').removeClass('Asterisk');
    }
}

并创建一个像这样的CSS类:

.Asterisk:after {
    content: " *";
    color: red;
}

非常感谢您的帮助!

最佳答案

可以使用 Psuedo Elements 和 content 通过 CSS 来完成此操作。

input[required] {
  display: block;
}

input[required]::after {
  content: '*';
  color: red;
}
<label><b>Phone Number</b></label>
<div>
  <span class="k-widget phonenumber">
        <input required="required" data-val="true" data-val-required="The Phone field is required." id="PhoneNumber" >
    </div>
</div>
<div class="form-group">
    <label><b>Mobile Number</b></label>
    <div>
        <span class="k-widget phonenumber">
        <input id="MobileNumber" >
    </div>
</div>
<div class="form-group">
    <label><b>Office number</b></label>
    <div>
        <span class="k-widget phonenumber">
        <input id="OfficeNumber" >
    </div>
</div>

看起来这有一个错误。查看更多:Combine CSS Attribute and Pseudo-Element Selectors?

我强烈建议使用 jQuery,因为它允许更多选项。

$(function() {
  $("[required]").after($("<span>", {
    class: "required"
  }).html("*"));
});
.required {
  color: red;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="form-group">
  <label><b>Phone Number</b></label>
  <div>
    <span class="k-widget phonenumber">
        <input required="required" data-val="true" data-val-required="The Phone field is required." id="PhoneNumber" >
    </div>
</div>
<div class="form-group">
    <label><b>Mobile Number</b></label>
    <div>
        <span class="k-widget phonenumber">
        <input id="MobileNumber" >
    </div>
</div>
<div class="form-group">
    <label><b>Office number</b></label>
    <div>
        <span class="k-widget phonenumber">
        <input id="OfficeNumber" >
    </div>
</div>

希望有帮助。

关于jquery - 使用css将星号*添加到必填字段并在不需要时清除它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56587065/

相关文章:

javascript - jQuery .map() 返回没有未定义

javascript - 我怎样才能保持这个表头固定?

css - 连续两个圆形边框框?

javascript - 如果在 div 中找到值,则按类名更新最接近跨度的值

jquery - 如何使用 jquery 在 bootstrap 中激活导航栏

javascript - IE中表格获得焦点时表格滚动条跳起

html - 固定位置 div 在顶部垂直空间

php - 菜单表使用 CSS 占据网页的整个高度

php - Highchart JSON饼图显示 Slice undefined

javascript - 如何防止 Javascript/JQuery 移动页面上的其他元素?