JSF:当我按下return / enter键时,inputText可以调用托管bean中的方法

时间:2010-10-14 21:56:33

标签: jquery jsf

所以我有一个inputText,它的值挂钩myBean.text,我希望如果我点击enter / return键,inputText将调用myBean内的方法做某事。任何人都可以帮助我吗?

修改

<p:inplace label="Add Comment">
    <h:inputText id="keyword" value="#{PostComment.comment.comment}" style="width:100%;"
                 onkeypress="if (event.keyCode == 13){onchange(); return false;}">
                 <f:ajax event="change" listener="#{PostComment.postCommentListener}"/>
    </h:inputText>
    <p:watermark for="keyword" value="Comment here"/>
</p:inplace> 

然后在PostComment bean

public void postCommentListener(AjaxBehaviorEvent event){
    NewsFeed c = scholar.getModel().getRowData();
    postProfileComment(c.getTargetFeedId());
}

6 个答案:

答案 0 :(得分:13)

根据您的问题历史记录,我知道您使用的是JSF 2.0,因此这里有一个针对JSF 2.0的答案:使用<f:ajax>来监听change事件并使用keypress按下回车键时调用它的事件(键码13)。

<h:inputText value="#{bean.text1}" 
    onkeypress="if (event.keyCode == 13) { onchange(); return false; }">
    <f:ajax event="change" listener="#{bean.listener}" />
</h:inputText>

#{bean.listener}应该指向像

这样的方法
public void listener(AjaxBehaviorEvent event) {
    // ...
}

答案 1 :(得分:3)

最简单的方法是将inputText放在表单中,然后隐藏commandButton旁边的<h:form> <h:inputText styleClass="myText" value="#{myBean.text}"/> <h:commandButton styleClass="myButton" action="#{myBean.myMethod}" style="display:none;" value="submit"/> </h:form>

例如:

<s:defaultAction/>

<强>更新

如果您使用的是Seam,则可以使用commandButton标记。这使包含它的<h:commandButton class="myButton" action="#{myBean.myMethod}" style="display:none;" value="submit"> <s:defaultAction/> </h:commandButton> 成为响应ENTER的那个。

$('input.myText').keypress(function(e) {
    if (e.which == 13) {
        $('.myButton').click();
    }
});

如果您不使用Seam,可以尝试其中一个similar defaultAction controls

或者你可以使用一些Javascript来自己动手;理想的jQuery。例如:

{{1}}

答案 2 :(得分:3)

实际上您可以使用以下语法:

<h:inputText value="#{bean.text1}" 
     onkeypress="return (event.keyCode == 13)">
  <f:ajax event="keypress" listener="#{bean.listener}" />
</h:inputText>

JSF会创建一个事件链,并且在您的f:ajax事件之前将评估您在“onkeypress”下所声明的内容。因此,您可以返回false来打破事件链。如果您在f:ajax上使用更改事件,它当然会触发您可能不想要的其他更改事件。

答案 3 :(得分:2)

你可以做这样的事情:

<h:inputText value="123" onkeyup="if(event.keyCode==13)this.blur();" onchange="document.getElementById('fakebutton').click();" valueChangeListener="#{yourbean.dosomething}"/>
<h:commandButton id="fakebutton"actionListener="#{yourbean.fakeaction}"/>

在你的bean里面:

public void dosomething(ValueChangeEvent event)
{
    System.out.println("I did something");
}
public void fakeaction(ActionEvent event)
{
    System.out.println("I do no nothing");
}

答案 4 :(得分:1)

我决定把它作为一个答案,所以代码会比作为评论内联更清晰,但Damo的解决方案正是对我有用的(所以请求他的回答不是这个;-)。我有一个带有文本输入字段和搜索图标(放大镜)的表单。我希望通过单击放大类并在输入文本字段中按Enter键来提交ajax查询。单击我原始解决方案中的图标有效,但在我的生活中,我无法按下输入文本字段以提交ajax调用(它通过正常机制提交表单)。这是最终有效的代码。再次感谢Damo。

<div class="boxWrapper searchWrapper right">
    <div class="boxHeader"><div class="tail" /></div>
    <div class="boxContent">
        <h:form prependId="false">
            <label>SEARCH:</label>
            <div class="searchBox">
                <f:ajax execute="@form" render="@none">
                    <h:inputText id="keywords" value="#{search.searchString}" onblur="inputTextBlur( this, '#{search.searchString}' );" onfocus="inputTextFocus( this, '#{search.searchString}' );" />
                    <h:commandButton action="#{search.search}" style="display:none;" value="submit" />
                    <h:commandLink id="cmdLink" action="#{search.search}">
                        <!-- the span here is to apply .searchWrapper span { } specific css to the image position -->
                        <span><h:graphicImage styleClass="iconSearch" url="images/iconMask.png" width="17" height="17" /></span>
                    </h:commandLink>
                </f:ajax>
            </div>
        </h:form>
    </div>
    <div class="boxFooter"><div class="tail" />
</div>

P.S。 - @BalusC:这是一个罕见的情况,你的答案不是100%适合我所寻找的,但我已经失去了你的其他人的数量。所以,谢谢你,并享受我从你的愿望清单寄给你的那本书。如果您想咨询一下,请查看我的个人资料并给我发送电子邮件。

此致

参数

答案 5 :(得分:1)

我遇到了同样的问题,因为我没有足够的声誉,我将此作为答案发布。

在我的情况下,有多个输入需要单独提交f:ajax。我需要改进BalusC的解决方案。

您需要在this.前面添加onchange()

<h:inputText value="#{bean.text1}" 
    onkeypress="if (event.keyCode == 13) { this.onchange(); return false; }">
    <f:ajax event="change" listener="#{bean.listener}" />
</h:inputText>