【问题标题】:Validate form with bootstrap (novalidate)使用引导程序验证表单 (novalidate)
【发布时间】:2021-05-20 15:27:24
【问题描述】:

我在使用 bootstrap novalidate 验证表单时遇到问题。 有些表单字段包含“必填”标签,有些则不包含。

为了验证,我提交了没有数据的表单,'was-validated' 类验证了所有字段,带有“required”标签的字段标记为红色,其他字段标记为绿色。

这个想法是指定验证哪些字段而不是整个表单。

你能帮帮我吗?

表格

<form id="Data" method="POST" class="needs-validation mt-0" novalidate>
    <div class="row mb-1">
        <div class="col-lg-12 ">
            <div class="form-group">
                <label class="d-block font-weight-semibold">Name: <span class="text-danger">*</span></label>
                <input type="text" id="name" name="Name" class="form-control" autocomplete="off" required>
            </div>
        </div> <!-- / col -->
    </div> <!-- / row-->
    <div class="row mb-1">
        <div class="col-lg-12 ">
            <div class="form-group">
                <label class="d-block font-weight-semibold">Lastname: <span class="text-danger">*</span></label>
                <input type="text" id="lastname" name="lastname" class="form-control" autocomplete="off" required>
            </div>
        </div> <!-- / col -->
    </div> <!-- / row-->
    <div class="row mb-1">
        <div class="col-lg-12 ">
            <div class="form-group">
                <label class="d-block font-weight-semibold">Street: <span class="text-danger">*</span></label>
                <input type="number" id="Street" name="Street" class="form-control">
            </div>
        </div> <!-- / col -->
    </div> <!-- / row-->
</form>

JS

<script type="text/javascript">
    $('#Data').on('submit', function(e){
        e.preventDefault();
        var form = document.getElementById('Data');
        if (!form.checkValidity()) {
            e.preventDefault();
            e.stopPropagation();
        }
        else {
            $.ajax({
                //url: "",
                type: $('#Data').attr('method'),
                data: $('#Data').serialize(),
                //dataType: 'json',
                beforeSend: function(){ },
                success:function(response) {
                    if (response.success == true) {
                    }
                    else {
                    }
                }
            })
        }
        $('#Data').addClass('was-validated');
    });
</script>

【问题讨论】:

    标签: javascript jquery bootstrap-4


    【解决方案1】:

    为每个需要检查的字段调用 checkValidity(),而不是完整的表单:

        var formFlag = true;
    
        var nameField = document.getElementById("name");
        if (!nameField.checkValidity()) {
            nameField.classList.add("is-invalid");
            formFlag = false;
        }
    
        var lastnameField = document.getElementById("lastname");
        if (!lastnameField.checkValidity()) {
            lastnameField.classList.add("is-invalid");
            formFlag = false;
        }
    
        if (!formFlag) {
            e.preventDefault();
            e.stopPropagation();
            return;
        } else {
    

    【讨论】:

    • 我按照你的指示做了,我在 if (customField1.checkValidity() === false) 中验证了,但它一直在验证所有字段。
    • customFieldx 存根只是有关如何处理标准 HTML5 验证无法涵盖的验证的示例。由于已经在表单上调用了 checkValidity(),因此无需在此表单内的单个字段上再次调用它。如果您一次性验证整个表单,而不是让用户为每个无效字段一次又一次地按下提交,您将提供更好的用户体验。如果您无论如何都想走这条路,请不要为表单本身调用 checkValidity(),而是为每个输入字段单独调用。
    • 如果我理解,请留下customFieldx 变量不要写其他变量,只需替换getElementById,然后我将它们发送到if。不是验证整个表单,因为我只有两个必填字段,它们是唯一的,并且由于我使用Bootstrap Validation,当我点击保存时,非必填字段将它们识别为有效并标记它们绿色边框,这就是为什么我要删除该标记并仅保留两个必填字段。
    • @Alonso,我修改了答案。
    猜你喜欢
    • 2019-07-21
    • 2018-09-05
    • 1970-01-01
    • 1970-01-01
    • 2020-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-29
    相关资源
    最近更新 更多