假设我的<p:dataTable>
中有一些工具提示。当我更改dataTable
的页面时,当另一个页面变老时,我在任何工具提示上移动鼠标——它会显示出来,但在加载另一个网页后,工具提示永远不会消失。。我已经尝试过使用p:ajax
、p:remoteCommand
来更新它,但没有任何帮助,实际上这导致了另一个Ajax
请求和工具提示也被卡住了。只有整页重新加载F5
才能工作。
有人遇到过这样的问题吗?非常感谢你的帮助!
如果其他人对此感到困惑,我想我找到了一个值得尝试的解决方案。在我的例子中,当我悬停在commandButton上时,我有一个工具提示,但如果我点击它,它会运行ajax请求并返回,更新组件并完成,但工具提示仍然会保留。这就是我修复它的方法。
<p:tooltip id="saveDeleteTooltip" globalSelector="[data-tooltip]" position="top" hideEvent="mouseleave click"/>
为hideEvent属性提供两个事件,并且似乎可以识别和使用这两个事件。第一个是普通的鼠标输出,但第二个是在我点击命令按钮时触发的,它确实像应该做的那样隐藏了工具提示。
这看起来像一个PrimeFaces错误,但您可以通过JS隐藏分页事件的工具提示来解决它。
<p:dataTable value="#{bean.val}" var="row" rowIndexVar="rowIndex" rows="10" paginator="true">
<p:ajax event="page" oncomplete="hideTooltips();" />
<p:column>
<h:outputText id="text" value="#{row}" />
<!--
since p:tooltip is located inside an iterative component (p:dataTable), we can't
just define a static widgetVar value, because there will be a widget instance for
each iteration, and each instance must have a unique widgetVar value, so we'll
use rowIndex to achieve that
-->
<p:tooltip widgetVar="textTipVar#{rowIndex}" for="text" value="Tip" />
</p:column>
</p:dataTable>
<script>
function hideTooltips() {
/*
we've defined a bunch of widgetVars with a dynamic name, so we'll iterate over
all widgets on the page and find the ones we need by looking for a known
widgetVar prefix
*/
for (var w in PrimeFaces.widgets) {
if (w.indexOf('textTipVar') === 0) {
PrimeFaces.widgets[w]._hide();
}
}
}
</script>
这使用了一个未记录的Tooltip小部件方法_hide
,在更新到另一个PrimeFaces版本时请记住这一点,例如方法的名称可能会更改。PrimeFaces.widgets
对象也没有文档。
更新。正如Russelllelbert在评论中指出的那样,自PrimeFaces 7.0以来,该方法的名称仅为hide
,没有下划线
此外,由于PrimeFaces 10.0,PrimeFaces.widgets
和Tooltip#hide
都是记录的客户端API的一部分。