2014-09-16 11 views

risposta

14

I clic sullo sfondo possono essere rilevati utilizzando il rettangolo di selezione della finestra di dialogo.

var dialog = document.getElementByTagName('dialog'); 
dialog.showModal(); 
dialog.addEventListener('click', function (event) { 
    var rect = dialog.getBoundingClientRect(); 
    var isInDialog=(rect.top <= event.clientY && event.clientY <= rect.top + rect.height 
     && rect.left <= event.clientX && event.clientX <= rect.left + rect.width); 
    if (!isInDialog) { 
     dialog.close(); 
    } 
}); 
+0

Ottima idea! Funziona bene, grazie! – mantramantramantra

+0

Ho dovuto anche controllare che 'event.target' fosse il' dialog'. EG 'if (! IsInDialog && event.target.tagName === 'DIALOG')'. Se un modulo viene inviato all'interno della finestra di dialogo premendo 'invio', quindi un evento evento click scatterà dal pulsante di invio, e per qualche motivo il suo clientX e clientY sono 0. – kmurph79

4

Un'altra soluzione più efficiente è quello di avvolgere il dialog -CONTENUTO in un div con padding: 0. In questo modo è possibile verificare event.target dell'evento clic, che fa riferimento alla finestra di dialogo in caso di sfondo e qualsiasi altro elemento all'interno di div in caso di modale reale.

Non controllando le dimensioni effettive, è possibile impedire i cicli di layout.

0

Per chiunque inciampo su questa domanda e vuole seguire la soluzione consigliata dal @meaku, ecco come ho risolto utilizzare un per incapsulare l'elemento e non lavorare con getBoundingClientRect() Calcolo:

const popup = document.getElementById('popup'); 
 
const popupDialog = document.getElementById('popup-dialog'); 
 
popup.addEventListener('click', function(e){ 
 
    console.info(e.target.tagName); 
 
    if (e.target.tagName === 'DIALOG') popupDialog.close() 
 
});
<div id="popup" style="padding: 0"> 
 
    <dialog id="popup-dialog" style="display:none;"> 
 
     <h4>Dialog Title</h4> 
 
     <footer class="modal-footer"> 
 
      <button id="popup-close" type="button">close</button> 
 
      <button id="popup-ok" type="button">ok</button> 
 
     </footer> 
 
    </dialog> 
 
</div>

Problemi correlati