Twitter bootstrap远程模式每次都显示相同的内容

时间:2012-09-05 16:58:23

标签: jquery jquery-plugins twitter-bootstrap modal-dialog

我正在使用Twitter bootstrap,我已经指定了一个模态

<div class="modal hide" id="modal-item">

    <div class="modal-header">
        <button type="button" class="close" data-dismiss="modal">x</button>
        <h3>Update Item</h3>
    </div>

    <form action="http://www.website.com/update" method="POST" class="form-horizontal">

    <div class="modal-body">
        Loading content...
    </div>

    <div class="modal-footer">
        <a href="#" class="btn" data-dismiss="modal">Close</a>
        <button class="btn btn-primary" type="submit">Update Item</button>
    </div>

    </form>

</div>

链接

<a href="http://www.website.com/item/1" data-target="#modal-item" data-toggle="modal">Edit 1</a>
<a href="http://www.website.com/item/2" data-target="#modal-item" data-toggle="modal">Edit 2</a>
<a href="http://www.website.com/item/3" data-target="#modal-item" data-toggle="modal">Edit 2</a>

当我第一次点击这些链接中的任何一个时,我看到了正确的内容,但当我点击其他链接时,它会显示第一次加载的相同内容,但它不会更新内容。

我希望每次点击都会更新。

P.S:我可以通过自定义jQuery函数轻松地使其工作,但我想知道它是否可以使用本机Bootstrap模式远程功能,因为它应该很容易,我想我只是让事情变得复杂。

22 个答案:

答案 0 :(得分:446)

问题是双重的。

首先,一旦Modal对象被实例化,它就会持久地附加到data-target指定的元素以及后续调用以显示该模态只会在其上调用toggle() ,但不会更新options中的值。因此,即使您的不同链接上的href属性不同,当切换模态时,remote的值也不会更新。对于大多数选项,可以通过直接编辑对象来解决这个问题。例如:

$('#myModal').data('bs.modal').options.remote = "http://website.com/item/7";

但是,在这种情况下,这不起作用,因为......

第二次,Modal插件旨在加载Modal对象的构造函数中的远程资源,遗憾的是,即使对{进行了更改也是如此{1}},永远不会重新加载

一个简单的补救措施是在后续切换之前销毁Modal对象。一种选择是在完成隐藏后将其销毁:

options.remote

注意:根据需要调整选择器。这是最一般的。

Plunker

或者您可以尝试提出一个更复杂的方案来执行某些操作,例如检查启动模式的链接是否与前一个不同。如果是,毁灭;如果不是,则无需重新加载。

答案 1 :(得分:171)

对于bootstrap 3,您应该使用:

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

答案 2 :(得分:50)

对于Bootstrap 3.1,您需要删除数据并清空modal-content而不是整个对话框(3.0),以避免在等待加载远程内容时出现闪烁。

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

如果你使用非远程模态,那么上面的代码当然会在关闭后删除它们的内容(坏)。您可能需要向这些模态添加内容(例如.local-modal类),这样它们就不会受到影响。然后将上面的代码修改为:

$(document).on("hidden.bs.modal", ".modal:not(.local-modal)", function (e) {
    $(e.target).removeData("bs.modal").find(".modal-content").empty();
});

答案 3 :(得分:30)

谢谢merv。我开始修改bootstrap.js但你的答案是一个快速而干净的解决方法。这是我最终在我的代码中使用的内容。

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

答案 4 :(得分:21)

接受的答案对我不起作用,所以我选择使用JavaScript来完成它。

<a href="/foo" class="modal-link">
<a href="/bar" class="modal-link">

<script>
$(function() {
    $(".modal-link").click(function(event) {
        event.preventDefault()
        $('#myModal').removeData("modal")
        $('#myModal').modal({remote: $(this).attr("href")})
    })
})

答案 5 :(得分:14)

这适用于Bootstrap 3 FYI

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

答案 6 :(得分:7)

我的项目是在Yii&amp;使用Bootstrap-Yii插件,所以这个答案只有在你使用Yii时才有意义。

上述修复工作确实有效,但仅在第一次显示模态之后。它第一次出现空洞。我认为那是因为在我启动代码之后,Yii调用了模态的隐藏功能,从而清除了我的启动变量。

我发现在启动模式的代码之前立即放置removeData调用就可以了。所以我的代码结构如下......

$ ("#myModal").removeData ('modal');
$ ('#myModal').modal ({remote : 'path_to_remote'});

答案 7 :(得分:5)

在Bootstrap 3.2.0中&#34; on&#34;事件必须在文档上,你必须清空模态:

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

在Bootstrap 3.1.0中&#34; on&#34;事件可以在身上:

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

答案 8 :(得分:3)

为什么不使BS 3更通用?只需使用“[something] modal”作为模态DIV的ID。

$("div[id$='modal']").on('hidden.bs.modal',
    function () {
        $(this).removeData('bs.modal');
    }
);

答案 9 :(得分:2)

对我来说,只有工作选项是:

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

我使用Bootstrap 3并且我有一个名为的函数 popup('popup content') 它附加了模态框html。

答案 10 :(得分:1)

如果提供了远程URL,则将通过jQuery的加载方法一次加载内容并将其注入.modal-content div。如果您正在使用data-api,则可以使用href属性指定远程源。这方面的一个例子如下所示

$.ajaxSetup ({
    // Disable caching of AJAX responses
    cache: false
});

答案 11 :(得分:1)

我添加了这样的内容,因为旧的内容会显示,直到出现新的内容,.modal-content中的.html('')将清除HTML内部,希望有帮助

$('#myModal').on('hidden.bs.modal', function () {
   $('#myModal').removeData('bs.modal');
   $('#myModal').find('.modal-content').html('');
});

答案 12 :(得分:1)

添加$(this).html('');清除可见数据,它工作得很好

答案 13 :(得分:0)

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

这个适合我。

答案 14 :(得分:0)

对于Bootstrap 3,在modal.js中我改变了:

$(document)
  .on('show.bs.modal',  '.modal', function () { $(document.body).addClass('modal-open') })
  .on('hidden.bs.modal', '.modal', function () { $(document.body).removeClass('modal-open'); })

$(document)
  .on('show.bs.modal',  '.modal', function () { $(document.body).addClass('modal-open') })
  .on('hidden.bs.modal', '.modal', function () { 
    $(this).removeData('bs.modal').empty()
    $(document.body).removeClass('modal-open')
  })

(为了清晰起见,增加了额外的间距)

通过调用模态容器上的empty()以及删除数据,可以防止任何不需要的旧模态内容闪存。

答案 15 :(得分:0)

这种方法对我很有用:

$("#myModal").on("show.bs.modal", function(e) {
    var link = $(e.relatedTarget);
    $(this).find(".modal-body").load(link.attr("href"));
});

答案 16 :(得分:0)

$('body').on('hidden.bs.modal', '.modal', function () {
       $("#mention Id here what you showed inside modal body").empty()
});

你想要清空哪个html元素(div,span what)。

答案 17 :(得分:0)

我写了一个处理模态刷新的简单代码片段。 基本上它将点击的链接存储在模态的数据中,并检查它是否是被点击的链接,删除或不删除模态数据。

var handleModal = function()
{
    $('.triggeringLink').click(function(event) {
        var $logsModal = $('#logsModal');
        var $triggeringLink = $logsModal.data('triggeringLink');

        event.preventDefault();

        if ($logsModal.data('modal') != undefined
            && $triggeringLink != undefined
            && !$triggeringLink.is($(this))
        ) {
            $logsModal.removeData('modal');
        }

        $logsModal.data('triggeringLink', $(this));

        $logsModal.modal({ remote: $(this).attr('href') });
        $logsModal.modal('show');
    });
};

答案 18 :(得分:0)

这个适用于我:

模态

<div class="modal fade" id="searchKaryawan" tabindex="-1" role="dialog" aria-labelledby="SearchKaryawanLabel" aria-hidden="true"> <div class="modal-dialog">
<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="SearchKaryawanLabel">Cari Karyawan</h4>
  </div>
  <div class="modal-body">
    <input type="hidden" name="location">
    <input name="cariNama" type="text" class="form-control" onkeyup="if (this.value.length > 3) cariNikNama();" />
    <div class="links-area" id="links-area"></div>
  </div>
  <div class="modal-footer">
  </div>
</div> </div></div>

脚本

<script type="text/javascript">$('body').on('hidden.bs.modal', '.modal', function () {  $(".links-area").empty() }); </script>

links-area是我放置数据并需要清除的区域

答案 19 :(得分:0)

@merv接受的答案的扩展版本。它还会检查隐藏的模态是否从远程源加载并清除旧内容以防止其闪烁。

$(document).on('hidden.bs.modal', '.modal', function () {
  var modalData = $(this).data('bs.modal');

  // Destroy modal if has remote source – don't want to destroy modals with static content.
  if (modalData && modalData.options.remote) {
    // Destroy component. Next time new component is created and loads fresh content
    $(this).removeData('bs.modal');
    // Also clear loaded content, otherwise it would flash before new one is loaded.
    $(this).find(".modal-content").empty();
  }
});

https://gist.github.com/WojtekKruszewski/ae86d7fb59879715ae1e6dd623f743c5

答案 20 :(得分:-1)

在Bootstrap版本3.3.2上测试

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

答案 21 :(得分:-4)

祝你好运:

$('#myModal').on('hidden.bs.modal', function () {
    location.reload();
});