a4j:support onchange event with Internet Explorer
cbax007 Oct 23, 2007 5:45 PMI have noticed some strange behavior when trying to capture onchange events for ui components with Internet Explorer (IE 6). What I have noticed is that the onchange event is not fired when I change a component (like changing the value of a checkbox by clicking in it) unless I click somewhere else on the page (or on another component) after I change the initial component. When using Firefox, the event is fired as expected, which is when I change the component. I have included some sample code below with 3 components (checkbox, radio button and dropdown menu) that have nested a4j:support looking for the onchange event. IN IE, the only time the page updates the correct h:outputText is after I click somewhere else after changing the component. Is this expected behavior?
Here is the .xhtml page:
<html xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:rich="http://richfaces.ajax4jsf.org/rich" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html" xmlns:a4j="https://ajax4jsf.dev.java.net/ajax" xmlns:c="http://java.sun.com/jstl/core" xmlns:t="http://myfaces.apache.org/tomahawk"> <ui:composition> <h:form id="MyForm"> <rich:panel> <table> <tr> <td> <h:selectBooleanCheckbox id="MyCheckbox" value="#{TestBean.checkboxValue}"> <a4j:support event="onchange" reRender="CheckboxOutput" action="#{TestBean.checkboxChanged}"/> </h:selectBooleanCheckbox> </td> <td width="20"/> <td> <t:selectOneRadio id="MyRadio" layout="spread" value="#{TestBean.radioValue}"> <a4j:support event="onchange" action="#{TestBean.radioChanged}" reRender="RadioOutput"/> <f:selectItem itemLabel="Value 1" itemValue="V1"/> <f:selectItem itemLabel="Value 2" itemValue="V2"/> </t:selectOneRadio> <t:radio for="MyRadio" index="0"/> <t:radio for="MyRadio" index="1"/> </td> <td width="20"/> <td> <h:selectOneMenu id="MyMenu" value="#{TestBean.menuValue}"> <a4j:support event="onchange" action="#{TestBean.menuChanged}" reRender="MenuOutput"/> <f:selectItem itemLabel="Please select" itemValue=""/> <f:selectItem itemLabel="Menu Val 1" itemValue="MV1"/> <f:selectItem itemLabel="Menu Val 2" itemValue="MV2"/> </h:selectOneMenu> </td> </tr> </table> <br/> <table> <tr> <td>Checkbox Value: <h:outputText id="CheckboxOutput" value="#{TestBean.checkboxValue}"/></td> </tr> <tr> <td>Radio Value: <h:outputText id="RadioOutput" value="#{TestBean.radioValue}"/></td> </tr> <tr> <td>Menu Value: <h:outputText id="MenuOutput" value="#{TestBean.menuValue}"/></td> </tr> </table> </rich:panel> </h:form> </ui:composition> </html>
And here is the backing bean (session scoped in faces-config.xml):
public class TestBean { private Boolean checkboxValue = false; private String radioValue = "V1"; private String menuValue = ""; public String radioChanged(){ System.out.println("In radio changed..."); return ""; } public String checkboxChanged(){ System.out.println("In checkbox changed..."); return ""; } public String menuChanged(){ System.out.println("In menu changed..."); return ""; } /** * Gets the checkboxValue * @return Boolean */ public Boolean getCheckboxValue() { return checkboxValue; } /** * Sets the checkboxValue * @param checkboxValue The checkboxValue to set. */ public void setCheckboxValue(Boolean checkboxValue) { this.checkboxValue = checkboxValue; } /** * Gets the menuValue * @return String */ public String getMenuValue() { return menuValue; } /** * Sets the menuValue * @param menuValue The menuValue to set. */ public void setMenuValue(String menuValue) { this.menuValue = menuValue; } /** * Gets the radioValue * @return String */ public String getRadioValue() { return radioValue; } /** * Sets the radioValue * @param radioValue The radioValue to set. */ public void setRadioValue(String radioValue) { this.radioValue = radioValue; } }