2011-05-11 12 views
5

Mi escenario:jQuery UI closeOnEscape de diálogo no funciona para varios cuadros de diálogo abiertos

  1. Cuando se hace clic en un elemento particular en Dialog1, Dialog2 abre.

  2. Al presionar Escape para cerrar Dialog2, funciona como se esperaba y se cierra Dialog2.

  3. Dialog1 permanece y usted pensaría que podría cerrarse presionando Escape nuevamente, pero no es así. Primero debe hacer clic en el cuadro de diálogo y luego presionar Escape para que se cierre.

Esto es lo que he tratado, pero fue en vano:

// Array to hold all of our open dialogs id's 
var openDialogs = []; 

// the open: method in my dialog 
open: function() { 

    openDialogs[openDialogs.length] = $(this).attr("id"); 

} 

// the close: method in my dialog 
close: function() { 

    var index = $.inArray($(this).attr("id"), openDialogs), 
    $previousDialog = (index > 0) ? $("#" + openDialogs[index]) : undefined; 

    // remove the current dialog from the array via Jon Resig's remove() method 
    openDialogs.remove(index);   

    // set focus to previously opened dialog 
    if ($previousDialog) { $previousDialog.focus(); } 

    // I've even tried: 
    // 
    // if ($previousDialog) { $previousDialog.dialog("moveToTop"); } 

} 
+0

Creo que @ Andrew Whitaker publicó la solución a su problema :) –

Respuesta

4

Esta línea:

var index = $.inArray($(this).attr("id"), openDialogs), 
$previousDialog = (index > 0) ? $("#" + openDialogs[index]) : undefined; 

Hará $previousDialog referirse al diálogo actual(el que está siendo cerrada) index es el índice del diálogo que se está cerrando.

Por lo tanto, más adelante en esta línea:

if ($previousDialog) { $previousDialog.focus(); } 

está llamando focus() en el diálogo que estaba cerrada.

creo que lo que quiere es algo como esto:

close: function() { 
    var index = $.inArray($(this).attr("id"), openDialogs), 
     $previousDialog = (index - 1 >= 0) ? $("#" + openDialogs[index - 1]) : undefined; 

    // remove the current dialog from the array via Jon Resig's remove() method 
    openDialogs.remove(index); 

    // set focus to previously opened dialog 
    if ($previousDialog) { 
     $previousDialog.focus(); 
    } 
} 

Aquí está un ejemplo de trabajo: http://jsfiddle.net/L8J7Y/

También me di cuenta que si utiliza $previousDialog.dialog("widget").focus(); lugar, a evitar que la línea de puntos posiblemente molesto alrededor el diálogo.

+0

¡Eso es vergonzoso! Totalmente cierto. Solo necesitaba otro par de ojos. ¡Gracias! Un buen consejo en ese .dialog ("widget") también ... Siempre me he preguntado por qué hizo esa línea punteada alrededor de la primera entrada dentro del diálogo cuando estaba enfocado. –

+0

@Scott: ¡No hay problema! Encantado de ayudar. –

+0

Aunque, mi (índice> 0) es el mismo que (índice - 1> = 0), pero definitivamente olvidé el índice-1 cuando se usa en la matriz. –

0

¿qué hay en la función cerca que poner esto

$(".ui-dialog-content").dialog("close"); 

como todos los diálogos que tienen clase para que se va a cerrar todos los diálogos

+0

No quiero cerrar todos los cuadros de diálogo inmediatamente. Quería que el cuadro de diálogo anterior estuviera enfocado, de modo que SI alguien no tocara nada y deseara disparar a Escape en cualquier momento, cerrara ese diálogo anterior, que ahora era el actual. Fyi, esa no es realmente mi función de cierre completo. tampoco, omití el código que no era pertinente para la pregunta en cuestión. –

Cuestiones relacionadas