Перезагрузить контент в модальном режиме (twitter bootstrap)

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>

Я могу загружать контент с помощью ajax с этим a-элементом:

<a data-toggle="modal" data-target="#myModal" href="edit.aspx">Open modal</a>

Теперь мне нужно открыть тот же модальный файл, но с другим URL-адресом. Я использую это модальное окно для редактирования объекта из моей базы данных. Поэтому, когда я нажимаю кнопку редактирования объекта, мне нужно загрузить модальное окно с идентификатором.

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

Как я могу обновить или сбросить загруженный контент ajax в модальном всплывающем окне загрузки twitter?

stian.net
источник
Была такая же проблема и использовалась к тому же решению. Я прибегаю к функции .attr () из jquery по какой-то странной причине. Функция .data () не работала.
user1803784

Ответы:

98

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

Что-то в строках:

$("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"); 
    });
});

Попробую позже и оставлю комментарии.

markz
источник
16
$ ('. modal'). on ('hidden', function () {$ (this) .removeData ();}) это моя модификация приведенного ниже решения ... чище, потому что вам не нужно ловить щелчок и загружать Самостоятельно, так что шоу программных моделей все еще работает
Картер Коул,
1
Я использую Bootstrap 3, содержимое в модальном окне обновляется каждый раз, но создает два модальных окна. Кто-нибудь еще понимает это?
Mr B
1
Привет, Сид, ты создаешь 2 блока с классом «modal-body», на самом деле ты его уже создаешь, и модальный элемент создается снова. Из этого кода удалите .modal-body, и все должно работать нормально.
Palantir
1
У меня работает с Bootstrap 3, очень неприятно, что по умолчанию это не поддерживается основной библиотекой начальной загрузки.
Джош Дил
@markz, я тоже что-то такое использую и ev.preventDefault (); также, но по-прежнему при нажатии ссылки, когда я получаю модальное окно, все раскрывающиеся меню моей страницы сбрасываются. Есть идеи, как это предотвратить?
Jaikrat
73

Чтобы выгрузить данные, когда модальное окно закрыто, вы можете использовать это с 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. Я использовал $ ('. modal'). on ('hidden.bs.modal', function () {$ (this) .removeData ('bs.modal');});
Thupten
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
небольшое исправление в последнем комментарии, в bootstrap v3 должно быть: $ (e.target) .removeData ('bs.modal'). html (''); На данный момент это самое элегантное решение (но оно немного задерживается).
Cesc
Я использовал правку / версию, которую @Softlion опубликовал в этом предлагаемом решении - это сработало, и у меня не было проблем со скоростью / задержкой.
user1801810
21

Вы можете заставить Modal обновить всплывающее окно, добавив эту строку в конец метода скрытия модуля 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
2
Мне нравится слушательский подход. Я думаю, что его можно даже улучшить, используя '.modal' вместо '#modal', чтобы избежать жесткого кодирования идентификатора. На мой взгляд, это более чистый подход, чем у markz, потому что вы продолжаете использовать переключение данных, как в исходном модальном загрузочном модуле.
Toni Grimalt
Интересно, почему этот ответ не получил много голосов. Этот ответ кажется первым, предлагающим прослушиватель событий, который довольно интересен и быстро реализуется.
Anupam
15

С Bootstrap 3 вы можете использовать обработчик событий hidden.bs.modal для удаления любых модальных данных, заставляя всплывающее окно перезагружаться в следующий раз:

$('#modal').on('hidden.bs.modal', function() {
    $(this).removeData('bs.modal');
});
Искусство
источник
1
Да, но в этом решении все еще есть существенное отставание; он по-прежнему показывает старое содержимое на секунду или три перед новым.
Rainbow Randolph
вместо #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.

Modika
источник
5

Немного более сжатый, чем в приведенном выше примере. Захватывает цель из цели данных текущего объекта, по которому щелкнули мышью, с включенным data-toggle = modal. Это делает так, что вам не нужно знать, что такое идентификатор целевого модального окна, просто используйте тот же самый! меньше кода = выигрыш! Вы также можете изменить это, чтобы загрузить заголовок, метки и кнопки для вашего модального окна, если хотите.

 $("[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>
geilt
источник
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

Вот версия coffeescript, которая у меня сработала.

$(document).on 'hidden.bs.modal', (e) ->
  target = $(e.target)
  target.removeData('bs.modal').find(".modal-content").html('')
rgagnon
источник
он решил проблему, из-за которой содержимое перезагружалось, но js внутри модального
окна
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

Я тоже застрял в этой проблеме, когда увидел, что идентификаторы модального окна такие же. Если вам нужно несколько модальных окон, вам нужны разные идентификаторы модальных окон. Я использовал динамический идентификатор . Вот мой код 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 был удален при закрытии модального окна, поэтому я скорректировал строку, предложенную другими (синтаксис coffeescript):

$('#my-modal').on 'hidden.bs.modal', (event) ->
  $(this).removeData('bs.modal').children().remove()
пустые стены
источник
0

var $ table = $ ('# myTable2');
$ table.bootstrapTable ('уничтожить');

Работал на меня

Ашвин Голани
источник
0

шаг 1: Создайте оболочку для вызываемого модального окна clone-modal-wrapper.

Шаг 2: Создайте пустой div с именем modal-wrapper.

Шаг 3: Скопируйте модальный элемент из clone-modal-wrapperв modal-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');
});
Субхагья Кумар Барик
источник