100

我正在使用 twitter bootstrap 的模态弹出窗口。

<div id="myModal" class="modal hide fade in">
    <div class="modal-header">
        <a class="close" data-dismiss="modal">×</a>
        <h3>Header</h3>
    </div>
    <div class="modal-body"></div>
    <div class="modal-footer">
        <input type="submit" class="btn btn-success" value="Save"/>
    </div>
</div>

我可以使用带有此 a 元素的 ajax 加载内容:

<a data-toggle="modal" data-target="#myModal" href="edit.aspx">Open modal</a>

现在我必须打开相同的模式,但使用不同的 url。我正在使用此模式从我的数据库中编辑一个实体。因此,当我在实体上单击编辑时,我需要加载带有 ID 的模式。

<a data-toggle="modal" data-target="#myModal" href="edit.aspx?id=1">Open modal</a>
<a data-toggle="modal" data-target="#myModal" href="edit.aspx?id=2">Open modal</a>
<a data-toggle="modal" data-target="#myModal" href="edit.aspx?id=3">Open modal</a>

如果我单击链接号 1,它工作正常。但是,如果我然后单击链接号 2,则模式内容已经加载,因此它将显示链接号 1 中的内容。

如何在 twitter 引导模式弹出窗口中刷新或重置 ajax 加载的内容?

4

14 回答 14

100

我遇到了同样的问题,我想这样做的方法是删除 data-toggle 属性并为链接提供一个自定义处理程序。

类似的东西:

$("a[data-target=#myModal]").click(function(ev) {
    ev.preventDefault();
    var target = $(this).attr("href");

    // load the url and show modal on success
    $("#myModal .modal-body").load(target, function() { 
         $("#myModal").modal("show"); 
    });
});

稍后将尝试并发表评论。

于 2012-09-20T12:56:30.717 回答
73

要在模式关闭时卸载数据,您可以将其与 Bootstrap 2.x 一起使用:

$('#myModal').on('hidden', function() {
    $(this).removeData('modal');
});

在 Bootstrap 3 ( https://github.com/twbs/bootstrap/pull/7935#issuecomment-18513516 ) 中:

$(document.body).on('hidden.bs.modal', function () {
    $('#myModal').removeData('bs.modal')
});

//Edit SL: more universal
$(document).on('hidden.bs.modal', function (e) {
    $(e.target).removeData('bs.modal');
});
于 2013-08-27T07:16:01.233 回答
21

您可以通过在 Modal 插件的 hide 方法末尾添加此行来强制 Modal 刷新弹出窗口(如果您使用的是 bootstrap-transition.js v2.1.1,它应该在第 836 行)

this.$element.removeData()

或者使用事件监听器

$('#modal').on('hidden', function() {
    $(this).data('modal').$element.removeData();
})
于 2012-09-22T22:49:12.847 回答
15

使用 Bootstrap 3,您可以使用 'hidden.bs.modal' 事件处理程序来删除任何与模式相关的数据,从而强制下次重新加载弹出窗口:

$('#modal').on('hidden.bs.modal', function() {
    $(this).removeData('bs.modal');
});
于 2013-12-12T04:10:17.947 回答
8

基于其他答案(谢谢大家)。

我需要调整代码以使其正常工作,因为只需调用 .html 即可擦除整个内容,并且在我执行此操作后模态不会加载任何内容。所以我只是寻找模式的内容区域并在那里应用了 HTML 的重置。

    $(document).on('hidden.bs.modal', function (e) {
        var target = $(e.target);
        target.removeData('bs.modal')
              .find(".modal-content").html('');
    });

仍然可能会接受公认的答案,因为我在模态加载之前得到了一些难看的跳跃,因为控件是使用 Bootstrap 进行的。

于 2014-07-28T19:14:03.123 回答
5

比上面接受的示例更压缩。从当前单击的任何带有 data-toggle=modal 的数据目标中获取目标。这使得您不必知道目标模式的 id 是什么,只需重用同一个!更少的代码=赢!如果你愿意,你也可以修改它来为你的模态加载标题、标签和按钮。

 $("[data-toggle=modal]").click(function(ev) {
    ev.preventDefault();
    // load the url and show modal on success
    $( $(this).attr('data-target') + " .modal-body").load($(this).attr("href"), function() { 
         $($(this).attr('data-target')).modal("show"); 
    });
});

示例链接:

<a data-toggle="modal" href="/page/api?package=herp" data-target="#modal">click me</a>
<a data-toggle="modal" href="/page/api?package=derp" data-target="#modal">click me2</a>
<a data-toggle="modal" href="/page/api?package=merp" data-target="#modal">click me3</a>
于 2013-01-12T07:02:16.560 回答
3

我对Softlion的回答做了一个小改动,所以我所有的模态都不会在隐藏时刷新。具有 data-refresh='true' 属性的模态仅刷新,其他的照常工作。这是修改后的版本。

$(document).on('hidden.bs.modal', function (e) {
    if ($(e.target).attr('data-refresh') == 'true') {
        // Remove modal data
        $(e.target).removeData('bs.modal');
        // Empty the HTML of modal
        $(e.target).html('');
    }
});

现在使用如下所示的属性,

<div class="modal fade" data-refresh="true" id="#modal" tabindex="-1" role="dialog" aria-labelledby="#modal-label" aria-hidden="true"></div>

这将确保仅刷新 data-refresh='true' 的模式。而且我还在重置模态 html,因为旧值会一直显示,直到新值被加载,从而使 html 为空修复了该值。

于 2013-10-24T12:10:14.847 回答
2

这是一个对我有用的咖啡脚本版本。

$(document).on 'hidden.bs.modal', (e) ->
  target = $(e.target)
  target.removeData('bs.modal').find(".modal-content").html('')
于 2014-10-01T14:26:29.423 回答
1

它适用于所有版本的 twitterbootstrap

Javascript代码:

<script type="text/javascript">
/* <![CDATA[ */
(function(){
   var bsModal = null;
   $("[data-toggle=modal]").click(function(e) {
      e.preventDefault();
      var trgId = $(this).attr('data-target'); 
      if ( bsModal == null ) 
       bsModal = $(trgId).modal;
      $.fn.bsModal = bsModal;
      $(trgId + " .modal-body").load($(this).attr("href"));
      $(trgId).bsModal('show');
    });
 })();
/* <![CDATA[ */
</script>

模态链接是

<a data-toggle="modal" data-target="#myModal" href="edit1.aspx">Open modal 1</a>
<a data-toggle="modal" data-target="#myModal" href="edit2.aspx">Open modal 2</a>
<a data-toggle="modal" data-target="#myModal" href="edit3.aspx">Open modal 3</a>

弹出模态

<div id="myModal" class="modal hide fade in">
<div class="modal-header">
    <a class="close" data-dismiss="modal">×</a>
    <h3>Header</h3>
</div>
<div class="modal-body"></div>
<div class="modal-footer">
    <input type="submit" class="btn btn-success" value="Save"/>
</div>

于 2013-09-26T13:50:10.617 回答
1

我也被困在这个问题上,然后我看到模态的id是相同的。如果您想要多个模态,则需要不同的模态ID 。我使用了动态id。这是我的代码haml

.modal.hide.fade{"id"=> discount.id,"aria-hidden" => "true", "aria-labelledby" => "myModalLabel", :role => "dialog", :tabindex => "-1"}

你可以这样做

<div id="<%= some.id %>" class="modal hide fade in">
  <div class="modal-header">
    <a class="close" data-dismiss="modal">×</a>
    <h3>Header</h3>
  </div>
  <div class="modal-body"></div>
  <div class="modal-footer">
    <input type="submit" class="btn btn-success" value="Save" />
  </div>
</div>

你的模态链接将是

<a data-toggle="modal" data-target="#" href='"#"+<%= some.id %>' >Open modal</a>
<a data-toggle="modal" data-target="#myModal" href='"#"+<%= some.id %>' >Open modal</a>
<a data-toggle="modal" data-target="#myModal" href='"#"+<%= some.id %>' >Open modal</a>

我希望这对你有用。

于 2013-01-15T12:45:40.083 回答
1

你可以试试这个:

$('#modal').on('hidden.bs.modal', function() {
    $(this).removeData('bs.modal');
});
于 2017-12-04T15:22:38.470 回答
0

我希望在模态关闭时删除 AJAX 加载的内容,所以我调整了其他人建议的行(coffeescript 语法):

$('#my-modal').on 'hidden.bs.modal', (event) ->
  $(this).removeData('bs.modal').children().remove()
于 2014-01-20T21:36:27.787 回答
0

第 1 步:为名为clone-modal-wrapper.

第 2 步:创建一个名为modal-wrapper.

第 3 步:将模态元素从 复制clone-modal-wrappermodal-wrapper

第4步:切换模式modal-wrapper

<a data-toggle="modal" class='my-modal'>Open modal</a>

<div class="clone-modal-wrapper">
   <div class='my-modal' class="modal fade">
      <div class="modal-dialog">
         <div class="modal-content">
            <div class="modal-header">
               <a class="close" data-dismiss="modal">×</a>
               <h3>Header</h3>
            </div>
            <div class="modal-body"></div>
            <div class="modal-footer">
               <input type="submit" class="btn btn-success" value="Save"/>
            </div>
         </div>
      </div>
   </div>
</div>

<div class="modal-wrapper"></div>


$("a[data-target=#myModal]").click(function (e) {
    e.preventDefault();
    $(".modal-wrapper").html($(".clone-modal-wrapper").html());
    $('.modal-wrapper').find('.my-modal').modal('toggle');
});
于 2020-05-24T13:26:59.303 回答
0

var $table = $('#myTable2');
$table.bootstrapTable('destroy');

为我工作

于 2019-01-12T08:16:02.713 回答