如何将 "invalid-feedback" class 与来自 Bootstrap-Select 的选择器一起使用?

How to use "invalid-feedback" class with selectpicker from Bootstrap-Select?

我正在使用 Bootstrap 在我的网络应用程序上进行一些表单验证。使用普通的 select 菜单,当字段无效时很容易弹出错误消息:

<select class="someClass" required>
    <option value="">Select an option</option>
    <option>foo</option>
    <option>bar</option>
</select>
<div class="invalid-feedback">Please make a selection.</div>

但是,我正在使用 Bootstrap-Select 的“selectpicker”class,以及 class 中的“invalid-feedback”消息=17=] 不再有效。无论如何强制 Bootstrap-Select 识别“invalid-feedback” class 还是我必须以不同的方式解决这个问题?

我想出了如何做到这一点,更一般地说,这是任何时候您必须 "manually" 强制错误以使用 Bootstrap 的本机验证系统的答案。这真的很 hacky,但我找不到其他有用的东西。

假设您的 "selectpicker" 看起来像这样:

<select id="mySelect" class="selectpicker" required>
    <option value="">Select an option</option>
    <option>foo</option>
    <option>bar</option>
</select>
<div id="error" class="invalid-feedback">Please make a selection.</div>

错误消息"Please make a selection"不会显示,即使select元素无效;它会显示,但是,如果它也有 "d-block" class:

<div id="error" class="invalid-feedback d-block">Please make a selection.</div>

所以要手动强制错误,您必须使用 JavaScript 检查“:invalid” CSS pseudo-class;如果它有这个 pseudo-class,那么你将 "d-block" class 添加到你的 div 以显示错误。您可以使用 matches() 方法和 classList.add():

var selector = document.getElementById("mySelect");
var errorMsg = document.getElementById("error");

if(selector.matches(":invalid"))
{
   errorMsg.classList.add("d-block");
}

您这样做是为了添加消息,您可以通过检查“:valid”并从 class 列表中删除 "d-block" 来删除它。

我的一个表单中有多个版本的 bootstrap-select 元素,并且很难让它发挥作用。下面的方法不会在输入中显示复选标记或 x,但会正确显示无效反馈和有效反馈框。

使用 secretagentmango 的回答中的建议,您可以创建一个函数,使用 "selectpicker" class 循环遍历所有输入,获取它们的父 form-group 元素,然后找到子元素"valid-feedback" 和 "invalid-feedback" 元素 添加或删除 d-block class 和 hide/show 它们。

function bsSelectValidation() {
  if ($("#myForm").hasClass('was-validated')) {
    $(".selectpicker").each(function (i, el) {
      if ($(el).is(":invalid")) {
        $(el).closest(".form-group").find(".valid-feedback").removeClass("d-block");
        $(el).closest(".form-group").find(".invalid-feedback").addClass("d-block");
      }
      else {
        $(el).closest(".form-group").find(".invalid-feedback").removeClass("d-block");
        $(el).closest(".form-group").find(".valid-feedback").addClass("d-block");
      }
    });
  }
}

现在你需要在表单提交后运行这个函数,你可以直接将它添加到Bootstrap文档的示例代码中:

(function () {
  'use strict';
  window.addEventListener('load', function () {
    // Fetch all the forms we want to apply custom Bootstrap validation styles to
    var forms = document.getElementsByClassName('needs-validation');
    // Loop over them and prevent submission
    var validation = Array.prototype.filter.call(forms, function (form) {
      form.addEventListener('submit', function (event) {
        if (form.checkValidity() === false) {
          event.preventDefault();
          event.stopPropagation();
        }
        form.classList.add('was-validated');
        bsSelectValidation();
      }, false);
    });
  }, false);
})();

上述代码与 bootstrap 示例的唯一不同之处在于调用了我们的新函数 "bsSelectValidation"。

现在您需要监听表单中的更改以自动更新 d-block classes 并在人们对表单进行更改时修复 valid/invalid 消息:

$('#myForm').change(bsSelectValidation);

现在,您的 select 菜单应该在表单提交或更改时正确显示有效反馈和无效反馈 div。

我发现如果我简单地删除“option”元素的 value="" 部分,验证消息就会正确显示。也就是说,如果我没有从下拉列表中选择 select 任何内容,则会显示我的“invalid-feedback”消息。当我 select 某事时,它消失了,我可以继续进行。如果您还没有尝试过,那值得一试。 我的第一个“选项”很简单:<option>(select)</option>——不存在 'value' 子句。 希望这有帮助。