在Primefaces上,在DialogFramework中,如何拦截<p:dialog> CLOSE事件并将其停止

时间:2018-02-21 13:29:24

标签: jsf primefaces mouseevent

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

使用JQuery,我试图拦截标签上的“onclick”(或“mousedown”)事件,该事件似乎代表标题栏中显示的CLOSE按钮。我在标签上尝试了同样的事情。

我也尝试更改标签的“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>

及以下,您可以找到我测试过的JQuery()指令。

 function onLoadDialog()
 {
 jQuery(".ui-dialog-titlebar-close").attr("href", "?");

 jQuery(".ui-icon-closethick").click(function(e)    
     {
     alert("onclick");        
     return false;            
     });    

 jQuery(".ui-icon-closethick").click(function(e)    
     {
     alert("onclick");        
     return false;            
     });    

 jQuery(".ui-icon-closethick").mousedown(function(e)    
     {
     alert("mousedown");        
     return false;            
     });    

 jQuery(".ui-dialog-titlebar-close").mousedown(function(e)
     {
     alert("mousedown");        
     return false;            
     });    

 jQuery(".ui-dialog-titlebar-close").click(function(e)    
     {
     alert("onclick");        
     return false;            
     });    

1 个答案:

答案 0 :(得分:1)

以下代码是一种解决方案。

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。这就是为什么获取小部件如此困难的主要原因。

你必须知道PrimeFaces DialogFramework小部件有2个特定的类别,其他对话框没有:这是&#34; ui-dialog&#34;和&#34; .ui-overlay-visible&#34;。

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

var wgDialog 
    = jQuery(".ui-dialog.ui-overlay-visible",window.parent.document)
      .each
        (function(nIndex)

警告:DialogFramework小部件未在执行代码的同一浏览器Windows中定义。 代码在Iframe Windows中执行,但小部件在其父窗口中定义! 这解释了JQuery的第二个参数是&#34; window.parent.document&#34;。

我从&#39; data-widgetvar&#39;获取PrimeFaces小部件名称。 PrimeFaces在浏览器中显示的xhtml文件中放置了表示DialogFramework的元素的属性。

var sWidgetName = $(this).attr('data-widgetvar');

所以,当我有这个名字时,我可以使用PF()函数轻松找到小部件。

var wgDialog = window.parent.PF(sWidgetName);

现在我有了小部件,我可以&#34;覆盖&#34; PrimeFaces.widget.Dialog.hide()函数。

wgDialog.hide 
    = function()
        {
        alert("OnHide()");    
        this.jq.hide();
        }

我显示一条消息,看我的代码是否正常工作,我调用hide()方法来有效地关闭DialogFramework。

感谢kukeltje的帮助。