【问题标题】:How would I populate a Bootstrap modal?我将如何填充 Bootstrap 模式?
【发布时间】:2019-08-08 16:39:34
【问题描述】:

我正在尝试学习使用 Bootstrap 和 JQuery。对于我目前的项目,我试图让用户与 Modals 进行交互。我注意到 Bootstrap 框架提供了其特定模式的使用。我必须了解如何实现这一点,直到出现这种模式。

假设我想防止一遍又一遍地添加相同的元素(我只想使用一个元素来减少重复代码),我想我想使用 JQuery 来使用单个模式并填充它在任何事件被触发。对于这个例子,我将使用按钮和点击事件。

当我单击按钮时,它应该使用单击事件中提供的 HTML 填充分配给按钮的模式。我知道有几种方法可以实现这一点,例如使用 AJAX 检索包含 HTML 的视图或使用 JQuery hide()clone()show() 函数:

$(document).ready(function() {
  //On initialization:
  //Store modal initial values so they can be reset when closed:
  let modalMediumInit = $(".modal.bs-example-modal-md").html();
  let modalLargeInit = $(".modal.bs-example-modal-lg").html();
  let modalSmallInit = $(".modal.bs-example-modal-sm").html();

  //On modal close:
  $(".modal.bs-example-modal-md").on("hidden.bs.modal", function() {
    //Reset modal to initial values:
    $(".modal.bs-example-modal-md").html(modalMediumInit);
  });
  $(".modal.bs-example-modal-lg").on("hidden.bs.modal", function() {
    //Reset modal to initial values:
    $(".modal.bs-example-modal-lg").html(modalLargeInit);
  });
  $(".modal.bs-example-modal-sm").on("hidden.bs.modal", function() {
    //Reset modal to initial values:
    $(".modal.bs-example-modal-sm").html(modalSmallInit);
  });

  $("#my-element").hide();

  //On interaction:
  $(".controls").on("click", "#my-control", function() {
    //Populate modal .modal-body element...    

    //Currently using JQuery:
    let html = $("#my-element").clone();
    $(".modal.modal.bs-example-modal-lg .modal-content .modal-body").html(html);
    $(".modal.modal.bs-example-modal-lg .modal-content .modal-body #my-element").show();

    //Or (AJAX might return some HTML and set it into the html variable):
    html = "<p>A very long string containing all my required html</p>";
    //$(".modal.modal.bs-example-modal-lg .modal-content .modal-body").html(html); //<-- Uncomment following to see effect.
  });
});
#my-element button {
  margin-top: 2px;
  margin-bottom: 2px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
<link href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet" />
<div id="my-element">
  <div class="row">
    <div class="col-xs-12">
      <button class="btn btn-primary btn-block">
        Foo
      </button>
    </div>
  </div>
  <div class="row">
    <div class="col-xs-12">
      <button class="btn btn-primary btn-block">
        Foo
      </button>
    </div>
  </div>
  <div class="row">
    <div class="col-xs-12">
      <button class="btn btn-primary btn-block">
        Foo
      </button>
    </div>
  </div>
</div>

<div class="controls">
  <button id="my-control" type="button" class="btn btn-primary" data-toggle="modal" data-target=".bs-example-modal-lg">
    Populate and open...
  </button>
</div>
<br />
<!-- Button trigger modal -->
<button type="button" class="btn btn-primary" data-toggle="modal" data-target=".bs-example-modal-md">
  Launch demo modal
</button>

<!-- Modal -->
<div class="modal bs-example-modal-md fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
  <div class="modal-dialog" role="document">
    <div class="modal-content">
      <div class="modal-header">
        <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
        <h4 class="modal-title" id="myModalLabel">Modal title</h4>
      </div>
      <div class="modal-body">
        ...
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
        <button type="button" class="btn btn-primary">Save changes</button>
      </div>
    </div>
  </div>
</div>

<!-- Large modal -->
<button type="button" class="btn btn-primary" data-toggle="modal" data-target=".bs-example-modal-lg">Large modal</button>

<div class="modal bs-example-modal-lg fade" tabindex="-1" role="dialog" aria-labelledby="myLargeModalLabel">
  <div class="modal-dialog modal-lg" role="document">
    <div class="modal-content">
      <div class="modal-header">
        <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
        <h4 class="modal-title" id="myModalLabel">Modal title</h4>
      </div>
      <div class="modal-body">
        ...
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
        <button type="button" class="btn btn-primary">Save changes</button>
      </div>
    </div>
  </div>
</div>

<!-- Small modal -->
<button type="button" class="btn btn-primary" data-toggle="modal" data-target=".bs-example-modal-sm">Small modal</button>

<div class="modal bs-example-modal-sm fade" tabindex="-1" role="dialog" aria-labelledby="mySmallModalLabel">
  <div class="modal-dialog modal-sm" role="document">
    <div class="modal-content">
      <div class="modal-header">
        <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
        <h4 class="modal-title" id="myModalLabel">Modal title</h4>
      </div>
      <div class="modal-body">
        ...
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
        <button type="button" class="btn btn-primary">Save changes</button>
      </div>
    </div>
  </div>
</div>

JSFiddle

每当我使用 JQuery 方法时,提供的用于填充模式的元素将在页面加载时加载(我注意到这个元素也会出现一小段时间,然后它会被提供的 JQuery 代码隐藏,这对我来说似乎不需要)。这会是填充 Bootstrap 模式的错误解决方案吗?我最近读了很多关于 AJAX 的文章,在这种情况下我应该利用它来将 HTML 加载到我的模态中吗?

【问题讨论】:

  • 当你写“Populate”时,你的意思是在同一个模态上显示不同的内容?
  • @A.Meshu 是的,我想为不同的事件使用相同的模态元素(不同的按钮,有自己的事件,并且可以使用相同的模态来填充所需的 HTML)。例如,按钮“foo”应该用文本“foo”填充模式,而按钮“bar”应该用文本“bar”填充模式。
  • 其实bootstrap doc提供例子:getbootstrap.com/docs/4.0/components/modal/…
  • 这也可以用于整个 HTML 元素吗? @A.Meshu 我认为/假设仅用于输入并用“少量”数据/字符串填充这些。我所说的 HTML 数量至少是我的 javascript 的 clone 方法中提供的 HTML 数量的大小。您能否提供一个示例,说明如何使用我的 HTML (#my-element) 实现这一点?
  • 我认为 Rhythm Ruparelia 回答了你的问题...

标签: javascript jquery html ajax twitter-bootstrap


【解决方案1】:

我已经修改了您的代码并创建了一个快速演示。请检查以下代码。

编辑:我添加了数据属性来传递模态大小以及要加载的内容。

$(document).ready(function() {  
	//On initialization:
  //Store modal initial values so they can be reset when closed:
  let modalContentInit = $(".bs-example-modal-md .modal-body").html();
  
  //On modal close:
  $(".modal.bs-example-modal-md").on("hidden.bs.modal", function () {
    //Reset modal to initial values:
    $("#myModal .modal-body").html(modalContentInit);
    $('#myModal .modal-dialog').attr('class','modal-dialog');
  });
  
  $('#myModal').on('show.bs.modal',function(e){
    var button = $(e.relatedTarget);
    var modalContentClass = button.data('content');
    var modalSize = button.data('size') ? ' modal-' + button.data('size') : '';
    $('#myModal .modal-dialog').attr('class','modal-dialog' + modalSize);
    $('#myModal .modal-body').html($(modalContentClass).clone());
    $('#myModal .modal-body ' + modalContentClass).removeClass('hide');
  });
  
});
.my-element button {
  margin-top: 2px;
  margin-bottom: 2px;
}
<link href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet"/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
<div class="my-element my-element-foo hide">
  <div class="row">
    <div class="col-xs-12">
      <button class="btn btn-primary btn-block">
        Foo
      </button>
    </div>
  </div>
  <div class="row">
    <div class="col-xs-12">
      <button class="btn btn-primary btn-block">
        Foo
      </button>
    </div>
  </div>
  <div class="row">
    <div class="col-xs-12">
      <button class="btn btn-primary btn-block">
        Foo
      </button>
    </div>
  </div>
</div>

<div class="my-element my-element-bar hide">
  <div class="row">
    <div class="col-xs-12">
      <button class="btn btn-primary btn-block">
        Bar
      </button>
    </div>
  </div>
  <div class="row">
    <div class="col-xs-12">
      <button class="btn btn-primary btn-block">
        Bar
      </button>
    </div>
  </div>
  <div class="row">
    <div class="col-xs-12">
      <button class="btn btn-primary btn-block">
        Bar
      </button>
    </div>
  </div>
</div>

<!-- Button trigger modal -->
<button type="button" class="btn btn-primary" data-toggle="modal" data-target="#myModal" data-content=".my-element-foo">
  Modal 1
</button>

<button type="button" class="btn btn-primary" data-toggle="modal" data-target="#myModal" data-content=".my-element-foo" data-size="sm">
  Modal 1 small
</button>

<button type="button" class="btn btn-primary" data-toggle="modal" data-target="#myModal" data-content=".my-element-foo" data-size="lg">
  Modal 1 large
</button>

<button type="button" class="btn btn-primary" data-toggle="modal" data-target="#myModal" data-content=".my-element-bar">
  Modal 2
</button>

<!-- Modal -->
<div class="modal bs-example-modal-md fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
  <div class="modal-dialog" role="document">
    <div class="modal-content">
      <div class="modal-header">
        <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
        <h4 class="modal-title" id="myModalLabel">Modal title</h4>
      </div>
      <div class="modal-body">
        ...
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
        <button type="button" class="btn btn-primary">Save changes</button>
      </div>
    </div>
  </div>
</div>

【讨论】:

  • 这不是基本相同,只是您使用hide 类而不是jquery 的show() 和/或hide() 并利用数据属性将内容链接到按钮?
  • @Barrosy 是的,这与您的代码基本相同,但我修改了您的演示代码中不起作用的内容。您的代码中发生的情况是,当您单击填充并打开时,数据会填充到所有模式中,但是当您关闭该模式时,它具有相同的 modal-lg 类,它再次将数据设置为初始数据,因此您在所有模态中都有初始数据。
  • 我的问题不是“重置”部分,而是“在模式中加载 HTML”部分。我打算填充所有模态,因为模态不知道将使用哪种大小,只有 javascript 应该告诉。我觉得我的问题可能太具体了。
  • @Barrosy 我已经更新了答案以加载不同的内容,并在数据属性中传递所需的大小,所有这些都在同一个模式中。如果这能解决您的问题,请告诉我。
  • @Barrosy 您的方法也适用于填充数据。我使用了data-* 属性,因为它是Bootstrap docs example 中的建议方法。
猜你喜欢
  • 2017-05-30
  • 1970-01-01
  • 1970-01-01
  • 2017-04-01
  • 1970-01-01
  • 2013-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多