Twitter Bootstrap remote modal pokazuje tę samą zawartość za każdym razem

Używam Twittera bootstrap, podałem modal

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

I linki

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

Kiedy klikam na któryś z tych linków po raz pierwszy, widzę poprawną zawartość, ale kiedy klikam na inne linki, pokazuje tę samą zawartość załadowaną po raz pierwszy, nie aktualizuje zawartości.

Chcę, aby był aktualizowany za każdym razem, gdy kliknie.

P. s: łatwo mogę to zrobić za pomocą niestandardowej funkcji jQuery, ale chcę wiedzieć, czy jest to możliwe z natywnym Funkcja Bootstrap modal remote, ponieważ powinna być łatwa i chyba po prostu komplikuję sprawy.

Author: Cœur, 2012-09-05

22 answers

Problem jest dwojaki.

Pierwszy , gdy obiekt modalny zostanie utworzony, jest on uporczywie dołączany do elementu określonego przez data-target i kolejne wywołania, aby pokazać, że modal wywoła tylko toggle() na nim, ale nie zaktualizuje wartości w options. Tak więc, nawet jeśli atrybuty href są różne na różnych linkach, gdy modal jest przełączany, wartość remote nie jest aktualizowana. W przypadku większości opcji można to obejść, edytując bezpośrednio obiekt. Na przykład:

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

To jednak nie zadziała w tym przypadku, ponieważ...

Po Drugie , Wtyczka modalna jest przeznaczona do ładowania zdalnego zasobu w konstruktorze obiektu modalnego, co niestety oznacza, że nawet jeśli nastąpi zmiana w options.remote, nigdy nie zostanie przeładowany .

Prostym rozwiązaniem jest zniszczenie obiektu modalnego przed kolejnymi przełącznikami. Jedną z opcji jest zniszczenie go po zakończeniu ukrycie:

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

Uwaga: Dostosuj selektory w razie potrzeby. To jest najbardziej ogólne.

Plunker

Lub możesz spróbować wymyślić bardziej skomplikowany schemat, aby zrobić coś takiego, jak sprawdzenie, czy link uruchamiający modal różni się od poprzedniego. Jeśli tak, zniszcz; jeśli nie, to nie ma potrzeby przeładowywania.

 440
Author: merv,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-21 04:08:38

Do bootstrap 3 należy użyć:

$('body').on('hidden.bs.modal', '.modal', function () {
    $(this).removeData('bs.modal');
});
 170
Author: Camilo Nova,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-08 19:04:57

W przypadku Bootstrap 3.1 należy usunąć dane i opróżnić modal-content zamiast całego okna dialogowego (3.0), aby uniknąć migotania podczas oczekiwania na załadowanie zdalnej zawartości.

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

Jeśli używasz nie-zdalnych modali, powyższy kod oczywiście usunie ich zawartość po zamknięciu (zły). Być może będziesz musiał dodać coś do tych modali (jak klasa .local-modal), aby nie zostały naruszone. Następnie zmodyfikuj powyższy kod na:

$(document).on("hidden.bs.modal", ".modal:not(.local-modal)", function (e) {
    $(e.target).removeData("bs.modal").find(".modal-content").empty();
});
 49
Author: slopapa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-13 07:16:47

Dzięki merv. Zacząłem majstrować wokół boostrap.js ale twoja odpowiedź to szybkie i czyste obejście. Oto, czego użyłem w kodzie.

$('#modal-item').on('hidden', function() {
    $(this).removeData('modal');
});
 30
Author: Bienvenido David,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-23 15:14:50

Zaakceptowana odpowiedź nie działa dla mnie, więc poszedłem z JavaScript, aby to zrobić.

<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
Author: James Ward,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-21 15:28:08

To działa z Bootstrap 3 FYI

$('#myModal').on('hidden.bs.modal', function () {
  $(this).removeData('bs.modal');
});
 14
Author: Dave Sag,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-09 05:24:58

Mój projekt jest zbudowany w Yii i używa wtyczki Bootstrap-Yii, więc ta odpowiedź jest istotna tylko wtedy, gdy używasz Yii.

Powyższa poprawka zadziałała, ale dopiero po pierwszym pokazaniu modalu. Za pierwszym razem było puste. Myślę, że dzieje się tak dlatego, że po zainicjowaniu kodu Yii wywołuje funkcję hide modal, usuwając w ten sposób moje zmienne inicjacyjne.

Odkryłem, że umieszczenie wywołania removeData bezpośrednio przed kodem, który uruchomił modal, spowodowało trick. Więc mój kod jest tak skonstruowany...

$ ("#myModal").removeData ('modal');
$ ('#myModal').modal ({remote : 'path_to_remote'});
 7
Author: Sean Toru,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-10 10:12:19

W Bootstrap 3.2.0 Zdarzenie "on" musi znajdować się w dokumencie i musisz opróżnić modal:

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

W Bootstrap 3.1.0 Zdarzenie "on" może być na ciele:

$('body').on('hidden.bs.modal', '.modal', function () {
    $(this).removeData('bs.modal');
});
 5
Author: Romain,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-13 07:15:37

Dlaczego nie uczynić go bardziej ogólnym z BS 3? Po prostu użyj "[coś] modal " jako ID modalnego DIV.

$("div[id$='modal']").on('hidden.bs.modal',
    function () {
        $(this).removeData('bs.modal');
    }
);
 3
Author: user2763645,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-10 05:27:55

Jedyną działającą opcją dla mnie jest:

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

Używam Bootstrap 3 i mam funkcję o nazwie popup('popup content') który dołącza pole modalne html.

 2
Author: Orkun Tuzel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-06 12:41:00

Dodanie $(this).html ("); aby wyczyścić widoczne dane, a to działa całkiem dobrze

 1
Author: webstr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-12 22:33:52

Jeśli podany jest Zdalny adres URL, zawartość zostanie załadowana jednorazowo za pomocą metody jQuery load i wstrzyknięta do .modal-content div. Jeśli używasz API danych, możesz alternatywnie użyć atrybutu href, aby określić zdalne źródło. Przykład tego pokazano poniżej

$.ajaxSetup ({
    // Disable caching of AJAX responses
    cache: false
});
 1
Author: Ciprian Mihalache,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-24 07:35:59

Dodałem coś takiego, ponieważ starsza treść jest wyświetlana, dopóki nie pojawi się nowa, z .html ( " ) wewnątrz .modal-content wyczyści HTML wewnątrz, mam nadzieję, że pomoże

$('#myModal').on('hidden.bs.modal', function () {
   $('#myModal').removeData('bs.modal');
   $('#myModal').find('.modal-content').html('');
});
 1
Author: Mau GM,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-23 18:30:05

Napisałem prosty fragment obsługujący odświeżanie modalu. Zasadniczo przechowuje kliknięty link w danych modalnych i sprawdź, czy jest to ten sam link, który został kliknięty, usuwając lub nie dane modalne.

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
Author: DevAntoine,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-01 12:44:14

Dla Bootstrap 3, w trybie modalnym.js zmieniłem:

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

Do

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

(dodatkowy odstęp dodany dla jasności)

Zapobiega to niechcianemu Flashowi starej zawartości modalnej poprzez wywołanie empty() w kontenerze modalnym, a także usunięcie danych.

 0
Author: Stanton,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-10 20:49:38
        $('#myModal').on('hidden.bs.modal', function () {
            $(this).removeData('modal');
        });
To mi pasuje.
 0
Author: Shawn Ang,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-18 10:12:42

To drugie podejście działa dobrze dla mnie:

$("#myModal").on("show.bs.modal", function(e) {
    var link = $(e.relatedTarget);
    $(this).find(".modal-body").load(link.attr("href"));
});
 0
Author: Rhys Stephens,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-05 23:36:41
$('body').on('hidden.bs.modal', '.modal', function () {
       $("#mention Id here what you showed inside modal body").empty()
});

Jaki element html chcesz opróżnić (div, span whatever).

 0
Author: Atul,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-24 07:33:56

Ten działa dla mnie:

Modal

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

Skrypt

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

Links-area to obszar, w którym umieszczam Dane i muszę wyczyścić

 0
Author: dewaz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-26 09:50:43

Rozszerzona wersja zaakceptowanej odpowiedzi przez @ merv. Sprawdza również, czy ukryty modal jest ładowany ze zdalnego źródła i czyści starą zawartość, aby zapobiec miganiu.

$(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
Author: Wojtek Kruszewski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-31 14:04:25

Testowane na wersji Bootstrap 3.3.2

  $('#myModal').on('hide.bs.modal', function() {
    $(this).removeData();
  });
 -1
Author: Abudayah,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-16 09:24:44

Powodzenia z tym:

$('#myModal').on('hidden.bs.modal', function () {
    location.reload();
});
 -4
Author: Mappy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-18 08:42:30