Primefaces 多个对话框与 closeOnEscape

Primefaces Multiple Dialogs with closeOnEscape

我有 2 个对话(A 和 B)closeOnEscape="true"

两个对话框都是模态的,里面有 <p:focus context="innerForm" />

对话框 A 打开对话框 B。是的,我知道,这是一个糟糕的设计,但是...

问题是,当我在对话框 B 上按 ESC 时,它会正确关闭并将焦点 return 到对话框 A,但 ESC 不会关闭此对话框。

这是一个错误,已在 GitHub 上向 PrimeFaces 报告: https://github.com/primefaces/primefaces/issues/6677

公关:https://github.com/primefaces/primefaces/pull/6678

将在 PF 9.0

将此添加到 PF 后加载的 JS 以立即修复它:

if (PrimeFaces.widget.Dialog) {
    PrimeFaces.widget.Dialog.prototype.bindEvents = function() {
        var $this = this;

        //Move dialog to top if target is not a trigger for a PrimeFaces overlay
        this.jq.on("mousedown", function(e) {
            if (!$(e.target).data('primefaces-overlay-target')) {
                $this.moveToTop();
            }
        });

        this.icons.on('mouseover', function() {
            $(this).addClass('ui-state-hover');
        }).on('mouseout', function() {
            $(this).removeClass('ui-state-hover');
        }).on('focus', function() {
            $(this).addClass('ui-state-focus');
        }).on('blur', function() {
            $(this).removeClass('ui-state-focus');
        });

        this.closeIcon.on('click', function(e) {
            $this.hide();
            e.preventDefault();
        });

        this.maximizeIcon.on("click", function(e) {
            $this.toggleMaximize();
            e.preventDefault();
        });

        this.minimizeIcon.on("click", function(e) {
            $this.toggleMinimize();
            e.preventDefault();
        });

        if (this.cfg.closeOnEscape) {
            $(document).on('keydown.dialog_' + this.id, function(e) {
                var keyCode = $.ui.keyCode;
                if (e.which === keyCode.ESCAPE && $this.isVisible()) {
                    var active = parseInt($this.jq.css('z-index')) === parseInt($('.ui-dialog:visible').last().css('z-index'));
                    if (active) {
                        $this.hide();
                    }
                };
            });
        }
    };
}