所以我有一个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());
}
答案 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>