jQuery UI对话框closeOnEscape不适用于多个打开的对话框

时间:2011-05-11 22:48:57

标签: jquery jquery-ui jquery-dialog

我的情景:

  1. 单击Dialog1中的特定元素时,将打开Dialog2。

  2. 当你按Escape关闭Dialog2时,按预期工作并关闭Dialog2。

  3. Dialog1仍然存在,你会认为它可以通过再次击中Escape来关闭,但事实并非如此。你必须先点击对话框,然后点击Escape才能关闭它。

  4. 这是我尝试过的,但无济于事:

    // 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"); }
    
    }
    

2 个答案:

答案 0 :(得分: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();代替,则可以避免在对话框周围出现可能令人讨厌的虚线。

答案 1 :(得分:0)

你把这个关闭函数怎么样

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

因为所有对话框都有该类,所以它将关闭所有对话框