当前位置: 首页 > 知识库问答 >
问题:

在显示p:对话框之前如何等待图像加载?

段干麒
2023-03-14

我的应用程序中有一个页面,它使用PrimeFaces DataTable来显示人员列表,其中第一列中每个人的小图像。当用户单击作为p:命令链接一部分的小图像时,我使用ajax在p:对话框中更新p: graph icImage,其中包含所选图像的路径,并使用命令链接的完整显示对话框。最后,我使用对话框的onShow将对话框居中。以下是xhtml:

.
.
.
<p:commandLink
    update="portrait"
    oncomplete="PF('portrait-dialog').show());">
    <f:setPropertyActionListener
        value="#{portrait}"
        target="#{portraits.portrait}" />
    <p:graphicImage
        value="/files#{portrait.path}"
        style="height: 192px; width: auto;" />
</p:commandLink>
.
.
.
<p:dialog
    id="portrait-dialog"
    showHeader="false"
    widgetVar="portrait-dialog"
    modal="true"
    responsive="true"
    onShow="positionDialog('portrait-dialog')">
    <p:graphicImage
        id="portrait"
        style="max-height: 85vh;"
        value="/files#{portraits.portrait.path}"
        onclick="PF('portrait-dialog').hide();" />
</p:dialog> 

上面的代码工作得很好,但对列表中的小图像和对话框中的大图像使用了单个图像文件。我决定对大小图像使用不同的图像文件,因此创建了以下代码

.
.
.
<p:commandLink
    update="portrait"
    oncomplete="PF('portrait-dialog').show();">
    <f:setPropertyActionListener
        value="#{portrait}"
        target="#{portraits.portrait}" />
    <p:graphicImage
        value="/files#{portrait.getPath('_162x288.jpg')}"
        style="height: 192px; width: auto;" />
</p:commandLink>
.
.
.
<p:dialog
    id="portrait-dialog"
    showHeader="false"
    widgetVar="portrait-dialog"
    modal="true"
    responsive="true"
    onShow="positionDialog('portrait-dialog')">
    <p:graphicImage
        id="portrait"
        style="max-height: 85vh;"
        value="/files#{portraits.portrait.getPath('_810x1440.jpg')}"
        onclick="PF('portrait-dialog').hide();" />
</p:dialog>

不幸的是,上面的代码在用户第一次选择小图像时没有正确地将对话框居中放置在页面上。如果用户关闭对话框,然后再次选择小图像,则对话框在页面上正确居中。我怀疑这与在显示对话框之前没有完全下载大图像有关,因此我在oncomplete中添加了50ms延迟,如下所示。

<p:commandLink
    update="portrait"
    oncomplete="setTimeout(function(){PF('portrait-dialog').show();}, 50);">
    <f:setPropertyActionListener
        value="#{portrait}"
        target="#{portraits.portrait}" />
    <p:graphicImage
        value="/files#{portrait.getPath('_162x288.jpg')}"
        style="height: 192px; width: auto;" />
</p:commandLink>

这在大多数情况下解决了问题,但有时对话框仍然没有正确地集中在第一个选择上。

如何在显示p:对话框之前等待图像加载?

共有1个答案

令狐良骏
2023-03-14

我通过将对话框显示从commandLink的oncomplete移动到对话框的imageGraphic的onload passthrough属性来解决这个问题,如下所示。

.
.
.
<p:commandLink
    update="portrait"
    oncomplete="">
    <f:setPropertyActionListener
        value="#{portrait}"
        target="#{portraits.portrait}" />
    <p:graphicImage
        value="/files#{portrait.getPath('_162x288.jpg')}"
        style="height: 192px; width: auto;" />
</p:commandLink>
.
.
.
<p:dialog
    id="portrait-dialog"
    showHeader="false"
    widgetVar="portrait-dialog"
    modal="true"
    responsive="true"
    onShow="positionDialog('portrait-dialog')">
    <p:graphicImage
        id="portrait"
        style="max-height: 85vh;"
        a:onload="PF('portrait-dialog').show();"
        value="/files#{portraits.portrait.getPath('_810x1440.jpg')}"
        onclick="PF('portrait-dialog').hide();" />
</p:dialog>

现在,我的对话框在显示和居中之前等待图像文件下载,一切正常。

以下是我在PrimeFaces论坛上的原始问题的链接。

https://forum.primefaces.org/viewtopic.php?f=3

 类似资料:
  • 我正在尝试等待Selenium在等待另一个元素之前切换帧。即。 如果我抛出一个简单的之前的第二个等待它的功能很好,但没有我得到以下错误: 在等待填充该框架内的元素之前,是否有更好的方法等待框架上下文切换完成?

  • 编写测试等待对话框的可能方法是什么,应该同时支持dialogFragment和dialog(AlertDialog)?。

  • 问题内容: 我正在尝试等待Selenium切换变化的帧,然后再等待另一个元素。即 如果我在第二次等待之前进行一次简单的处理,它的功能就很好,但是如果没有这样做,我会收到以下错误消息: 在等待填充该框架中的元素之前,是否有更好的方法来等待框架上下文切换完成? 问题答案: 您需要考虑以下几点: 切换到框架的代码行看起来很完美,不会引发任何错误: 在下一行中,您尝试了 ExpectedCondition

  • 我使用最新版本的Google Play Services(7.0),按照指南中给出的步骤,我启用了如下所示的位置对话框,其中有一个“从不”按钮。我的应用程序强制要求定位,所以我不想向用户显示“从不”,因为一旦用户点击“从不”,我就无法获得定位或再次请求定位。 谷歌地图只有yes和no按钮而没有never按钮,你知道如何实现同样的功能吗?

  • 我在应用程序中使用“Android-Rate”库。当我尝试显示对话框时遇到问题。 当对话框打开时,里面有我放的句子,但我看不到下图中的按钮: 如您所见,文本显示但按钮未显示,就像按钮不可见一样,但如果您单击对话框的白色部分,它将打开App Store页面。 这是我的代码: 我还将此代码放在<code>Strings.xml</code>中: 你能帮我解决这个问题吗?

  • 问题内容: 这个想法是在下载真正的高分辨率图像之前显示图像的低分辨率版本,最好使用img标签。 低分辨率图像将首先显示,下载后将替换为高分辨率图像。如何才能做到这一点?是否可以编辑img.src属性,还是应该创建其他内容(例如具有背景的包装div或另一个临时div)? 问题答案: 您可能想要创建一个指令,实际上我将把hires作为属性,因此默认情况下它以绝杀开头。 JS: HTML: