我有一些我设法在Chrome,IE8的代码,而不是Firefox。顺便说一句:我的A4J:名称空间是:
这个想法很简单,您想在物品掉入库存时被通知,因此您输入电子邮件,我们用简单的谢谢div替换了小型表格。
在Firefox中,它可以通过动作和BEAN方法正确地到数据库中。然后启动它会启动JS功能,并确实显示了感谢消息,但是随后我认为该页面完成了它的重新加载,而原始表格则重新出现!
首先,首页代码中的Richfaces和事件
<h:inputText id="email" value="#{customer.stockWatch.email}"
converter="TextTrimConverter"
onfocus="if(this.value == 'Enter email address'){ this.value=''; }"
onblur="if(this.value.trim() == ''){ this.value='Enter email address'; }"
onkeypress="stockWatchEnterSubmit(event.keyCode);" />
<a:commandLink styleClass="b_submit" id="stockwatchSubmit"
action="#{customer.stockWatch}"
oncomplete="stockWatchTextChange(); return false;">
<span>#{messages.submit}</span>
</a:commandLink>
现在我使用的两个简单的JavaScript函数:
function stockWatchTextChange() {
document.getElementById('fstockwatch').setAttribute('id', 'fstockwatch_thanks');
document.getElementById('fstockwatch_thanks').innerHTML = 'Thank you. We'll send you an email once this item is back in stock';
}
function stockWatchEnterSubmit(keyCode) {
if(keyCode == 13){
document.getElementById('stockwatchSubmit').click();
}
}
感谢您的帮助。在3个浏览器中的2个中可以使用它!但是还不够好!;)
JSF是1.2版,我认为Richfaces是3.01?我找到了Richfaces的确切版本:
该版本是Richfaces-api-3.3.1.ga.jar
编辑:我希望我能提供更多信息。实际上,当网页上有多个单独的A4J逻辑时,AJAX4JSF/A4J只是失败的情况,但事实是,显然它们都没有同时使用。那么,像我所做的那样的事情应该工作吗?代码接下来对代码的一些更改:
<h:form id="detailForm" prependId="false">
<h:inputText id="email" value="#{customer.stockWatch.email}"
converter="TextTrimConverter"
onfocus="if(this.value == 'Enter email address'){ this.value=''; }"
onblur="if(this.value == ''){ this.value='Enter email address'; }"
onkeypress="if(event.keyCode == 13){document.getElementById('stockwatchSubmit').click(); if(event.preventDefault){event.preventDefault();}else{event.returnValue = false;}}" />
<a:commandLink styleClass="b_submit" id="stockwatchSubmit"
action="#{customer.stockWatch}"
oncomplete="stockWatchTextChange();">
<span>#{messages.submit}</span>
</a:commandLink>
</h:form>
我现在也只使用一个JavaScript函数,那就是更改包装器Div的ID值(因为它将更改CSS),然后更新InnerHTML。
另外一条可能有助于解决此问题的信息是很多次,当我重写和重写JSF/RichFaces以使其工作 ->在所有浏览器中使用Enter Enter键并单击提交按钮。。
我会看到动作属性根本不会在bean中启动该方法。您进入该方法后立即有Sysout,因此我可以在控制台中看到它。而且这没有发生。我们的系统非常强大,因此我不确定该怎么想。除了A4J被打破了吗?至少在我们正在运行的版本中。我的意思是这是非常简单的代码,并且操作属性并未将其归入该方法!=)
我的意思是说,有时确实有效,当我试图使其在所有浏览器上工作时,方法都可以发射射击,并且记录插入了DB。
。但是代码的其他修订措施属性根本不会发射。这就是我要说的。
再次感谢!
您的具体问题是由Enter键上的双提交引起的。
在输入字段中,您有一个onkeypress
处理程序,该处理程序在按下Enter键时会在提交按钮上触发click
事件。但是您并没有阻止事件的默认行为(没有onkeypress
处理程序时会暴露出来)。在Firefox中,显然是通过按Enter的命令链接提交AJAX表单。
您基本上需要防止事件的默认行为。实现此目的的最简单的Crossbrowser方法是从onkeypress
处理程序返回false
。
onkeypress="if (event.keyCode == 13) { document.getElementById('stockwatchSubmit').click(); return false; }"
如果您想将其重构为功能,请返回布尔值。
onkeypress="return stockWatchEnterSubmit(event.keyCode)"
function stockWatchEnterSubmit(keyCode) {
if (keyCode == 13) {
document.getElementById('stockwatchSubmit').click();
return false;
} else {
return true;
}
}
一些想法:
- 尝试明确设置
commandLink
的reRender
属性,以防止相关区域重新渲染。 - 尝试从
commandLink
的oncomplete
中删除return false
。 - 您的行动在做什么?您确定
customerSession.stockWatch
操作不会以某种方式引起页面重新加载?