2009-07-07 20 views
7

Sto tentando di ignorare il comportamento predefinito di una finestra di dialogo modale dell'interfaccia utente jQuery per chiudere la finestra quando si fa clic sull'overlay. Il codice che ho qui sotto chiuderà la finestra di dialogo dopo averlo aperto per la prima volta e fare clic sull'overlay. Quando apro di nuovo la finestra di dialogo, fare clic sulla sovrapposizione non fa nulla. Mi manca un evento qui. Qualcuno può far notare cosa sto facendo male qui?jQuery UI 1.7.1 Modal Close su overlay Fare clic su

Grazie!

$(function(){ 

     $('#production_schedule_dialog').dialog({ 
      autoOpen: false, 
      width: 570, 
      modal: true, 
      closeOnEscape: true 
     }); 

     $('#production_schedule_dialog_link').click(function(){ 
      $('#production_schedule_dialog').dialog('open'); 
      return false; 
     }); 

     $(document).bind('click', dialogBlur); 
}); 


var dialogBlur = function(event){ 
    var target = $(event.target); 
    if (target.is('.ui-dialog') || target.parents('.ui-dialog').length) { 
     return; 
    } 

    $('.ui-dialog:visible').find('.ui-dialog-titlebar-close').trigger('click'); 

    $(document).unbind('click', dialogBlur); 
} 

risposta

1

guardando il tuo esempio sembra che tu stia disancorando l'evento e non lo ripristini.

provare a spostare la chiamata bind:

$('#production_schedule_dialog_link').click(function(){ 
      $('#production_schedule_dialog').dialog('open'); 
      $(document).bind('click', dialogBlur); 
      return false; 
    }); 

che dovrebbe associare nuovamente il vostro ascoltatore sfocatura ogni volta che il dialogo è aperto.

4

io non so perché il codice non funziona, ma l'ho preso, modificato, e ottenuto una versione che sembra funzionare come voi e che voglio:

var openDialogWindow = function(dialogId) 
{ 

    $(dialogId).dialog('open'); 
    $(".ui-widget-overlay").bind("click", closeDialogWindowOnOverlayClick); 
} 

var closeDialogWindowOnOverlayClick = function(event){ 
    var closeButton = $(".ui-dialog:visible").find(".ui-dialog-titlebar-close"); 
    closeButton.trigger("click"); 
    $(".ui-widget-overlay").unbind("click", closeDialogWindowOnOverlayClick); 
} 

La principale differenza ecco che sto vincolando la logica di chiusura della finestra di dialogo ai clic sull'oggetto di sovrapposizione di JQuery (invece del documento, così come sei). E faccio il binding quando la finestra di dialogo si apre e lo si disfa quando si chiude la finestra di dialogo. Non è veramente necessario, ma mantiene le cose pulite.

In ogni caso, grazie per l'ispirazione.

+0

ho provato come 5 modi diversi questo è l'unico Sono stato in grado di lavorare (e il più pulito) attraverso l'evento "open" integrato nella finestra di dialogo. Ho definito una variabile defaultDialogOptions con $ (". Ui-widget-overlay"). Bind ("click", closeDialogWindowOnOverlayClick); all'interno del callback dell'evento "open" e derivano tutte le finestre di dialogo del mio sito da questa impostazione aka $ ('

') .dialog ($. extend ({}, defualtSettings, {/ * impostazioni specifiche * /})); Funziona magnificamente. Grazie! – parliament

0

così tante risposte complicate ... ecco un semplice riutilizzabile.

$('.ui-widget-overlay').live('click', function(event) 
{ 
    $(this).prev().find('div:nth-child(2)').dialog('close'); 
}); 
+0

.live è deprecato –

10

La soluzione di Paul funziona bene se si utilizza una vecchia versione di jQuery (pre-1.7). Ora .live() è deprecato però. Prova a utilizzare on() invece.

$('.ui-widget-overlay').on("click", function() { 
    //Close the dialog 
    $(this).find(".dialog").dialog("close"); 
}); 
+4

Il '.ui-widget-overly' viene creato dinamicamente. Devi essere sicuro che l'elemento esista prima di aggiungere queste linee. Un approccio migliore sarebbe quello di aggiungere l'evento sul documento: '$ (document) .on ('click', function() {$ ('. Dialog'). Dialog (" close ");});' – tothemario

+0

Sì , '.ui-widget-overly' viene creato dinamicamente, quindi questo codice non sarà necessariamente associato quando richiesto. Ho risolto questo problema inserendolo nell'evento 'open()' della finestra di dialogo, in modo che si leghi DOPO che viene creato '.ui-widget-overly'. Assegnare un evento "click" all'intero documento potrebbe essere un po 'eccessivo. – dKen

3

modo migliore per farlo:

$('body').on("click", ".ui-widget-overlay", function() { 
     $("#dialog").dialog("close"); 
    }); 
+1

Perché non associare semplicemente l'evento a '.ui-widget-overlay'? Perché stai creando un evento che sarà permanentemente attaccato al corpo per qualcosa che non è permanentemente lì? –

+0

perché l'overlay dell'interfaccia utente viene creato dinamicamente anche se collegarlo sul corpo non è una buona idea –

1

Se pagina contiene alcune finestre di dialogo, è possibile utilizzare questo metodo universale:

$(document).on('click', '.ui-widget-overlay', function() { 
    var $dialog = $(this).siblings('.ui-dialog:visible') 
    .find('.ui-dialog-content'); 
    if ($dialog.length && $dialog.dialog('isOpen')) { 
    $dialog.dialog('close'); 
    } 
}); 
+0

Sostituisci "fratelli" con "successivo" e funzionerà anche con più finestre di dialogo aperte. –

+0

Questo è esattamente ciò che io necessario. Ho molti diversi tipi di finestre di dialogo, quindi aggiungere codice a tutti sembrava sciocco. Questa dovrebbe essere la risposta migliore! Abbastanza incolla e vai. Grazie, misterioso utente anonimo in un solo punto! – JoLoCo