【问题标题】:Open Bootstrap modal clicking auto generated element打开引导模式单击自动生成的元素
【发布时间】:2019-04-07 12:11:06
【问题描述】:

我在使用 Javascript 生成的元素打开 Bootstrap 4 模式时遇到问题。 有两张非常相似的卡片(相同但具有不同的 ID)。首先是在 html doc 中硬编码(并且可以正常工作)。另一个是由简单的 JS 脚本生成的。我尝试使用相同的类名“openEditModal”,但它不起作用。然后我为两者声明了“数据切换”“数据目标”属性,但仍然只能使用硬编码卡。 Bootstrap JS 文件是否有可能仅适用于硬编码元素?

HTML 编码卡

<div class="row" id="all-contacts-box">
        <!-- ____EXIST_ADDRESSES____ -->
        <!-- addressBoxWrapper -->
        <div class="col-xl-3 col-md-4 col-sm-6 col-12 mt-2 d-flex">
            <!-- addressBox -->
            <div class="card bg-light openEditModal label flex-fill">
                <!--contactHeader-->
                <div class="card-header pl-2 pt-1 font-weight-bold text-muted label-title">
                    Office Address
                </div>
                <!-- contactBody -->
                <div class="card-body row pt-0">
                    <!-- contactBodyLeft -->
                    <div class="col-4 d-flex justify-content-center align-items-center maps-pin">
                        <i class="fas fa-map-marker-alt"></i>
                    </div>
                    <!-- contactBodyRight -->
                    <div class="col-8">
                        <h4 class="label-title font-weight-bold">Main Name</h4>
                        <h5 class="label-address font-weight-normal">Street 22</h5>
                        <h5 class="label-address font-weight-normal">City, Country</h5>
                    </div>
                </div>
            </div>
        </div>

生成新卡片的部分JS代码

var createContactBox = function(dataToDisplay, idCounter) {
  var mainAddressContainer = document.getElementById("all-contacts-box");
  var addNewBox = document.getElementById("add-new-box");

  var addressBoxWrapper = document.createElement("div");
  var addressBox = document.createElement("div");

  mainAddressContainer.insertBefore(addressBoxWrapper, addNewBox);

  addressBoxWrapper.appendChild(addressBox);
  addressBoxWrapper.classList = "col-xl-3 col-md-4 col-sm-6 col-12 mt-2 d- 
 flex";
  addressBox.classList = "card bg-light openEditModal label flex-fill";

  addressBox.setAttribute("data-toggle", "modal");
  addressBox.setAttribute("data-target", "editBoxModal");
};

 $(".openEditModal").click(function() {
   $("#editBoxModal").modal();
 });

【问题讨论】:

  • 如何移动'addressBoxWrapper.appendChild(addressBox);'成为 createContactBox 函数中的最后一个?
  • 很遗憾你的小费不起作用:(
  • 你能给我一个小提琴吗? jsfiddle/codepen?
  • 好的,这是一个网址link

标签: javascript bootstrap-modal


【解决方案1】:

动态创建元素的问题在于,它们与现有元素的事件处理程序不同。

为了修复它,您需要在添加动态元素后“刷新”侦听器。

所以我将事件处理程序添加到一个函数中,并在我打开它之前将其关闭(类似于重新启动)。如果你不关闭它,该事件将触发多次调用此函数,并且你不想要它。

function refreshEvents() {
  $(".openEditModal").off();
  $("#add-new-box").off();

  $(".openEditModal").click(function() {
    $("#editBoxModal").modal();
  });

  $("#add-new-box").click(function() {
    $("#addNewBoxModal").modal();
  });
}

现在您可以在创建另一个元素时调用此函数。 所以我在你创建元素后调用它。

这是一个有效的fiddle

【讨论】:

  • 这段代码很好用,但现在我遇到了另一个问题。我发送了应用程序的一部分,它适用于这个小部分,但我不知道如何在完整的项目中使用它。这是完成项目link的链接。
  • 我的意思是我在完整的应用程序中使用了这段代码,但有两种类型的自动生成的卡片。 Firs 由启动时初始化的函数生成,此卡的数据来自硬编码数组。第二种类型是用户添加的卡片 - 使用“#addNewBoxModal”模式。将数据传递到此模式后,我可以自己创建新框,但这是我的主要问题。我不知道如何对我添加的所有卡片实现“刷新事件”功能。 (我在数组卡上实现了“refreshEvents”,效果非常好)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-24
  • 1970-01-01
  • 1970-01-01
  • 2015-03-08
  • 1970-01-01
  • 2016-05-18
  • 2018-08-17
相关资源
最近更新 更多