重新打开后包含pickList更改位置的PopupPanel

时间:2012-05-24 10:29:52

标签: java jsf popup richfaces

我在popupPanel中有一个pickList。如果我打开popupPanel,它会出现在窗口的中间。如果我关闭并重新打开它,它会显示为向左移动到底部。只有当我在popupPanel中有pickList时才会发生这种情况。如果我删除它,一切都按预期工作。

下面我有一个片段可以重现问题。我正在使用RichFaces 4.1,这个问题可以在IE,Chrome和Firefox上重现(其他人没有经过测试)。

<?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">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html" 
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:rich="http://richfaces.org/rich" 
      xmlns:fn="http://java.sun.com/jsp/jstl/functions">

    <h:head></h:head>
    <h:body>
        <rich:popupPanel domElementAttachment="parent" id="popup" autosized="true" modal="true">
            <h:commandButton value="Close" onclick="#{rich:component('popup')}.hide();" />
            <rich:pickList>
                <f:selectItems value="#{fn:split('Test,TestTest,TestTestTest', ',')}" />
            </rich:pickList>
        </rich:popupPanel>
        <h:commandButton value="Panel" onclick="#{rich:component('popup')}.show();" />
    </h:body>
</html>

2 个答案:

答案 0 :(得分:2)

如果不了解原因,我可以通过将domElementAttachment="parent"更改为domElementAttachment="body"来解决此问题。如果在表单body中定义了弹出窗口,则可以用form替换。

我真的不知道为什么会这样,并且对解释非常感兴趣。

答案 1 :(得分:1)

原因是Richfaces bug 11736。已知的解决方法是:

  1. Sandros:将domElementAttachment从父级更改为正文。
  2. 在显示面板之前调用Javascript函数:

    onbeforeshow="fixPositioning('#{rich:clientId('popupPanelId')}');"
    

    功能定义如下:

    function fixPositioning(panelId) {
        var popupPanel = document.getElementById(panelId);
        if (popupPanel) {
            popupPanel.style.visibility = "hidden";
            popupPanel.style.display = "block";
        }
    }
    

    此解决方案描述为there