显示时将相同的 HTML 表单元素插入到多个模式中,但验证不起作用

Posted

技术标签:

【中文标题】显示时将相同的 HTML 表单元素插入到多个模式中,但验证不起作用【英文标题】:Inserting the same HTML Form element into multiple modals when shown, but validation doesn't work 【发布时间】:2019-01-29 22:46:54 【问题描述】:

我正在使用 html5、CSS3、Bootstrap 4 和 jQuery 开发一个单页网站。我还使用jQuery Form Validator 进行表单验证。

问题是我有几个具有不同文本内容的 Bootstrap 模式,它们的正文中必须包含相同的表单:

<div id="modal-1" class="modal fade my-modal" role="dialog" tabindex="-1">
    <div class="modal-dialog modal-lg" role="document">
        <div class="modal-content">
            <div class="modal-header">
                <h5>MODAL TITLE 1</h5> 
            </div>
            <div class="modal-body">
                <p>MODAL CONTENT 1</p>

                <div class="form-container">
                    <!-- SAME FORM FOR ALL MODALS -->
                    <form id="myForm-1" action="">
                    ...
                    </form>
                </div>
            </div>
        </div>
    </div>
</div>
...
<div id="modal-n" class="modal fade my-modal" role="dialog" tabindex="-1">
    <div class="modal-dialog modal-lg" role="document">
        <div class="modal-content">
            <div class="modal-header">
                <h5>MODAL TITLE N</h5> 
            </div>
            <div class="modal-body">
                <p>MODAL CONTENT N</p>

                <div class="form-container">
                    <!-- SAME FORM FOR ALL MODALS -->
                    <form id="myForm-n" action="">
                    ...
                    </form>
                </div>
            </div>
        </div>
    </div>
</div>

我找到了一个非常适合在使用 jQuery 显示模态时插入表单的解决方案,但是表单验证根本不起作用:

var $myForm = $("<form id="myForm" action="">...</form>");

$(".my-modal").on('show.bs.modal', function (event)     
    $(this).find(".form-container").append($myForm);
);

这是 jQuery 验证代码:

$.validate(
    form: "#myForm",
    modules: "file",
    borderColorOnError: ""
);

有没有办法只使用 jQuery 让它工作? 我打算使用 Laravel 来支持多语言,使用 Blade Template 来实现是否更好? 或者其他类型的 javascript 模板引擎,例如 Mustache、Handlebars...?

感谢您的回复。

ps:我是一名 Java Spring 开发人员,我是 Laravel 的新手。

【问题讨论】:

【参考方案1】:

有没有办法只使用 jQuery 让它工作?

当然!问题是 #myForm 在解析 $.validate( 时不存在。所以我建议你让它存在......通过放在身体里。

<div id="modal-1" class="modal fade my-modal" role="dialog" tabindex="-1">
  <div class="modal-dialog modal-lg" role="document">
    <div class="modal-content">
      <div class="modal-header">
        <h5>MODAL TITLE 1</h5> 
      </div>
      <div class="modal-body">
        <p>MODAL CONTENT 1</p>

        <div class="form-container">
          <!-- SAME FORM FOR ALL MODALS -->
          <form id="myForm-1" action="">
            ...
          </form>
        </div>
      </div>
    </div>
  </div>
</div>
...
<div id="modal-n" class="modal fade my-modal" role="dialog" tabindex="-1">
  <div class="modal-dialog modal-lg" role="document">
    <div class="modal-content">
      <div class="modal-header">
        <h5>MODAL TITLE N</h5> 
      </div>
      <div class="modal-body">
        <p>MODAL CONTENT N</p>

        <div class="form-container">
          <!-- SAME FORM FOR ALL MODALS -->
          <form id="myForm-n" action="">
            ...
          </form>
        </div>
      </div>
    </div>
  </div>
</div>

<form id="myForm" action="">...</form>

只需用 CSS 隐藏它:

#myForm
  display:none;

然后将您的表单“移动”到模式中。

$(".my-modal").on('show.bs.modal', function (event)     
  $(this).find(".form-container").append($("#myForm").show());
);

【讨论】:

感谢您的回复 Louys,您的解决方案看起来很棒,show() 函数是否会使表单同时显示在模态和正文中?只是在测试之前询问。 它只会在模态中显示...因为表单会随意移动到那里。这不是重复的形式。

以上是关于显示时将相同的 HTML 表单元素插入到多个模式中,但验证不起作用的主要内容,如果未能解决你的问题,请参考以下文章

使用 NodeJS Express 时将表单数据插入 MySQL 数据库

如何处理多个页面或表单

jQuery序列化表单时将制定元素排除在外

表单自动仅提交一次并重新加载相同的页面

如何在插入数据时将多行选择的 id 传递到打印页面

如何在 HTML 表单的占位符元素中插入 jQuery 字符串