Reload konten di modal (twitter bootstrap)

98

Saya menggunakan popup modal bootstrap twitter.

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

Saya dapat memuat konten menggunakan ajax dengan a-element ini:

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

Sekarang saya harus membuka modal yang sama tetapi menggunakan url yang berbeda. Saya menggunakan modal ini untuk mengedit entitas dari database saya. Jadi ketika saya mengklik edit pada entitas saya perlu memuat modal dengan ID.

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

Jika saya mengklik tautan nomor 1, itu berfungsi dengan baik. Tetapi jika saya kemudian mengklik tautan nomor 2, konten modal sudah dimuat dan untuk itu akan menampilkan konten dari tautan nomor 1.

Bagaimana cara menyegarkan atau mereset konten yang dimuat ajax di popup modal bootstrap twitter?

stian.net
sumber
Memiliki masalah yang sama dan menggunakan solusi yang sama. Saya menggunakan fungsi .attr () dari jquery karena beberapa alasan aneh. Fungsi .data () tidak berfungsi.
pengguna1803784

Jawaban:

98

Saya mengalami masalah yang sama, dan saya rasa cara melakukannya adalah dengan menghapus atribut data-toggle dan memiliki penangan khusus untuk tautan.

Sesuatu di baris:

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

Akan mencobanya nanti dan mengirim komentar.

markz
sumber
16
$ ('. modal'). on ('hidden', function () {$ (this) .removeData ();}) ini adalah modifikasi saya dari solusi di bawah ini ... bersih karena Anda tidak perlu menangkap klik dan memuat itu sendiri sehingga acara model terprogram masih berfungsi
Carter Cole
1
Saya menggunakan Bootstrap 3, konten dalam modal disegarkan setiap kali tetapi itu membuat dua jendela modal. Apakah ada orang lain yang mengerti ini?
Tuan B
1
Hai Sid, Anda membuat 2 div dengan kelas "modal-body", sebenarnya Anda sudah membuatnya, dan modal tersebut dibuat lagi. Dari kode itu, hapus '.modal-body' dan seharusnya berfungsi dengan baik.
Palantir
1
Berfungsi untuk saya dengan Bootstrap 3, sangat menyebalkan karena ini tidak didukung oleh pustaka bootstrap inti secara default.
Josh Diehl
@markz, saya juga menggunakan sesuatu seperti ini dan ev.preventDefault (); juga tetapi masih dengan mengklik tautan, ketika saya mendapatkan jendela modal, semua dropdown halaman saya disetel ulang. Ada ide, bagaimana mencegahnya?
Jaikrat
73

Untuk membongkar data saat modal ditutup, Anda dapat menggunakan ini dengan Bootstrap 2.x:

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

Dan di 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');
});
Steffen Wenzel
sumber
sempurna. bekerja tanpa masalah. di bootstrap 3. Saya menggunakan $ ('. modal'). on ('hidden.bs.modal', function () {$ (this) .removeData ('bs.modal');});
Thupten
4
Tidak sempurna: ini secara singkat menampilkan konten lama sebelum konten baru.
Laurent
3
@Laurent, Anda dapat membersihkan konten sebelumnya dengan menambahkan .html (''). Jadi, untuk 2.x: $ (this) .removeData ('modal'). Find ('. Modal-body'). Html (''). Untuk 3: $ (this) .removeData ('bs.modal'). Html ('') 2.x memuat konten ke dalam .modal-body, sedangkan 3 memuat konten langsung ke dalam wadah
.modal
koreksi kecil pada komentar terakhir, di bootstrap v3 harus: $ (e.target) .removeData ('bs.modal'). html (''); Sejauh ini, ini adalah solusi paling elegan (tetapi agak tertunda).
Cesc
Saya menggunakan edit / versi yang diposting @Softlion dalam solusi yang diusulkan ini - berhasil dan saya tidak mengalami masalah kecepatan / penundaan.
pengguna1801810
21

Anda dapat memaksa Modal untuk menyegarkan popup dengan menambahkan baris ini di akhir metode sembunyikan plugin Modal (Jika Anda menggunakan bootstrap-transisi.js v2.1.1, itu harus di baris 836)

this.$element.removeData()

Atau dengan pendengar acara

$('#modal').on('hidden', function() {
    $(this).data('modal').$element.removeData();
})
Sergio
sumber
4
-1 Ide untuk memasukkan potongan pertama itu ke dalam plugin Modal secara langsung adalah ide yang buruk. Jika Anda akan meretas plugin (yang akan saya hindari), hal yang lebih masuk akal untuk dilakukan adalah memindahkan load()panggilan keluar dari konstruktor dan ke show(), atau menambahkan metode ke plugin untuk secara manual memicu pemuatan ulang remote. Pada saran kedua, saya hanya memberikan itu sebagai jawaban untuk pertanyaan yang secara eksplisit meminta untuk tidak melakukannya seperti yang disarankan @markz .
merv
2
Saya suka pendekatan pendengar. Saya pikir itu bahkan dapat ditingkatkan menggunakan '.modal' daripada '#modal' untuk menghindari hardcoding id. Menurut pendapat saya ini adalah pendekatan yang lebih bersih daripada markz, karena Anda tetap menggunakan data-toggle seperti pada modal bootstrap asli.
Toni Grimalt
Saya bertanya-tanya mengapa jawaban ini tidak mendapat banyak suara positif. Jawaban ini sepertinya yang pertama menyarankan event listener yang cukup menarik dan cepat diimplementasikan.
Anupam
15

Dengan Bootstrap 3 Anda dapat menggunakan event handler 'hidden.bs.modal' untuk menghapus data terkait modal, memaksa popup untuk memuat ulang lain kali:

$('#modal').on('hidden.bs.modal', function() {
    $(this).removeData('bs.modal');
});
Seni
sumber
1
Ya, tetapi masih ada kelambanan penting dalam solusi ini; itu masih menampilkan konten lama untuk satu atau tiga detik sebelum yang baru.
liburan dok
alih-alih #modal coba tubuh
wobsoriano
8

Berdasarkan jawaban lain (terima kasih semuanya).

Saya perlu menyesuaikan kode agar berfungsi, karena hanya memanggil .html menghapus seluruh konten dan modal tidak akan dimuat dengan konten apa pun setelah saya melakukannya. Jadi saya hanya mencari area konten dari modal dan menerapkan pengaturan ulang HTML di sana.

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

Masih mungkin pergi dengan jawaban yang diterima karena saya mendapatkan beberapa lompatan jelek sebelum modal dimuat karena kontrolnya dengan Bootstrap.

Modika
sumber
5

Sedikit lebih padat daripada contoh yang diterima di atas. Ambil target dari data-target dari apa pun yang diklik saat ini dengan data-toggle = modal on. Ini membuatnya jadi Anda tidak perlu tahu apa id dari modal target itu, cukup gunakan kembali yang sama! lebih sedikit kode = menang! Anda juga dapat memodifikasi ini untuk memuat judul, label dan tombol untuk modal Anda jika Anda mau.

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

Contoh Tautan:

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

Saya membuat sedikit perubahan pada jawaban Softlion , jadi semua modal saya tidak akan disegarkan di hide. Modal dengan atribut data-refresh = 'true' hanya disegarkan, yang lain berfungsi seperti biasa. Ini adalah versi modifikasi.

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

Sekarang gunakan atribut seperti yang ditunjukkan di bawah ini,

<div class="modal fade" data-refresh="true" id="#modal" tabindex="-1" role="dialog" aria-labelledby="#modal-label" aria-hidden="true"></div>

Ini akan memastikan hanya modals dengan data-refresh = 'true' yang di-refresh. Dan saya juga menyetel ulang modal html karena nilai lama ditampilkan hingga nilai baru dimuat, membuat html kosong memperbaiki yang satu itu.

Siwa Avula
sumber
2

Ini adalah versi coffeescript yang cocok untuk saya.

$(document).on 'hidden.bs.modal', (e) ->
  target = $(e.target)
  target.removeData('bs.modal').find(".modal-content").html('')
rgagnon.dll
sumber
itu menyelesaikan masalah di mana konten dimuat ulang tetapi js di dalam modal tidak dieksekusi untuk kedua kalinya
Souhaieb
1

Ini akan bekerja untuk semua versi twitterbootstrap

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

tautan ke modal adalah

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

pop up modal

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

Bijaya Kumar
sumber
1

Saya juga terjebak pada masalah ini kemudian saya melihat bahwa id modalnya sama. Anda memerlukan ID modals yang berbeda jika Anda menginginkan banyak modals. Saya menggunakan id dinamis . Ini kode saya di haml:

.modal.hide.fade{"id"=> discount.id,"aria-hidden" => "true", "aria-labelledby" => "myModalLabel", :role => "dialog", :tabindex => "-1"}

kamu bisa melakukan ini

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

dan tautan Anda ke modal akan menjadi

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

Saya harap ini akan berhasil untuk Anda.

Asnad Atta
sumber
1

Anda bisa mencoba ini:

$('#modal').on('hidden.bs.modal', function() {
    $(this).removeData('bs.modal');
});
bharat
sumber
0

Saya ingin konten yang dimuat AJAX dihapus ketika modal ditutup, jadi saya menyesuaikan baris yang disarankan oleh orang lain (sintaks skrip kopi):

$('#my-modal').on 'hidden.bs.modal', (event) ->
  $(this).removeData('bs.modal').children().remove()
dinding kosong
sumber
0

var $ table = $ ('# myTable2');
$ table.bootstrapTable ('hancurkan');

Bekerja untuk saya

Ashwin Golani
sumber
0

langkah 1: Buat pembungkus untuk modal yang dipanggil clone-modal-wrapper.

langkah 2: Buat div kosong bernama modal-wrapper.

Langkah 3: Salin elemen modal dari clone-modal-wrapperke modal-wrapper.

langkah 4: Alihkan modal 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');
});
Soubhagya Kumar Barik
sumber