Twitter bootstrap remote modal показывает один и тот же контент каждый раз
Я использую 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, но я хочу знать, если это возможно с родной загрузочной модальной удаленной функцией, так как это должно быть достаточно легко, и я думаю, что я просто усложняю вещи.
22 ответов
проблема двоякая.
первый, после создания экземпляра модального объекта он постоянно присоединяется к элементу, указанному data-target
и последующие вызовы, чтобы показать, что modal будет вызывать только toggle()
на нем, но не будет обновлять значения в options
. Итак, хотя href
атрибуты отличаются на разных ссылках, когда модальный переключается, значение для remote
не обновляются. Для большинства вариантов можно обойти это прямое редактирование объекта. Например:
$('#myModal').data('bs.modal').options.remote = "http://website.com/item/7";
однако в этом случае это не сработает, потому что...
второй, модальный плагин предназначен для загрузки удаленного ресурса в конструкторе модального объекта, что, к сожалению, означает, что даже если изменение сделано в options.remote
, он никогда не будет перезагружен.
простое средство состоит в том, чтобы уничтожить модальный объект перед последующими переключениями. Один вариант-просто уничтожить его после того, как он закончит скрываться:
$('body').on('hidden.bs.modal', '.modal', function () {
$(this).removeData('bs.modal');
});
Примечание: настройки селекторов по мере необходимости. Это самое общее.
Plunker
или вы можете попробовать придумать более сложную схему, чтобы сделать что-то вроде проверки, отличается ли ссылка, запускающая модальный, от предыдущей. Если это так, уничтожьте; если нет, тогда не нужно перезаряжать.
для Bootstrap 3, Вы должны использовать:
$('body').on('hidden.bs.modal', '.modal', function () {
$(this).removeData('bs.modal');
});
для 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
class), поэтому они не затронуты. Затем измените приведенный выше код на:
$(document).on("hidden.bs.modal", ".modal:not(.local-modal)", function (e) {
$(e.target).removeData("bs.modal").find(".modal-content").empty();
});
спасибо Мерв. Я начал мастерить вокруг boostrap.js, но ваш ответ-быстрый и чистый обходной путь. Вот что я использовал в своем коде.
$('#modal-item').on('hidden', function() {
$(this).removeData('modal');
});
принятый ответ не работа для меня, поэтому я пошел с 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")})
})
})
это работает с Bootstrap 3 FYI
$('#myModal').on('hidden.bs.modal', function () {
$(this).removeData('bs.modal');
});
мой проект построен в Yii и использует плагин Bootstrap-Yii, поэтому этот ответ актуален только в том случае, если вы используете Yii.
вышеуказанное исправление сработало, но только после первого показа модального. В первый раз он оказался пустым. Я думаю, это потому, что после моего инициирования кода Yii вызывает функцию hide модального, тем самым очищая мои переменные инициации.
Я обнаружил, что размещение вызова removeData непосредственно перед кодом, который запустил модал сделал трюк. Итак, мой код структурирован следующим образом...
$ ("#myModal").removeData ('modal');
$ ('#myModal').modal ({remote : 'path_to_remote'});
в Bootstrap 3.2.0 событие " on " должно быть в документе, и вы должны очистить модальное :
$(document).on("hidden.bs.modal", function (e) {
$(e.target).removeData("bs.modal").find(".modal-content").empty();
});
в Bootstrap 3.1.0 событие" on " может быть на теле:
$('body').on('hidden.bs.modal', '.modal', function () {
$(this).removeData('bs.modal');
});
почему бы не сделать его более общим с BS 3? Просто используйте" [что-то]модальное " в качестве идентификатора модального DIV.
$("div[id$='modal']").on('hidden.bs.modal',
function () {
$(this).removeData('bs.modal');
}
);
только рабочий вариант для меня:
$('body').on('hidden.bs.modal', '#modalBox', function () {
$(this).remove();
});
Я использую Bootstrap 3 и у меня есть функция, которая называется
popup('popup content')
который добавляет модальное поле html.
если предоставляется удаленный URL-адрес, содержимое будет загружено один раз через jQuery загрузить метод и впрыснутый в .модальное содержание div. Если вы используете data-api, вы можете также использовать атрибут href для указания удаленного источника. Пример этого показан ниже
$.ajaxSetup ({
// Disable caching of AJAX responses
cache: false
});
Я добавил что-то вроде этого, потому что старый контент отображается до появления нового.html(") внутри .модальный контент очистит HTML внутри, надеюсь, это поможет
$('#myModal').on('hidden.bs.modal', function () {
$('#myModal').removeData('bs.modal');
$('#myModal').find('.modal-content').html('');
});
Я написал простой фрагмент, обрабатывающий обновление модального. В основном он хранит нажатую ссылку в данных модального и проверить, если это та же ссылка, которая была нажата, удаление или нет модальных данных.
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');
});
};
для Bootstrap 3, в модальном.js я изменил:
$(document)
.on('show.bs.modal', '.modal', function () { $(document.body).addClass('modal-open') })
.on('hidden.bs.modal', '.modal', function () { $(document.body).removeClass('modal-open'); })
to
$(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 () в модальном контейнере, а также удаляя данные.
$('#myModal').on('hidden.bs.modal', function () {
$(this).removeData('modal');
});
это работает для меня.
этот другой подход хорошо работает для меня:
$("#myModal").on("show.bs.modal", function(e) {
var link = $(e.relatedTarget);
$(this).find(".modal-body").load(link.attr("href"));
});
$('body').on('hidden.bs.modal', '.modal', function () {
$("#mention Id here what you showed inside modal body").empty()
});
какой html-элемент вы хотите очистить как (div, span whatever).
это работает для меня:
модальные
<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">×</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>
ссылки-область-это область, где я помещаю данные и должен очистить
Расширенная версия принятого ответа @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
протестировано на Bootstrap версии 3.3.2
$('#myModal').on('hide.bs.modal', function() {
$(this).removeData();
});