2011-05-11 72 views
5

我的情景:jQuery UI的對話框closeOnEscape不工作的多個打開的對話框

  1. 當單擊Dialog1特定的元素,Dialog2打開。

  2. 當您點擊Escape關閉Dialog2時,按預期工作並關閉Dialog2。

  3. Dialog1仍然存在,你會認爲它可以通過再次擊中Escape來關閉,但事實並非如此。您必須先點擊對話框,然後點擊Escape關閉它。

這是我都試過了,但無濟於事:

// 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

我相信@Andrew惠特克張貼的解決您的問題:) – 2011-05-12 01:58:00

回答

4

這條線:

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

會讓$previousDialog當前對話框(一個被關閉)。 index是正在關閉的對話框的索引。

因此,後來在這條線:

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

呼喚focus()已關閉該對話框上。

我相信你想要的東西是這樣的:

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(); 
    } 
} 

這裏有一個工作示例:http://jsfiddle.net/L8J7Y/

我也注意到,如果使用$previousDialog.dialog("widget").focus();相反,你避免讓周圍的可能是惱人的虛線對話框。

+0

這很尷尬!完全正確。我只需要另一雙眼睛。謝謝!這個.dialog(「小部件」)也有很好的提示......我一直在想,爲什麼當它聚焦時,它會在對話框的第一個輸入周圍出現虛線。 – 2011-05-12 02:34:54

+0

@Scott:沒問題!樂意效勞。 – 2011-05-12 02:37:35

+0

儘管我的(索引> 0)與(索引-1> = 0)相同,但我在數組中使用時肯定會忘記索引-1。 – 2011-05-12 02:40:10

0

怎麼樣在關閉功能,你把這個

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

所有對話框有一個類,所以它會關閉所有對話框

+0

我不想立即關閉所有的對話框。我想要以前的對話框集中注意力,這樣如果有人沒有碰到任何東西,並且想在任何時候點擊Escape,它都會關閉之前的對話框,那就是當前的對話框了。Fyi,那不是我的完全關閉功能我忽略了與手頭問題無關的代碼。 – 2011-05-12 02:38:03