重新加载模式内容(Twitter引导程序)


98

我正在使用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 Bootstrap模式弹出窗口中刷新或重置Ajax加载的内容?



发生了相同的问题,并习惯了相同的解决方案。由于某种奇怪的原因,我求助于jquery的.attr()函数。data()函数无法正常工作。
user1803784 '16

Answers:


98

我遇到了同样的问题,我想这样做的方法是删除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"); 
    });
});

稍后将尝试并发表评论。


16
$('。modal')。on('hidden',function(){$(this).removeData();})这是我对以下解决方案的修改...清洁器,因为您不必抓住点击并加载它是否可以使您自己编程程序模型仍然有效
Carter Cole

1
我正在使用Bootstrap 3,模态中的内容每次都会刷新,但是会创建两个模态窗口。有人知道吗?
B先生

1
嗨,席德,您使用类“ modal-body”创建了2个div,实际上您已经在创建它,并且模态正在重新创建。从该代码中删除“ .modal-body”,它应该可以正常工作。
Palantir

1
对于Bootstrap 3而言,它对我有用,非常令人沮丧的是,默认情况下,核心Bootstrap库不支持此功能。
乔什·迪尔

@markz,我也在使用类似这样的东西和ev.preventDefault(); 同样,但是仍然单击链接,当我得到模态窗口时,我所有页面的下拉菜单都被重置。任何想法,如何预防?
Jaikrat 2014年

72

要在模式关闭时卸载数据,可以在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');
});

完善。工作没有任何问题。在引导程序3中。
Thupten 2013年

4
不完美:它会在新内容之前简短地显示旧内容。
洛朗

3
@Laurent,您可以通过添加.html('')清除以前的内容。因此,对于2.x:$(this).removeData('modal')。find('。modal-body')。html('')。对于3:$(this).removeData('bs.modal')。html('')2.x将内容加载到.modal-body中,而3将内容直接加载到.modal容器中
nabrown

在引导程序v3中,对最后评论的小修正应为:$(e.target).removeData('bs.modal')。html(''); 到目前为止,这是最优雅的解决方案(但会稍有延迟)。
Cesc

我使用了@Softlion在此建议的解决方案中发布的编辑/版本-它起作用,并且我没有遇到任何速度/延迟问题。
user1801810

21

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

this.$element.removeData()

或使用事件监听器

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

4
-1将第一个代码片段直接放入Modal插件的想法是一个糟糕的想法。如果您打算破解插件(我会避免),那么更合理的做法是将load()调用移出构造函数并移至中show(),或者向插件添加方法以手动触发的重新加载remote。关于第二个建议,我只是作为一个问题的答案提供了一个明确要求不要按照@markz建议的方式进行操作的问题
Merv 2012年

2
我喜欢听众的方法。我认为甚至可以使用'.modal'而非'#modal'进行改进,以避免对ID进行硬编码。在我看来,这是一种比markz更为简洁的方法,因为您像在原始引导程序模式中一样继续使用数据切换。
Toni Grimalt

我想知道为什么这个答案没有太多支持。这个答案似乎是第一个建议事件监听器的事件,它非常有趣并且可以快速实现。
阿努帕姆

15

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

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

1
是的,但是此解决方案仍然存在严重的滞后;它仍会在新内容之前的一两秒钟内显示旧内容。
doc假日

而不是#modal try body
wobsoriano

8

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

我需要调整代码以使其正常工作,因为简单地调用.html会擦除整个内容,而在执行此操作后,模式将不会加载任何内容。因此,我只是在寻找模态的内容区域,然后在此处应用HTML的重置。

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

仍然可能会接受公认的答案,因为我刚好在模态加载之前出现了一些丑陋的跳转,因为控件使用的是Bootstrap。


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>

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空修复了该值。


2

这是为我工作的咖啡版本。

$(document).on 'hidden.bs.modal', (e) ->
  target = $(e.target)
  target.removeData('bs.modal').find(".modal-content").html('')

它解决了一个内容重新加载但模态内的js无法第二次执行的问题
Souhaieb

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>


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>

希望这对您有用。


1

您可以尝试以下方法:

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

0

我希望在模式关闭时删除AJAX加载的内容,因此我调整了其他人建议的行(咖啡语法):

$('#my-modal').on 'hidden.bs.modal', (event) ->
  $(this).removeData('bs.modal').children().remove()


0

步骤1:为名为的模式创建包装器clone-modal-wrapper

第2步:创建一个名为的空白div 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');
});
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.