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