Twitter bootstrap remote modal shows same content every time
我正在使用Twitter引导程序,我指定了一个模式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <button type="button" class="close" data-dismiss="modal">x</button> Update Item <form action="http://www.website.com/update" method="POST" class="form-horizontal"> Loading content... Close <button class="btn btn-primary" type="submit">Update Item</button> </form> |
以及链接
1 2 3 | Edit 1 Edit 2 Edit 2 |
当我第一次点击这些链接时,我会看到正确的内容,但当我点击其他链接时,它会显示第一次加载的相同内容,不会更新内容。
我希望它每次点击时都能更新。
P.S:我可以通过自定义jquery函数很容易地使它工作,但是我想知道是否可以使用本地引导模式远程函数,因为它应该足够简单,我想我只是把事情复杂化了。
问题是双重的。
首先,一旦一个modal对象被实例化,它就会持续地附加到
1 | $('#myModal').data('bs.modal').options.remote ="http://website.com/item/7"; |
但是,在这种情况下,这是行不通的,因为…
第二,modal插件被设计为在modal对象的构造函数中加载远程资源,这意味着即使对
一个简单的补救方法是在随后的切换之前销毁模式对象。一种选择是在它完成隐藏后销毁它:
1 2 3 | $('body').on('hidden.bs.modal', '.modal', function () { $(this).removeData('bs.modal'); }); |
注:根据需要调整选择器。这是最一般的。
柱塞或者你可以尝试提出一个更复杂的方案来做一些事情,比如检查启动模式的链接是否与前一个不同。如果是,销毁;如果不是,则无需重新加载。
对于引导程序3,您应该使用:
1 2 3 | $('body').on('hidden.bs.modal', '.modal', function () { $(this).removeData('bs.modal'); }); |
对于bootstrap 3.1,您需要删除数据并清空
1 2 3 | $(document).on("hidden.bs.modal", function (e) { $(e.target).removeData("bs.modal").find(".modal-content").empty(); }); |
如果您使用的是非远程模式,那么上述代码当然会在关闭后删除它们的内容(坏)。你可能需要在这些模态中添加一些东西(比如
1 2 3 | $(document).on("hidden.bs.modal",".modal:not(.local-modal)", function (e) { $(e.target).removeData("bs.modal").find(".modal-content").empty(); }); |
谢谢。我开始对boosttrap.js进行修补,但您的答案是快速而干净的解决方案。下面是我在代码中使用的代码。
1 2 3 | $('#modal-item').on('hidden', function() { $(this).removeData('modal'); }); |
接受的答案对我不起作用,所以我用JavaScript来做。
1 2 3 4 5 6 7 | $(function() { $(".modal-link").click(function(event) { event.preventDefault() $('#myModal').removeData("modal") $('#myModal').modal({remote: $(this).attr("href")}) }) }) |
这与引导程序3 Fyi一起工作
1 2 3 | $('#myModal').on('hidden.bs.modal', function () { $(this).removeData('bs.modal'); }); |
我的项目是内置的yii&;使用bootstrap yii插件,因此只有在使用yii时,此答案才相关。
上面的修正方法确实有效,但只是在第一次显示模态之后。第一次空出来的时候。我认为这是因为在我启动代码后,yii调用了模式的hide函数,从而清除了我的启动变量。
我发现,将removedata调用放在启动模式的代码之前就完成了这个技巧。所以我的代码结构是这样的…
1 2 | $ ("#myModal").removeData ('modal'); $ ('#myModal').modal ({remote : 'path_to_remote'}); |
在bootstrap 3.2.0中,"on"事件必须在文档上,并且必须清空模式:
1 2 3 | $(document).on("hidden.bs.modal", function (e) { $(e.target).removeData("bs.modal").find(".modal-content").empty(); }); |
在bootstrap 3.1.0中,"on"事件可以在主体上:
1 2 3 | $('body').on('hidden.bs.modal', '.modal', function () { $(this).removeData('bs.modal'); }); |
为什么不在BS 3中更通用呢?只需使用"[something]modal"作为modal div的ID。
1 2 3 4 5 | $("div[id$='modal']").on('hidden.bs.modal', function () { $(this).removeData('bs.modal'); } ); |
我唯一的工作选择是:
1 2 3 | $('body').on('hidden.bs.modal', '#modalBox', function () { $(this).remove(); }); |
我使用bootstrap 3,我有一个函数
添加一个$(this).html("");来清除可见数据,而且效果非常好
如果提供了远程URL,内容将通过jquery的加载方法加载一次,并注入到.modal content div中。如果使用的是数据API,则可以使用href属性指定远程源。下面是一个例子
1 2 3 4 | $.ajaxSetup ({ // Disable caching of AJAX responses cache: false }); |
我添加了类似这样的内容,因为在新内容出现之前会显示旧内容,其中包含.html("")。模式内容将清除其中的html,希望它有帮助。
1 2 3 4 | $('#myModal').on('hidden.bs.modal', function () { $('#myModal').removeData('bs.modal'); $('#myModal').find('.modal-content').html(''); }); |
@merv接受答案的扩展版本。它还检查正在隐藏的模式是否从远程源加载,并清除旧内容以防止其闪烁。
1 2 3 4 5 6 7 8 9 10 11 | $(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
1 2 3 | $('#myModal').on('hidden.bs.modal', function () { $(this).removeData('modal'); }); |
这个对我有用。
另一种方法对我很有效:
1 2 3 4 | $("#myModal").on("show.bs.modal", function(e) { var link = $(e.relatedTarget); $(this).find(".modal-body").load(link.attr("href")); }); |
1 2 3 | $('body').on('hidden.bs.modal', '.modal', function () { $("#mention Id here what you showed inside modal body").empty() }); |
您想清空哪个HTML元素,比如(DIV,SPAN随便什么)。
我写了一个简单的片段来处理模式的刷新。基本上,它将单击的链接存储在模式数据中,并检查它是否与已单击的链接相同,删除或不删除模式数据。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | 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'); }); }; |
这个适合我:
情态动词
1 2 3 4 5 6 | <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button> <h4 class="modal-title" id="SearchKaryawanLabel">Cari Karyawan</h4> <input type="hidden" name="location"> <input name="cariNama" type="text" class="form-control" onkeyup="if (this.value.length > 3) cariNikNama();" /> |
脚本
1 | <script type="text/javascript">$('body').on('hidden.bs.modal', '.modal', function () { $(".links-area").empty() }); |
链接区域是我放置数据并需要清除的区域
对于引导程序3,在modal.js中,我更改了:
1 2 3 | $(document) .on('show.bs.modal', '.modal', function () { $(document.body).addClass('modal-open') }) .on('hidden.bs.modal', '.modal', function () { $(document.body).removeClass('modal-open'); }) |
到
1 2 3 4 5 6 | $(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()以及删除数据来防止旧模式内容的任何不需要的闪存。
在引导程序版本3.3.2上测试
1 2 3 | $('#myModal').on('hide.bs.modal', function() { $(this).removeData(); }); |
祝你好运:
1 2 3 | $('#myModal').on('hidden.bs.modal', function () { location.reload(); }); |