如何使用带有action属性和oncomplete属性的a4j:commandLink来启动一些JavaScript?

如何使用带有action属性和oncomplete属性的a4j:commandLink来启动一些JavaScript?,java,javascript,jsf,richfaces,ajax4jsf,Java,Javascript,Jsf,Richfaces,Ajax4jsf,我有一些代码可以在Chrome、IE8中使用,但不能在FireFox中使用。顺便说一句:我的a4j:命名空间是: 这个想法很简单,当商品缺货时,你希望得到通知,所以你输入你的电子邮件,我们用一个简单的感谢div替换这个小表单 然而,在FireFox中,它通过action和它的bean方法将位正确地存储到数据库中。然后oncomplete启动一个JS函数并显示感谢消息,但我认为页面完成了重新加载,原始表单重新出现,这是我们不希望看到的 首先是头版codel中的RichFaces和事件 <h:

我有一些代码可以在Chrome、IE8中使用,但不能在FireFox中使用。顺便说一句:我的a4j:命名空间是:

这个想法很简单,当商品缺货时,你希望得到通知,所以你输入你的电子邮件,我们用一个简单的感谢div替换这个小表单

然而,在FireFox中,它通过action和它的bean方法将位正确地存储到数据库中。然后oncomplete启动一个JS函数并显示感谢消息,但我认为页面完成了重新加载,原始表单重新出现,这是我们不希望看到的

首先是头版codel中的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>
谢谢你的帮助。在三个浏览器中有两个可以正常工作!但还不够好!!;)

JSF是1.2版,RichFaces是3.01版?我找到了RichFaces的确切版本:
版本是richfaces-api-3.3.1.GA.jar

编辑: 我希望我能提供更多的信息。事实上,这可能是ajax4jsf/a4j在网页上有多个单独的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>

#{messages.submit}
我现在也只使用一个JavaScript函数,即更改包装器div的id值(因为它将更改css),然后更新innerHTML

还有一条可能有助于解决此问题的信息是,我多次重写JSF/RICHFACES,以使其在所有浏览器中-->正常工作,方法是按ENTER键并单击Submit按钮

我将看到action属性只是没有在bean中触发该方法。只要您输入该方法,我就有一个sysout,这样我就可以在控制台中看到它。但这并没有发生。我们的系统相当强大,所以我不知道该怎么想。除了a4j坏了?至少在我们正在运行的版本中。。我的意思是,这是一段非常简单的代码,而action属性不适用于该方法!=)

我的意思是,它有时确实有效,当我试图让它在所有浏览器上工作时,该方法会启动,并将记录插入数据库

但是,代码的其他修订版action属性根本不触发。这就是我想说的

再次感谢大家

一些想法:

  • 尝试显式设置
    commandLink
    reRender
    属性,以防止相关区域被重新渲染
  • 尝试从
    commandLink
    oncomplete
    中删除
    return false
  • 你的行动是什么?您确定
    customerSession.stockWatch
    操作没有导致页面重新加载吗

  • 您的具体问题是由回车键上的双重提交引起的

    在输入字段中有一个
    onkeypress
    处理程序,当按下enter键时,该处理程序会触发submit按钮上的
    click
    事件。但您并没有阻止事件的默认行为(当没有
    onkeypress
    处理程序时就会暴露)。显然,在Firefox中,通过按enter键提交带有命令链接的ajax表单是有效的

    您基本上需要防止事件的默认行为。实现这一点的最简单交叉浏览器方法是从
    onkeypress
    处理程序返回
    false

    onkeypress="if (event.keyCode == 13) { document.getElementById('stockwatchSubmit').click(); return false; }"
    
    如果你想把它重构成一个函数,让它返回一个布尔值

    onkeypress="return stockWatchEnterSubmit(event.keyCode)"
    

    函数stockWatchEnterSubmit(keyCode){
    如果(键代码==13){
    document.getElementById('stockwatchSubmit')。单击();
    返回false;
    }否则{
    返回true;
    }
    }
    
    我认为我们的CSS设计师更喜欢commandLink而不是commandButton,但我不确定原因。这可能是问题的一部分吗?谢谢。为什么在更改innerHTML之前要更改表单的id。您是否尝试过不更改它?只是猜测一下,尝试使用
    ajaxsingle=“true”
    或删除
    {messages.submit}
    ?你看到firebug中有任何错误吗?如果你提到所使用的JSF和RichFaces的确切版本,那会很有帮助。@BalusC谢谢你,Balus,我添加了我认为接近这些版本的内容。我们有一个facesMessages.addToControl(“email”,“我的消息在这里”);在方法的最后开火。电子邮件输入框不再存在,因为我替换了div id并更改了innerHTML。但是,此facesMessages.addToControl必须保留在所有其他商店中。。。
    onkeypress="return stockWatchEnterSubmit(event.keyCode)"