0

我对 jsf 组件(h:inputFile & h:selectBooleanCheckbox)有一个奇怪的问题。

即使我的鼠标位于页面上的其他位置,这两个组件都会获得焦点。这是代码:

<h:form id="logoUpload" enctype="multipart/form-data">
  <div>      
   <h:outputLabel rendered="true">
      <h:inputFile id="companyLogo" label="file" value="#{fileHandlerBean.part}" >
       <f:validator validatorId="FileUploadValidator" />
      </h:inputFile>
   </h:outputLabel>
 </div>

<div class="clear" />

<h:outputLabel rendered="true">
 <div>
   <div style="width: 5%">
    <h:selectBooleanCheckbox id="acceptToULogo" value="#{companyEditController.confirmToU}">
     <p:ajax event="change" update="buttonLogo" />
    </h:selectBooleanCheckbox>
 </div>

  <div style="width: 95%">
  <h:outputText value="Some Text " /> 
  </div>
 <br />

<h:commandButton id="buttonLogo" styleClass="formbutton" value="Upload"
      action="#{companyEditController.companyLogoUpload()}" 
      actionListener="#{fileHandlerBean.uploadCompanyLogo()}" 
      disabled="#{!companyEditController.confirmToU}"/>    
 </div>
</h:outputLabel>
</h:form>

如果我将鼠标移到 h:outputText 上,复选框将获得焦点。我对 h:inputFile 标签有同样的问题。我通过用 ah:outputLabel 标签包围它来解决它,但不幸的是它不适用于 selectBooleanCheckbox。

过去是否有人遇到过同样的问题并且知道解决方案?

4

1 回答 1

3

这是因为所有内容都包含在 h:outputLabel 标记中。此 outputLable 呈现为纯标签 html 元素。

您可以从W3C 规范中看到标签内的任何内容都会切换控件

该元素不会为用户呈现任何特殊的东西。但是,它为鼠标用户提供了可用性改进,因为如果用户单击元素内的文本,它会切换控件

要解决此问题,您需要使用 ah:panelGroup layout="block" 替换 h:output 标签标签,该标签呈现<div>

<h:panelGroup layout="block" rendered="true">
 <div>
   <div style="width: 5%">
    <h:selectBooleanCheckbox id="acceptToULogo" >
     <p:ajax event="change" update="buttonLogo" />
    </h:selectBooleanCheckbox>
 </div>

  <div style="width: 95%">
  <h:outputText value="Some Text " /> 
  </div>
 <br />

<h:commandButton id="buttonLogo" styleClass="formbutton" value="Upload"/>    
 </div>
</h:panelGroup>
于 2016-07-31T22:36:57.003 回答