【问题标题】:Primefaces <p:tooltip> does not disappear after another Ajax requestPrimefaces <p:tooltip> 在另一个 Ajax 请求后不会消失
【发布时间】:2015-07-15 11:07:53
【问题描述】:

假设我的&lt;p:dataTable&gt; 中有一些工具提示。 当我更改dataTable 的页面时,当另一个页面出现时,我在任何工具提示上移动鼠标 - 它会显示,但在加载另一个页面后,工具提示永远不会消失。我尝试使用p:ajax 更新它, p:remoteCommand 但没有任何帮助,实际上这使另一个 Ajax 请求和工具提示也卡住了。只有整页重新加载 F5 有效。

有人遇到过这样的问题吗? 非常感谢您的帮助!

【问题讨论】:

标签: javascript ajax jsf primefaces


【解决方案1】:

如果其他人对此感到困惑,我想我找到了一个值得尝试的解决方案。 就我而言,我有一个工具提示,当我将鼠标悬停在命令按钮上时会显示,但如果我单击它,它将运行 ajax 请求并返回,更新组件并完成,但工具提示仍会保留。这就是我为修复它所做的。

<p:tooltip id="saveDeleteTooltip" globalSelector="[data-tooltip]" position="top" hideEvent="mouseleave click"/>

为 hideEvent 属性提供两个事件,并且似乎可以识别和使用两者。第一个是正常的鼠标悬停,但是当我单击命令按钮时,第二个会触发它确实会隐藏工具提示,就像它应该做的那样。

【讨论】:

  • 这可行,但我现在遇到的问题是,在再次将 ajax 事件悬停在元素上之后,不再显示工具提示
  • 这对我很有帮助。我在模板文件中使用了全局工具提示,我希望每个工具提示都隐藏在 mouseleave 和 click 事件中。因此,将hideEvent="mouseleave click" 添加为全局&lt;p:tooltip&gt; 组件的属性非常完美。谢谢!
  • 与 bradykey 一样成功。这对我来说真的很有用: hideevent 属性只添加在模板文件中,在全局工具提示中,这消除了很多挫败感;非常感谢。
【解决方案2】:

这看起来像一个 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 对象也没有记录。


更新。正如 russellelbert 在 cmets 中指出的那样,自 PrimeFaces 7.0 起,该方法的名称就是 hide - 没有下划线。
此外,由于 PrimeFaces 10.0,PrimeFaces.widgetsTooltip#hide 都是记录在案的客户端 API 的一部分。

【讨论】:

  • 感谢您的帮助! :) 但这不能正常工作。我尝试将“textTipVar”更改为 PF(“textTipVar”)。当然将 widgetVar 添加到工具提示(已复制)
  • 你为什么要尝试改变它?你的 p:tooltip 在桌子外面吗?已发布您的代码。
  • 编辑进一步解释了为什么它是这样完成的;修复了 js 代码中无效的 cmets。
  • 非常感谢,完美运行!必须将脚本移出
    ! :) 有时不得不使用widgetVar="imprVar#{rowIndex}:#{user.id}",因为在许多行中有相同的参与者:)
  • 这太棒了!我不得不从 if 语句的正文中删除下划线:PrimeFaces.widgets[w].hide();(PrimeFaces 版本 7.0)
猜你喜欢
  • 2016-02-03
  • 1970-01-01
  • 1970-01-01
  • 2018-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-23
  • 2016-04-01
相关资源
最近更新 更多