gpt4 book ai didi

jsf -

generates input field behind select box

转载 作者:行者123 更新时间:2023-12-02 21:15:25 24 4
gpt4 key购买 nike

我正在尝试将标签标记与我的下拉菜单关联起来,以便屏幕阅读器可以访问它。我注意到,当使用 p:selectOneMenu primefaces 时,会生成一个不应该存在的输入元素。应用 p:outputLabel 时,它似乎工作正常(即单击标签文本,焦点移动到下拉菜单)。然而事实证明,焦点实际上正在移动到输入元素,并且选择元素无法通过键盘访问(tabindex =“-1”)。以下是来自 primefaces 网站的示例: http://www.primefaces.org/showcase/ui/input/oneMenu.xhtml

<h:form>
<p:messages autoUpdate="true" />

<h:panelGrid columns="2" style="margin-bottom:10px" cellpadding="5">
<p:outputLabel for="console" value="Basic:" />
<p:selectOneMenu id="console" value="#{selectOneMenuView.console}" style="width:125px">
<f:selectItem itemLabel="Select One" itemValue="" />
<f:selectItem itemLabel="Xbox One" itemValue="Xbox One" />
<f:selectItem itemLabel="PS4" itemValue="PS4" />
<f:selectItem itemLabel="Wii U" itemValue="Wii U" />
</p:selectOneMenu>

<p:outputLabel for="car" value="Grouping: " />
<p:selectOneMenu id="car" value="#{selectOneMenuView.car}">
<f:selectItem itemLabel="Select One" itemValue="" />
<f:selectItems value="#{selectOneMenuView.cars}" />
</p:selectOneMenu>

<p:outputLabel for="city" value="Editable: " />
<p:selectOneMenu id="city" value="#{selectOneMenuView.city}" effect="fold" editable="true">
<f:selectItem itemLabel="Select One" itemValue="" />
<f:selectItems value="#{selectOneMenuView.cities}" />
</p:selectOneMenu>

<p:outputLabel for="advanced" value="Advanced:" />
<p:selectOneMenu id="advanced" value="#{selectOneMenuView.theme}" converter="themeConverter" panelStyle="width:180px"
effect="fade" var="t" style="width:160px" filter="true" filterMatchMode="startsWith">
<f:selectItems value="#{selectOneMenuView.themes}" var="theme" itemLabel="#{theme.displayName}" itemValue="#{theme}" />

<p:column style="width:10%">
<h:outputText styleClass="ui-theme ui-theme-#{t.name}" />
</p:column>

<p:column>
<h:outputText value="#{t.displayName}" />
</p:column>
</p:selectOneMenu>
</h:panelGrid>

<p:commandButton value="Submit" update="display" oncomplete="PF('dlg').show()" icon="ui-icon-check" />

<p:dialog header="Values" modal="true" showEffect="bounce" widgetVar="dlg" resizable="false">
<p:panelGrid columns="2" id="display" columnClasses="label,value">
<h:outputText value="Basic:" />
<h:outputText value="#{selectOneMenuView.console}" />

<h:outputText value="Grouping:" />
<h:outputText value="#{selectOneMenuView.car}" />

<h:outputText value="Editable" />
<h:outputText value="#{selectOneMenuView.city}" />

<h:outputText value="Advanced:" />
<h:outputText value="#{selectOneMenuView.theme.displayName}" />
</p:panelGrid>
</p:dialog>

当您查看仅加载 html 的页面时,您可以看到每个 p:selectOneMenu 都会生成一个输入和一个选择。

<td>
<label id="j_idt88:j_idt91" class="ui-outputlabel ui-widget" for="j_idt88:console_focus">Basic:</label>
</td>
<div id="j_idt88:console" class="ui-selectonemenu ui-widget ui-state-default ui-corner-all" style="width:125px">
<div class="ui-helper-hidden-accessible">
<input id="j_idt88:console_focus" name="j_idt88:console_focus" type="text" autocomplete="off">
</div>
<div class="ui-helper-hidden-accessible">
<select id="j_idt88:console_input" name="j_idt88:console_input" tabindex="-1" data-p-label="Basic" data-p-hl="onemenu">
<option value="">Select One</option><option value="Xbox One">Xbox One</option>
<option value="PS4">PS4</option>
<option value="Wii U">Wii U</option>
</select>
</div>
<label id="j_idt88:console_label" class="ui-selectonemenu-label ui-inputfield ui-corner-all">Select One</label>
<div class="ui-selectonemenu-trigger ui-state-default ui-corner-right">
<span class="ui-icon ui-icon-triangle-1-s ui-c"></span>
</div>
</div>

我希望下拉菜单的行为类似于 JSF one h:selectOneMenu(当涉及到可访问性时)。具体到该示例,我希望“基本:”标签与其下拉菜单关联,以便当您单击“基本”时焦点移动到下拉菜单。我还希望屏幕阅读器实际上将其视为选择元素而不是输入元素。到目前为止,由于生成的输入元素,我无法找到执行此操作的方法。我目前使用的是 Primefaces 5.2。有谁知道如何防止生成此输入元素?

最佳答案

我放弃了 p:selectOneMenu 有两个原因:它不可访问,并且在移动设备上使用起来很痛苦,因为它没有带来 native 控件选择器(“例如,iPad 上的旋转轮”)。

相反,我使用自定义的 h:selectOneMenu ,例如:

<h:selectOneMenu
styleClass="ui-inputfield ui-widget ui-state-default ui-corner-all #{component.valid ? '' : 'ui-state-error'}"
onmouseover="$(this).addClass('ui-state-active')"
onmouseout="$(this).removeClass('ui-state-active')"
onfocus="$(this).addClass('ui-state-active ui-state-focus')"
onblur="$(this).removeClass('ui-state-active ui-state-focus')"/>

它看起来并没有那么糟糕,它易于访问并且在移动设备上运行良好。

关于jsf - <p :selectOneMenu> generates input field behind select box,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31051097/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com