如何使用A4J:commandLink与Action属性和onComplete属性来触发一些JavaScript



我有一些我设法在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;
    }
}

一些想法:

  1. 尝试明确设置commandLinkreRender属性,以防止相关区域重新渲染。
  2. 尝试从commandLinkoncomplete中删除return false
  3. 您的行动在做什么?您确定customerSession.stockWatch操作不会以某种方式引起页面重新加载?

最新更新