动态呈现的弹出式面板上的Rich:commandLink和rich:commandButton在IE 8中不起作用

时间:2014-02-12 13:54:31

标签: ajax jsf internet-explorer-8 richfaces myfaces

我使用Myfaces 2.1.12和Richfaces 4.3.3创建了一个JSF应用程序。在普通浏览器上,应用程序运行正常,但客户端坚持认为他还需要使用“浏览器” - IE8,版本8.0.7601。我遇到了很多问题。

我在主窗体上有一个rich:extendedDataTable。单击一行是打开一个包含详细信息的弹出窗口(显示并填充所选行的数据)。也可以从工具栏调用弹出窗口,这样它会显示首次加载页面时选择的行的详细信息。

该表定义如下(为清晰起见,删除了列定义)

<h:form>
    <rich:extendedDataTable id="table" rowClass="row" rows="15"
        value="#{scheduleController.allSchedules}" var="schedule" selectionMode="single"
        selection="#{scheduleListBean.selectedSchedule.selection}" clientRows="15">
        <a4j:ajax render="scheduleDetails, toolbar, transferListPopup" event="selectionchange"
            listener="#{scheduleController.scheduleSelectionChanged}"
            oncomplete="#{rich:component('scheduleDetailsPopup')}.show()"/>

        ...
    </rich:extendedDataTable>
</h:form>

弹出窗口包含几个面板网格,其中一个包含一些按钮。

<h:panelGrid columns="2" styleClass="alignTop" id="scheduleDetails">
    ...

    <rich:panel header="#{generalProperties.controls}">
        <h:panelGrid columns="4">

            <a4j:commandLink styleClass="btn" type="button"
                render="table@body, transferDetailsPanel, destinationPanel, datesPanel"
                oncomplete="if (#{facesContext.maximumSeverity == null}) #{rich:component('scheduleDetailsPopup')}.hide()"
                status="pleaseWait" action="#{scheduleController.saveSchedule}"
                value="#{generalProperties.save}" />


            <h:commandButton class="btn" action="#{scheduleController.changeScheduleStatus}"
                value="#{applicationProperties.changeStatus}" status="pleaseWait" type="button"
                disabled="#{scheduleController.currentSchedule.id == null}">
                <rich:componentControl target="changeScheduleStatusPopup" operation="show" />
            </h:commandButton>

            <h:commandButton class="btn" value="#{generalProperties.delete}" status="pleaseWait" type="button"
                disabled="#{scheduleController.currentSchedule.id == null}">
                <rich:componentControl target="removeSchedulePopup" operation="show" />
            </h:commandButton>

            <a4j:commandButton styleClass="btn" type="button"
                render="fileTable, transferDetailsPanel, destinationPanel, datesPanel"
                disabled="#{scheduleController.currentSchedule.id == null}"
                oncomplete="if (#{facesContext.maximumSeverity == null}) #{rich:component('transferListPopup')}.show()"
                status="pleaseWait" value="#{applicationProperties.transferHistory}" />

        </h:panelGrid>
    </rich:panel>

</h:panelGrid>

disabled =“#{scheduleController.currentSchedule.id == null}”部分检查bean是否选择了任何内容,因为弹出窗口也用于添加新行。

在Firefox上一切正常。在IE8上:

  • 点击commandLink不起作用(除了“#”之外没有任何反应 当从弹出窗口调用弹出窗口时,它附加到浏览器中的url) 扩展数据表(渲染),但在从中调用时工作 工具栏。
  • 当从扩展数据表(呈现)调用弹出窗口时,
  • 单击commandButton不起作用(页面被重新加载而不是执行ajax请求),但是当从 工具栏。
  • 如果我从命令按钮中删除type =“button”,则单击它们会导致整个页面重新加载

我错过了什么?

1 个答案:

答案 0 :(得分:0)

答案就是问题本身。我重建了UI,以便在ajax请求中不呈现任何按钮。这种方式适用于IE 8和IE 9。

即:不是基于bean设置disabled属性并渲染按钮,而是必须使用每个按钮的两个实例。我通过使用composite将表单提取到复合​​组件中来实现这一点:insertChildren只是为了在正确的状态下注入按钮并在页面上有两个表单实例,当用户单击新的计划/编辑计划时显示正确的实例。

这种方法的缺点是我必须将显示弹出窗口的组件的render属性设置为不同的形式(在本例中为面板),如果我使用Mojarra则会出现问题(请参阅此问题) :javax.faces.ViewState is missing after ajax render