Twitter bootstrap uzaktan mod her seferinde aynı içeriği gösterir


263

Twitter bootstrap kullanıyorum, bir mod belirledim

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

Ve bağlantılar

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

Bu bağlantılardan herhangi birini ilk kez tıkladığımda, doğru içeriği görüyorum, ancak diğer bağlantıları tıkladığımda ilk kez yüklenen aynı içeriği gösteriyor, içeriği güncellemiyor.

Her tıklandığında güncellenmesini istiyorum.

Not: Özel jQuery işlevi ile kolayca çalıştırabilirim, ancak yerel Bootstrap modal uzaktan kumanda işleviyle mümkün olup olmadığını bilmek istiyorum, çünkü yeterince kolay olmalı ve sanırım sadece işleri karmaşık hale getiriyorum.


Aynı Düzeltme, ancak Bootstrap 3 için değiştirildi. Bootstrap 3, ad alanlarını tanıtır. plnkr.co/edit/HWSgSw?p=preview
Jeff H

Yanıtlar:


447

Sorun iki yönlüdür.

İlk olarak , bir Modal nesnesi başlatıldıktan sonra, kalıcı olarak eklenir data-targetve sonraki modlar modalın yalnızca toggle()onu çağırdığını , ancak içindeki değerleri güncellemeyeceğini göstermek için çağrılır options. Bu nedenle, hrefözellikler farklı bağlantılarınızda farklı olsa da , mod değiştirildiğinde, değeri remotegüncellenmez. Çoğu seçenek için, doğrudan nesneyi düzenleyerek bunun üstesinden gelebilirsiniz. Örneğin:

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

Ancak, bu durumda işe yaramaz, çünkü ...

İkincisi , Modal eklentisi uzak kaynak yüklenmeye tasarlanmıştır yapıcısındaki bir değişiklik yapılır dahi maalesef vasıta Modal nesnenin options.remote, o yeniden asla .

Basit bir çözüm, sonraki geçişlerden önce Modal nesnesini yok etmektir. Bir seçenek saklanmayı bitirdikten sonra onu yok etmektir:

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

Not: Seçicileri gerektiği gibi ayarlayın. Bu en genel olanı.

Plunker

Ya da, modal başlatan bağlantının öncekinden farklı olup olmadığını kontrol etmek gibi daha karmaşık bir şema bulmayı deneyebilirsiniz. Eğer öyleyse yok et; değilse, yeniden yüklemeye gerek yoktur.


1
@VladimirStarkov Bunun için üzgünüm - moddaki hidesınıfı unuttum gibi görünüyor , bu yüzden pencereniz çok küçükse, mod düğmelerdeki fare olaylarını engelliyor olabilir. Bazı nedenlerden dolayı JSFiddle.net bu sabah gerçekten kötü (güncellemeye çalışırken bir 504 var), bu yüzden sadece AJAX için daha iyi olan plnkr.co örneğini yeniden yazdım.
merv

3
başka bir sorun daha var: .modal gövdesinde hala metin olacak, bu yüzden ekledim: <CODE> $ ('# myModal .modal-body'). metin ("Yükleniyor ...") </CODE> gizli olay dinleyicisinde
rbp

5
bs.modaliçinde $(this).removeData('bs.modal')çalıştı benim için Bootstrap 3
jvannistelrooy

2
Boostrap 3 için tam çalışma kodu$('body').on('hidden.bs.modal', '.modal', function () { $(this).removeData('bs.modal'); });
Christophe

1
Ayrıca, gizli içerikli var modalData = $(this).data('bs.modal'); if (modalData && modalData.options.remote)...
modalın

171

Bootstrap 3 için şunları kullanmalısınız:

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

17
Benim kahramanım. Bu belgesiz değişiklikleri seviyorum.
Jorin

2
Bu çok yardımcı oldu. Bootstrap 3 geriye dönük olarak uyumlu değildir ve SO'daki (veya diğer forumlardaki) içeriğin çoğu BS <3 ile ilgilidir, bu çözümleri denemek gerçekten çok zaman harcıyor.
Swapnil

7
Mükemmel değil: kısaca yeni içerikten önce eski içeriği gösterir.
Laurent

3
Yukarıdaki örneği kullanarak remoteData$(this).empty()
modalı boşaltmak istiyorsanız

11
Kullanmamalısın $(this).empty(). remoteİç içe doğru seçenek yükler uzak veri <div class="modal-content">elemanı. $('.modal-content', this).empty();Bunun yerine kullanın .
Gavin

50

Bootstrap 3.1 modal-contentiçin, uzak içeriğin yüklenmesini beklerken titremeyi önlemek için tüm iletişim kutusunu (3.0) değil verileri kaldırmak ve boşaltmak isteyeceksiniz .

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

Uzak olmayan modları kullanıyorsanız, yukarıdaki kod, elbette, kapatıldıktan sonra içeriğini kaldırır (kötü). .local-modalEtkilenmemesi için bu tür modalara ( sınıf gibi) bir şeyler eklemeniz gerekebilir . Ardından yukarıdaki kodu şu şekilde değiştirin:

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

Uzak sayfalarda önyükleme veya jquery kitaplıkları yüklemediğinizden emin olun. Herhangi bir referansı öldürecek ve sizi boş bir modal ile bırakacaktır.
Bankzilla

Bu benim için işe yaramıyordu. Çalışan kodum: $ (document) .on ("hidden.bs.modal", ".modal", işlev (e) {if (! $ (E.target) .is (". Local-modal ")) {$ (e.target) .removeData (" bs.modal "). find (". modal-content "). empty ();}});
Kevin

Kullandığımda $(e.target).removeData("bs.modal").find(".modal-content").empty();modalım bir şekilde gizleniyor ve sadece gri kaplama görünüyor.
Axel

30

Teşekkürler. Boostrap.js çevresinde dolaşmaya başladım, ancak cevabınız hızlı ve temiz bir çözüm. İşte benim kod kullanarak sona erdi.

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

21

Kabul edilen cevap benim için çalışmadı, bu yüzden JavaScript ile gittim.

<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")})
    })
})

14

Bu Bootstrap 3 FYI ile çalışır

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

7

Projem Yii'de yerleşiktir ve Bootstrap-Yii eklentisini kullanır, bu nedenle bu cevap yalnızca Yii kullanıyorsanız geçerlidir.

Yukarıdaki düzeltme işe yaradı, ancak modal ilk kez gösterildikten sonra. İlk kez boş çıktı. Çünkü Yii kodunu başlattıktan sonra modun saklanma işlevini çağırdığı için başlatma değişkenlerimi temizledim.

Kalıcı kodu başlatan kod hemen önce removeData çağrısı koyarak hile yaptı buldum. Kodum şu şekilde yapılandırıldı ...

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

5

Bootstrap 3.2.0'da "on" olayı belgenin üzerinde olmalı ve kipi kapatmalısınız:

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

Bootstrap 3.1.0'da "on" olayı gövdede olabilir:

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

3.2 çözümü Bootstrap 3.1'de benim için düzgün çalışan tek şeydi - vücut yaklaşımını kullanarak, modal olaylarımdan bazıları pişirilmedi.
StuartQ

3

Neden BS 3 ile daha genel yapmıyorsunuz? Modsal DIV'nin kimliği olarak sadece "[bir şey] modsal" kullanın.

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

2

Benim için sadece çalışma seçeneği:

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

Bootstrap 3 kullanıyorum ve popup('popup content') mod kutusu html ekleyen adlı bir fonksiyon var .


2
BS 3.3.6 ile benim için çalışan tek şey bu. Ayrıca gidon şablonu kullanarak. Ancak gövde yerine belge kullanmanızı öneririm.
dbinott

1

Bir $ (this) .html ('') ekleme; görünür verileri de temizlemek için ve oldukça iyi çalışıyor


1

Uzak bir URL sağlanırsa, içerik jQuery'nin yükleme yöntemiyle bir kez yüklenecek ve .modal-içerik div'e enjekte edilecektir. Data-api'yi kullanıyorsanız, uzak kaynağı belirtmek için alternatif olarak href özelliğini de kullanabilirsiniz. Bunun bir örneği aşağıda gösterilmiştir

$.ajaxSetup ({
    // Disable caching of AJAX responses
    cache: false
});

1

Bunun gibi bir şey ekledim, çünkü yeni içerik görünene kadar eski içerik gösteriliyor, .modal içeriğinin içindeki .html ('') içindeki HTML'yi temizleyecek,

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

Bu şimdiye kadar bulduğum en basit çalışma cevabı. Cevap hakkında karmaşık bir şey yok, birkaç satır kod ve yorumlaması kolay. Onunla karışıklık ilk kez mükemmel çalıştı.
Tarquin

0

Modalın yenilenmesini ele alan basit bir pasaj yazdım. Temel olarak, tıklanan bağlantıyı modun verilerinde saklar ve modla ilgili verilerin tıklatıldığını, kaldırıldığını veya kaldırılmadığını kontrol eder.

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

Bootstrap 3 için modal.js'de şunları değiştirdim:

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

için

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

(netlik için ekstra boşluk eklendi)

Bu, modal kapsayıcısında empty () öğesini çağırarak ve verileri kaldırarak istenmeyen eski modal içeriğin yanıp sönmesini önler.


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

Bu benim için çalışıyor.


0

Bu diğer yaklaşım benim için işe yarıyor:

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

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

Hangi html öğesini boşaltmak istediğinizi (div, ne olursa olsun).


0

Bu benim için çalışıyor:

kip

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

senaryo

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

links-alan, verileri koyduğum ve temizlenmesi gereken alandır


0

@Merv tarafından kabul edilen yanıtın genişletilmiş sürümü. Ayrıca gizli olan modun uzak kaynaktan yüklenip yüklenmediğini de kontrol eder ve yanıp sönmesini önlemek için eski içeriği temizler.

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


-1

Bootstrap sürüm 3.3.2'de test edildi

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

1
Bu korkunç bir çözüm. Arayan .removeData()hiçbir parametrelerle o elemana bağlı tüm verileri kaldırmak için jquery söyleyecektir. OP'nin sorunu söz konusu olduğunda, .removeData('bs.modal')ya .removeData('modal')da yeterli ve çok güvenlidir.
Julian Paolo Dayag

-4

Bunda iyi şanslar:

$('#myModal').on('hidden.bs.modal', function () {
    location.reload();
});

2
bu işe yaramaz. sayfayı yeniden yüklemek çözüm değildir.
dbinott
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.