2013-03-06 11 views
27

pagina che si apre Twitter Bootstrap modale con IFRAME all'interno:Chiudi Bootstrap modale dall'interno 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> 

E io sto cercando un modo per chiudere questo modale da dentro l'iframe. Es. facendo clic su un collegamento all'interno di iframe-modal.html per chiudere il modal. Quello che ho cercato, ma non riuscita:

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

risposta

51

È sempre possibile creare una funzione globalmente accessibile che chiude la finestra modale Bootstrap.

es.

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

Poi dal iframe, chiamare utilizzando:

window.parent.closeModal(); 
+0

Grazie! Esattamente quello che stavo cercando. –

+0

Un'altra soluzione sarebbe utilizzare un [postMessage] (https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage) dall'iframe per notificare alla finestra genitore di nascondere il modale (questo funzionerebbe anche se l'iframe ha un dominio diverso). – drakyoko

+0

poiché bootstrap 3 consente di aprire un solo modale in qualsiasi momento, è possibile renderlo più universale utilizzando il nome della classe anziché l'attributo ID: window.closeModal = function() { $ ('. Modal'). modal ('nascondere'); }; –

8

Il problema è che gli eventi jQuery sono stati registrati con istanza della pagina individuale di jQuery. Quindi, $('#iframeModal', window.parent.document).modal('hide'); sta per attivare l'evento hide nell'iframe, non il documento principale.

Questo dovrebbe funzionare: parent.$('#iframeModal').modal('hide');

Questo userà istanza del genitore di jQuery di trovare la voce (in modo non è necessario alcun contesto), e sarà quindi generare l'evento in modo corretto nel genitore.

+0

Grazie per la spiegazione, funziona bene. – mikesjawnbit

2

più Una soluzione nel caso in cui non si conosce id di modale che utilizzano iframe:

funzione Add CloseModal

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

dove frameElement è riferimento alla iframe contenitore elemento.

E questo parametro possono essere passati da iframe in questo modo:

window.parent.CloseModal(window.frameElement); 

più su window.frameElement si possono trovare here

+0

Grazie per una soluzione elegante e tuttavia la più generica che può essere implementata attraverso l'applicazione senza dover riscrivere ogni volta lo stesso codice/simile - per questo particolare problema! Questa risposta dovrebbe davvero raccogliere più upvotes ... :) –

1

È inoltre possibile attivare il clic sul pulsante di chiusura:

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