it-swarm.com.ru

Твиттер bootstrap удаленный модал каждый раз показывает один и тот же контент

Я использую загрузчик Twitter, я указал модальный

<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>

Когда я нажимаю на любую из этих ссылок в первый раз, я вижу правильный контент, но когда я нажимаю на другие ссылки, он показывает тот же контент, загруженный в первый раз, он не обновляет контент.

Я хочу, чтобы он обновлялся каждый раз, когда на него нажимали.

П.С .: Я легко могу заставить его работать с помощью пользовательской функции jQuery, но я хочу знать, возможно ли это с нативной Bootstrap модальной удаленной функцией, поскольку это должно быть достаточно просто, и я предполагаю, что я просто усложняю вещи.

261
Dhruv Kumar Jha

Проблема двоякая.

Сначала , когда создается экземпляр модального объекта, он постоянно прикрепляется к элементу, указанному в data-target, и последующие вызовы показывают, что модальный вызовет только 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

Или вы можете попытаться придумать более сложную схему, например, проверить, отличается ли ссылка, запускающая модал, от предыдущей. Если это так, уничтожь; если это не так, то нет необходимости перезагрузить.

446
merv

Для bootstrap 3 вы должны использовать:

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

Для 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();
});
50
slopapa

Спасибо, Мерв. Я начал возиться с bootstrap.js, но ваш ответ - быстрый и чистый обходной путь. Вот что я использовал в своем коде.

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

Принятый ответ не сработал для меня, поэтому я решил использовать 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")})
    })
})
21
James Ward

Это работает с Bootstrap 3 FYI

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

Мой проект построен в Yii и ​​использует плагин Bootstrap-Yii, поэтому этот ответ актуален только в том случае, если вы используете Yii.

Вышеупомянутое исправление сработало, но только после первого показа модального режима. В первый раз все вышло пустым. Я думаю, это потому, что после инициации кода Yii вызывает функцию скрытия модального пространства, тем самым очищая мои переменные инициации.

Я обнаружил, что выполнение вызова removeData непосредственно перед тем, как код, запустивший модал, сработало. Так что мой код структурирован так ...

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

В 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');
});
5
Romain

Почему бы не сделать его более общим с BS 3? Просто используйте "[что-то] модальное" в качестве идентификатора модального DIV.

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

Единственный рабочий вариант для меня это:

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

Я использую Bootstrap 3, и у меня есть функция с именем popup('popup content'), которая добавляет модальное поле html.

2
Orkun Tuzel

Добавление $ (this) .html (''); очистить видимые данные, и это работает довольно хорошо

1
webstr

Я добавил что-то вроде этого, потому что старый контент показывается, пока не появится новый, с .html ('') внутри .modal-content будет очищать HTML внутри, надеюсь, это поможет

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

Если предоставлен удаленный URL-адрес, контент будет загружен один раз с помощью метода jQuery load и вставлен в div .modal-content. Если вы используете data-api, вы можете использовать атрибут href для указания удаленного источника. Пример этого показан ниже

$.ajaxSetup ({
    // Disable caching of AJAX responses
    cache: false
});
1
Ciprian Mihalache
        $('#myModal').on('hidden.bs.modal', function () {
            $(this).removeData('modal');
        });

Этот работает для меня.

0
Shawn Ang

Этот другой подход хорошо работает для меня:

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

Для 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 () для модального контейнера, а также удаляя данные.

0
Stanton

Расширенная версия принятого ответа от @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

0
Wojtek Kruszewski

Этот работает для меня:

модальный

<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>

область ссылок - это область, в которую я помещаю данные и которую нужно очистить

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

Какой элемент HTML вы хотите очистить, как (div, span независимо).

0
Atul

Я написал простой фрагмент, посвященный обновлению модального стиля. В основном он сохраняет нажатую ссылку в модальных данных и проверяет, является ли это той же ссылкой, по которой щелкали, удаляя модальные данные или нет.

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');
    });
};
0
DevAntoine