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

标签 jquery jquery-ui jquery-dialog

我的场景:

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

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

  3. Dialog1 仍然存在,您可能认为可以通过再次按 Esc 键将其关闭,但事实并非如此。您必须先单击该对话框,然后按 Esc 键才能将其关闭。

这是我尝试过的方法,但没有成功:

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

}

最佳答案

这一行:

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(); 相反,您可以避免在对话框周围出现可能令人讨厌的虚线。

关于jQuery UI 对话框 closeOnEscape 不适用于多个打开的对话框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5971462/

相关文章:

javascript - 使用参数重新加载 Jquery 选项卡

javascript - 使用 jquery 访问 iframe 的 <table>

使用 Google Analytics 进行 Javascript 覆盖/对话跟踪

c# - 如何使 requiredFieldValidator 在页面其他位置触发消息?

jquery - 如何让 jquery 清除表格单元格?

javascript - jQuery UI 1.9 Spinner 对话框中断旋转导致死循环

asp.net-mvc-3 - jQuery 对话框上的 MVC 3 客户端验证

javascript - JQuery 对话框 : How to find clicked button inside the button clicked event

jquery - 在传递到 Web 服务之前将 jqGrid rowNum 从 ALL 更改为 -1 的最佳方法

javascript - jQuery 原型(prototype)