2013-03-06 15 views
27

stronę, która otwiera Twitter Bootstrap modalnych z iframe wewnątrz:Close Bootstrap modalne od wewnątrz iframe

<div id="iframeModal" class="modal hide fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true"> 
    <div class="modal-header"> 
     <button type="button" class="btn btn-danger pull-right" data-dismiss="modal" aria-hidden="true">Close</button> 
     <div class="clearfix"></div> 
    </div> 
    <div class="modal-body"> 
     <iframe src="iframe-modal.html"></iframe> 
    </div> 
    <div class="modal-footer"> 
    </div> 
</div> 

I szukam sposób, aby zamknąć ten modal od wewnątrz iframe. Przykł. klikając łącze wewnątrz iframe-modal.html, aby zamknąć modal. Co Próbowałem, ale nie udane:

$('#iframeModal', window.parent.document).modal('hide'); 
    $('#iframeModal', top.document).modal('hide'); 
    $('#iframeModal').modal('hide'); 

Odpowiedz

51

zawsze można utworzyć globalnie dostępną funkcję, która zamyka okno modalne Bootstrap.

np.

window.closeModal = function(){ 
    $('#iframeModal').modal('hide'); 
}; 

Następnie z iframe, nazywają go za pomocą:

window.parent.closeModal(); 
+0

Dziękuję Ci! Dokładnie to, czego szukałem. –

+0

Innym rozwiązaniem byłoby użycie [postMessage] (https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage) z elementu iframe w celu powiadomienia okna nadrzędnego, aby ukryć modal (to działa, nawet jeśli element iframe ma inną domenę). – drakyoko

+0

ponieważ bootstrap 3 pozwala tylko na otwarcie jednego modala w dowolnym momencie, dzięki czemu można uczynić to bardziej uniwersalnym, używając nazwy klasy zamiast atrybutu ID: window.closeModal = function() { $ (". Modal"). modal ("ukryj"); }; –

8

Problem jest, że wydarzenia jQuery są zarejestrowane przykład pojedynczej strony w jQuery. Tak więc $('#iframeModal', window.parent.document).modal('hide'); faktycznie wywoła zdarzenie hide w elemencie iframe, a nie dokument nadrzędny.

To powinno działać: parent.$('#iframeModal').modal('hide');

ten użyje wystąpienie rodzica jQuery znaleźć element (tak potrzebne jest brak kontekstu), a zostanie on ognia zdarzenie prawidłowo rodzica.

+0

Dzięki za wyjaśnienie, działa dobrze. – mikesjawnbit

2

Jeszcze rozwiązanie w przypadku, gdy nie wiem id modalnych, które wykorzystują iframe:

funkcji Dodaj CloseModal

function CloseModal(frameElement) { 
    if (frameElement) { 
     var dialog = $(frameElement).closest(".modal"); 
     if (dialog.length > 0) { 
      dialog.modal("hide"); 
     } 
    } 
} 

gdzie frameElement jest odniesienie do iframe elementu pojemnika.

I ten parametr może być przekazywana z iframe tak:

window.parent.CloseModal(window.frameElement); 

Więcej o window.frameElement można znaleźć here

+0

Dziękuję za eleganckie, a zarazem najbardziej ogólne rozwiązanie, które można zaimplementować w aplikacji bez konieczności przepisywania tego samego/podobnego kodu za każdym razem - w tym konkretnym przypadku! Ta odpowiedź powinna naprawdę zebrać więcej upvotes ... :) –

1

Można też wyzwolić kliknij przycisk zamykania:

$('#iframeModal button.mce-close', parent.document).trigger('click'); 
Powiązane problemy