Jsf 对单击的菜单按钮作出反应
我们有定期刷新文档的代码。我们还将菜单按钮(primefaces)作为JSF页面的一部分,最初作为列中dataTable单元格的一部分。我们希望在单击菜单按钮时禁用刷新(菜单展开),并在关闭菜单按钮时重新启用刷新(以防止页面刷新关闭菜单) 我尝试使用java脚本捕获菜单按钮事件,但没有成功。问题的一部分是我不知道如何从javascript中唯一地识别JSF组件,因为ID在试图捕获事件时似乎不起作用。也不存在我可以连接到javascript的任何令人满意的事件属性(作为Primefaces菜单按钮的一部分) 下面是我可以提取的最小代码。为了简单起见,我将菜单提取为独立的(不是dataTable的一部分),问题仍然存在。我可能在其中引用了bean和字典文件,但您应该了解:Jsf 对单击的菜单按钮作出反应,jsf,primefaces,Jsf,Primefaces,我们有定期刷新文档的代码。我们还将菜单按钮(primefaces)作为JSF页面的一部分,最初作为列中dataTable单元格的一部分。我们希望在单击菜单按钮时禁用刷新(菜单展开),并在关闭菜单按钮时重新启用刷新(以防止页面刷新关闭菜单) 我尝试使用java脚本捕获菜单按钮事件,但没有成功。问题的一部分是我不知道如何从javascript中唯一地识别JSF组件,因为ID在试图捕获事件时似乎不起作用。也不存在我可以连接到javascript的任何令人满意的事件属性(作为Primefaces菜单按钮
<?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开发。你很感激