2

当用户打开对话框时,有一堆必须处理的 ajax 请求,因此我有第二个对话框,它只显示加载信息并在处理完所有请求后关闭。

一旦打开,我无法使用 Escape 键关闭用户打开的对话框。我必须先单击对话框本身,然后才能使用转义。

我已经尝试以下方法在加载对话框关闭后为用户打开的对话框分配焦点,但无济于事,我仍然必须单击对话框才能使用转义键关闭它。

$(document).ajaxStart(function () {
    // IF loading dialog is not allready being shown show it.
    if ($("#LoadingData").dialog('isOpen') === false) {
        $("#LoadingData").dialog('open');
    }
});

$(document).ajaxStop(function () {
    //Close the loading dialog once the requests have finished
    $("#LoadingData").dialog('close');
    //Find the user opened dialog
    $('.cmdialog').each(function () {
        if ($(this).dialog('isOpen')) {
            $(this).trigger('click');//set focus to dialog 
            // have also replaced .trigger('click') with .focus() but to no avail
        }
    }).on('click', function() {   
       //if click is triggerd set the focus of the dialog. 
        if ($(this).prop('id') != 'LoadingData') {
            $(this).focus();
        }
    });
});

我也尝试将焦点设置到对话框中的第一个元素$('#DialogName:first-child').focus()$('#DialogName:first-child').trigger('click')但这也不起作用。

关于为什么没有设置焦点的任何想法?还是我误解/错误地使用.focus()and .trigger('event')

谢谢 :)

4

4 回答 4

2

按下 Escap 键时尝试以下代码关闭对话框:

$(document).keyup(function(e) {

  if (e.keyCode == 27) { $("#LoadingData").dialog('close'); }   // esc
});
于 2013-11-14T10:30:18.110 回答
2

我有同样的问题,并找到了非常优雅的解决方案,以防你想在实际点击之前关闭对话框:

$("#LoadingData").dialog({
   ...,
   focus: function () {
      $('#LoadingData').closest('.ui-dialog').focus();
   }
});

因此,我们只需要将焦点设置到父.ui-dialog容器,这样Esc就适用于所有情况。解决方案的缺点$(document).keyup,如果您有嵌套对话框,Esc按钮将关闭您最顶部的对话框和底部的对话框。

于 2017-03-14T22:39:28.140 回答
0

当元素获得焦点时,焦点事件被发送到元素。此事件隐式适用于一组有限的元素,例如表单元素(、等)和链接。文档在这里

您可以尝试对话框的 moveToTop 方法,也许它会有所帮助

我认为,在您的代码中,您应该在触发它之前绑定“click”事件。

于 2013-11-14T10:20:58.207 回答
0

以下代码即使对于打开的多个模式也应该有效:

        $(document).on('keydown','.modal-dialog',function(event){
            if (event.keyCode == 27) { 
                $(this).closest('.modal-dialog').find('[data-dismiss="modal"]').click();
            }
        });
于 2021-08-02T13:09:27.700 回答