2013-03-06 19 views
27

Seite, die im Innern mit iframe Twitter Bootstrap Modal öffnet:Schließen Bootstrap modal von innen 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> 

Und ich bin auf der Suche nach einem Weg, um diesen modal zu schließen aus dem Innern des iframe. Bsp. Klicken Sie auf einen Link innerhalb der iframe-modal.html, um das Modal zu schließen. Was habe ich versucht, aber nicht erfolgreich:

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

Antwort

51

Sie können eine global zugängliche Funktion immer schaffen, die die Bootstrap modale Fenster schließt.

z.

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

Dann aus dem iframe, rufen Sie es mit:

window.parent.closeModal(); 
+0

Vielen Dank! Genau das, was ich gesucht habe. –

+0

Eine andere Lösung wäre, eine [postMessage] (https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage) aus dem iFrame zu verwenden, um das übergeordnete Fenster zu benachrichtigen, das modale zu verbergen (this würde funktionieren, selbst wenn der iframe eine andere Domäne hat). – drakyoko

+0

Da Bootstrap 3 nur zu einem beliebigen Zeitpunkt ein Modal öffnen kann, können Sie dies universeller machen, indem Sie den Klassennamen anstelle des ID-Attributs verwenden: window.closeModal = function() { $ ('.modal'). modal ('verstecken'); }; –

8

Das Problem ist, dass jQuery Ereignisse mit der einzelnen Seite Instanz von jQuery registriert werden. So wird $('#iframeModal', window.parent.document).modal('hide'); tatsächlich das Ausblenden-Ereignis im Iframe auslösen, nicht das übergeordnete Dokument.

sollte diese Arbeit: parent.$('#iframeModal').modal('hide');

Dies wird die Eltern-Instanz von jQuery verwenden, um die Artikel zu finden (so wird kein Kontext erforderlich), und es wird dann das Ereignis korrekt in der Mutter feuern.

+0

Danke für die Erklärung, funktioniert gut. – mikesjawnbit

2

Eine weitere Lösung, falls Sie nicht id modaler wissen, welche iframe verwenden:

Add Funktion CloseModal

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

wo frameElement ist Bezug auf iframe Element Container.

Und dieser Parameter kann von iframe wie so übergeben werden:

window.parent.CloseModal(window.frameElement); 

Mehr über window.frameElement Sie here

+0

Vielen Dank für eine elegante und doch die allgemeinste Lösung, die in der gesamten Anwendung implementiert werden kann, ohne jedes Mal den gleichen/ähnlichen Code neu schreiben zu müssen - für dieses spezielle Problem! Diese Antwort sollte wirklich mehr Upvotes sammeln ... :) –

1

Sie finden auch auslösen der klicken Sie auf die Schaltfläche zum Schließen:

$('#iframeModal button.mce-close', parent.document).trigger('click'); 
Verwandte Themen