Jsf 对单击的菜单按钮作出反应

Jsf 对单击的菜单按钮作出反应,jsf,primefaces,Jsf,Primefaces,我们有定期刷新文档的代码。我们还将菜单按钮(primefaces)作为JSF页面的一部分,最初作为列中dataTable单元格的一部分。我们希望在单击菜单按钮时禁用刷新(菜单展开),并在关闭菜单按钮时重新启用刷新(以防止页面刷新关闭菜单) 我尝试使用java脚本捕获菜单按钮事件,但没有成功。问题的一部分是我不知道如何从javascript中唯一地识别JSF组件,因为ID在试图捕获事件时似乎不起作用。也不存在我可以连接到javascript的任何令人满意的事件属性(作为Primefaces菜单按钮

我们有定期刷新文档的代码。我们还将菜单按钮(primefaces)作为JSF页面的一部分,最初作为列中dataTable单元格的一部分。我们希望在单击菜单按钮时禁用刷新(菜单展开),并在关闭菜单按钮时重新启用刷新(以防止页面刷新关闭菜单)

我尝试使用java脚本捕获菜单按钮事件,但没有成功。问题的一部分是我不知道如何从javascript中唯一地识别JSF组件,因为ID在试图捕获事件时似乎不起作用。也不存在我可以连接到javascript的任何令人满意的事件属性(作为Primefaces菜单按钮的一部分)

下面是我可以提取的最小代码。为了简单起见,我将菜单提取为独立的(不是dataTable的一部分),问题仍然存在。我可能在其中引用了bean和字典文件,但您应该了解:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
                xmlns:h="http://java.sun.com/jsf/html"
                xmlns:f="http://java.sun.com/jsf/core"
                xmlns:p="http://primefaces.org/ui"
                xmlns:c="http://java.sun.com/jsp/jstl/core"
                xmlns:ui="http://java.sun.com/jsf/facelets">

   <h:form id="virtualMachineTableForm">

      <!-- Lazy load table -->
      <p:remoteCommand name="lazyload" 
                       update=":vmGroupTabs:virtualMachineTableForm:testMenu" 
                       actionListener="#{backupGroupController.refreshHard()}" />

      <!-- Refresh hard button -->
      <p:commandButton id="refreshButton" 
                       update=":vmGroupTabs:virtualMachineTableForm:testMenu" 
                       icon="ui-icon-refresh" 
                       immediate="true" 
                       title="#{msg.action_refresh}" 
                       actionListener="#{backupGroupController.refreshHard()}"/>

      <p:menuButton
         id="testMenu"
         value="#{msg.menuButton_SelectItem}">
         <p:menuitem
            value="Toggle refresh"
            onclick="toggleRefreshState()">
         </p:menuitem>
      </p:menuButton>

      <!-- Poller -->
      <p:poll interval="5" listener="#{backupGroupController.refreshSoft()}" 
              update=":vmGroupTabs:virtualMachineTableForm:testMenu" widgetVar="poll" />
   </h:form>

   <script type="text/javascript">

      var toggleRefreshState = function(){
         if (poll.isActive()) {
            poll.stop();
            alert("Poller stopped" );
         }
         else {
            poll.start();
            alert("Poller started" );
         }
      };

      $(document).ready(function(){
         poll.start();
         setTimeout("lazyload();", 100);
      });
//
//      $("???SomeWayToIdentifyMenu???").on({
//            onMenuOpen???: function(){
//               alert("Opening menu - stopping refresh");
//            }
//            onMenuClose???: function(){
//               alert("Closing menu - starting refresh");
//            }
//      });
</script>

</ui:composition>

var toggleRefreshState=函数(){
if(poll.isActive()){
poll.stop();
警报(“轮询器停止”);
}
否则{
poll.start();
警报(“轮询器启动”);
}
};
$(文档).ready(函数(){
poll.start();
setTimeout(“lazyload();”,100);
});
//
//$(“??以某种方式标识菜单?”)。打开({
//onMenuOpen???:函数(){
//警报(“打开菜单-停止刷新”);
//            }
//onMenuClose???:函数(){
//警报(“关闭菜单-开始刷新”);
//            }
//      });
  • 是否可以使用Java脚本捕获客户端上jsf primefaces菜单按钮的菜单打开/关闭(或者任何)事件
  • 是否可以确定菜单按钮是否打开/关闭,以禁用刷新以防止菜单消失
感谢你的帮助,谢谢你


Werner

实现这一点的最简单方法是将javascript添加到菜单按钮中,以更改全局变量,并让定期刷新读取该全局变量并相应地执行操作。由于您没有代码或指示您正在使用的组件,因此我无法得到更具体的说明。下面是我希望看到的javascript代码

window.preventRefresh = false;

function doPeriodicRefresh() {
  if(!preventRefresh) {
    window.location.reload();
  }
} 

setInterval(doPeriodicRefresh, 60000);

function showMenu() {
  window.preventRefresh = true;
  menu.show();
}

function hideMenu() {
  window.preventRefresh = false;
  menu.hide();
}
菜单的鼠标指针/鼠标指针应调用showMenu和hideMenu,任何参数都必须通过代理


这还取决于您如何进行定期刷新。如果您使用的是
refresh
标题或元标记,我相信您无法从javascript中阻止这些

最后都是html、javascript和css。PF中的Javascript主要是jquery,所有组件背后都有Javascript代码,以便在客户端运行

有几种方法可以插入这个。将普通jquery事件处理程序附加到正确的元素(可通过浏览器开发人员工具进行检查和/或检查PrimeFaces javascript的功能)是一个选项,但当发生ajax调用时,必须反复应用它们。另一个选项是覆盖基本菜单按钮功能,而不更改PF原始源

由于代码是开源的,您可以尝试查找PrimeFaces菜单按钮的javascript源代码。在本例中,它是在中定义的,可以相当容易地查看(并且写得很清楚)

在那里,您可以看到添加到组件中的所有事件,以及是否存在onBeforeShow处理程序(PrimeFaces中的某些组件具有这些处理程序,菜单按钮没有,这对您来说很不幸,但到目前为止,我还没有看到这样的用例)

不幸的是,覆盖基本功能的缺点是,这将适用于所有菜单按钮。因此,您必须实现一些逻辑来决定是否确实需要执行某些自定义操作。有几种方法可以做到这一点,但我认为最简单的方法是检查是否存在特定的样式类(例如“stopPoll”)

现在转到实际覆盖:

var oldPFShow = PrimeFaces.widget.MenuButton.prototype.show
PrimeFaces.widget.MenuButton.prototype.show = function() {
  alert("before show");
  oldPFShow.apply(this, arguments);
}

var oldPFHide = PrimeFaces.widget.MenuButton.prototype.hide
PrimeFaces.widget.MenuButton.prototype.hide = function() {
  oldPFHide.apply(this, arguments);
  alert("after hide");
}
(不要忘记调用原始函数)

在我放置警报的地方,如果页面上有一个菜单按钮,或者想要所有菜单按钮的行为,则必须实现对类存在性的检查,或者将其忽略

一些一般性意见:(稍后将删除,但难以在意见中格式化)

我尝试使用java脚本捕获菜单按钮事件,但没有 有用

发帖尝试可能会有所帮助,因为有时候你很接近,只是有一些小疏忽)。在这种情况下,为那些试图给予支持的人写一个答案就容易多了

部分问题是我不知道如何识别 JSF组件是javascript中唯一的组件

这是一个通用的PrimeFaces(与组件集不同)。应用widgetVar属性,并使用PF(“”)为特定组件提供句柄


正如您所看到的,使用PrimeFaces菜单按钮是最重要的。拥有一小段代码(比现在小,但对mcve的赞美)就是对这一点的确认(假设是一切之母…)添加“javascript”作为一个非常通用的标记,通常会吸引“错误”的人,就像“java”一样,所以请下次不要使用这些标记

我已经读过了,我不确定你在说什么。你不需要源代码来回答这个问题。@Kukeltje,我不是一个web开发人员,因此我对这些事情不学究(也许我不会学究)。我注意到menuButton是一个primefaces组件(也是jsf…)。我从来没有提到过基本的jsf,但我将把它添加到问题中。至少,我最近才开始进行web开发。你很感激