Jsf 在DialogFramework中的Primefaces上,如何拦截<;p:dialog>;关闭事件并停止它

Jsf 在DialogFramework中的Primefaces上,如何拦截<;p:dialog>;关闭事件并停止它,jsf,primefaces,mouseevent,Jsf,Primefaces,Mouseevent,如何在DialogFramework小部件完全关闭之前拦截“关闭”事件,以允许用户停止关闭对话框 使用JQuery,我试图截获标签上的“onclick”(或“mousedown”)事件,该事件似乎表示标题栏中显示的关闭按钮。我在标签上试过同样的东西 我还尝试更改标记的“href=#”属性,但没有成功 我如何解决这个问题 下面可以找到由FSF/Primefaces生成的html代码 <div id="FormSession:j_idt272:0:CtcActionTable:0:j_idt2

如何在DialogFramework小部件完全关闭之前拦截“关闭”事件,以允许用户停止关闭对话框

使用JQuery,我试图截获标签上的“onclick”(或“mousedown”)事件,该事件似乎表示标题栏中显示的关闭按钮。我在标签上试过同样的东西

我还尝试更改标记的“href=#”属性,但没有成功

我如何解决这个问题

下面可以找到由FSF/Primefaces生成的html代码

<div id="FormSession:j_idt272:0:CtcActionTable:0:j_idt281_dlg" 
     class="ui-dialog ui-widget ui-widget-content ui-corner-all ui-shadow ui-hidden-container ui-draggable ui-resizable ui-overlay-visible" 
     role="dialog" 
     >
  <div class="ui-dialog-titlebar ui-widget-header ui-helper-clearfix ui-corner-top ui-draggable-handle">
    <span class="ui-dialog-title">CTC input: 82020</span>
      <a class="ui-dialog-titlebar-icon ui-dialog-titlebar-close ui-corner-all" href="#" role="button">
        <span class="ui-icon ui-icon-closethick"></span>
      </a>
  </div>

下面的代码是一个解决方案

var wgDialog 
    = jQuery(".ui-dialog.ui-overlay-visible",window.parent.document)
      .each
        (function(nIndex)
            {
            //var sId = $(this).attr('id');
            //var sNodeName = $(this).prop('nodeName');
            //var sClass = $(this).attr('class');
            var sWidgetName = $(this).attr('data-widgetvar');
            var wgDialog = window.parent.PF(sWidgetName);

            wgDialog.hide = function()
                {
                alert("OnHide()");    
                this.jq.hide();
                }
            });
首先,在Primefaces上,我们不可能在创建DialogFramework时提供widgetVarName。这就是为什么获取小部件如此困难的主要原因

您必须知道PrimeFacesDialogFramework小部件有两个其他对话框没有的特定类:即“ui对话框”和“.ui覆盖可见”

此代码的第一部分包括搜索DialogFramework JQuery小部件

var wgDialog 
    = jQuery(".ui-dialog.ui-overlay-visible",window.parent.document)
      .each
        (function(nIndex)
警告:在执行代码的同一浏览器窗口中未定义DialogFramework小部件。 代码在Iframe窗口中执行,但小部件在其父窗口中定义! 这解释了JQuery的第二个参数“window.parent.document”

我从PrimeFaces放在元素中的“data widgetvar”属性中获取PrimeFaces小部件名称,该元素表示浏览器上显示的xhtml文件中的DialogFramework

var sWidgetName = $(this).attr('data-widgetvar');
因此,当我有这个名字时,我可以使用PF()函数轻松地找到小部件

var wgDialog = window.parent.PF(sWidgetName);
现在我有了小部件,我可以“覆盖”PrimeFaces.widget.Dialog.hide()函数

wgDialog.hide 
    = function()
        {
        alert("OnHide()");    
        this.jq.hide();
        }
我显示一条消息以查看代码是否正常工作,并调用hide()方法以有效关闭DialogFramework


感谢kukeltje的帮助。

下载源代码,检查它,看看是否可以创建补丁,例如通过覆盖self函数。源代码已打开。能否为dialogFramework分配id?如果我没记错的话,默认情况下widgetVar值与_小部件相同。既然你知道这个值,那么你应该能够检索到它。很好的解释补充说。。。把事情讲清楚
wgDialog.hide 
    = function()
        {
        alert("OnHide()");    
        this.jq.hide();
        }