考虑以下 jsf 页面:
<h:body>
<h:form id="SessionStartDialog">
<table>
<tr>
<td class="label">
<h:outputLabel
value="Enter your username:"
for="UsernameField"/>
</td>
<td class="input">
<h:inputText
id="UsernameField"
value="#{login.username}"
validator="#{login.validateUsername}"
tabindex="1">
<f:ajax render="SelectWorkingSetListbox
StartSessionButton UsernameMessage" />
</h:inputText>
<h:message
id="UsernameMessage"
for="UsernameField" />
</td>
</tr>
<tr>
<td class="label">
<h:outputLabel
value="Choose a working-set:"
for="SelectWorkingSetListbox"/>
</td>
<td class="input">
<h:selectOneMenu
id="SelectWorkingSetListbox"
tabindex="2"
disabled="#{!login.showWorkingSets}"
value="#{login.selectedWorkingSetName}">
<f:selectItems
value="#{login.workingSetNames}"/>
<f:ajax />
</h:selectOneMenu>
</td>
</tr>
</table>
<h:commandButton
id="StartSessionButton"
styleClass="StartSessionButton"
disabled="#{!login.showWorkingSets}"
value="Start Session"
tabindex="3"
action="#{login.startSession}" >
<f:ajax execute="@form"/>
</h:commandButton>
</h:form>
</h:body>
其中的某些内容会导致 Safari 报告 ajax 和完整请求混合的错误。我不明白为什么,因为引起请求的所有组件都包含<f:ajax>
-标签。这里有什么问题?
Update:
我创建了一个触发此错误的最小示例:
<h:body>
<h:form>
<f:ajax render="TextField">
<h:inputText value="#{theBean.text}" />
</f:ajax>
<h:outputText id="TextField" value="#{theBean.text}" />
</h:form>
</h:body>
theBean
是一个简单的视图范围 bean 并且text
类型的属性String
。由于某种原因,这会在 Safari 5.1 中触发以下消息:
httpError:Http 传输返回 0 状态代码。这是
通常是 ajax 和完整请求混合的结果。这通常是
出于性能和数据完整性的原因,这是不希望的。
Update 2造成这种情况的原因似乎是因为enter
在 - 的里面input
-field 始终触发完整表单提交。我不知道如何防止这种情况。如第一个示例所示,我希望用户输入用户名,然后启用表单的其他组件(仅当用户名已知时)。我该如何正确实施呢?
I'd capture the Enter key on the <form>
and instead trigger onchange
on the <input>
element where this key was pressed.
<h:form onkeydown="enterToChange(event)">
...
</h:form>
with
function enterToChange(event) {
if (event.keyCode == 13 && event.target.tagName != 'textarea') {
event.stopPropagation(); // Don't bubble up.
event.preventDefault(); // Prevent default behaviour (submitting the form).
event.target.onchange(); // Trigger onchange where key was actually pressed.
}
}
请注意,这会忽略文本区域上的回车键,您当然希望在其中保留预期的行为(插入新行)。
如果有必要,您可以添加额外的检查以查看提交按钮是否未显示disabled
如果是这样的话,那就让这件事过去吧。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)