primefaces keyup事件延迟

时间:2011-12-06 14:08:58

标签: jsf-2 primefaces

我有类似的东西:

<p:inputText...>
    <p:ajax event="keyup" update="somefield" listener="#{someBean.doSomething}"/>
</p:inputText>

但是我不想在每个按键上执行Ajax请求,我想在用户停止写入后半秒钟执行请求。

我在另一个问题中看到jQuery解决了这个问题: How to delay the .keyup() handler until the user stops typing?

我想知道是否可以在primefaces上执行此操作,或者如何从jQuery问题中调整解决方案。
我正在使用PrimeFaces 3.0.M4。
提前谢谢。

3 个答案:

答案 0 :(得分:18)

为什么不使用PrimeFaces的RemoteCommand组件?

它为您提供了一个全局Javascript函数,您可以随时随地调用它。它允许您调用managed-bean方法,并且它具有update属性以进行部分更新。

<p:inputText id="input" />

<h:form>
    <p:remoteCommand name="sendAjaxical" update="somefield" action="#{someBean.doSomething}"/>
</h:form>

注册事件处理程序,我从the same answer you posted借用了以下内容:

var delay = (function() {
    var timer = 0;
    return function(callback, ms) {
        clearTimeout (timer);
        timer = setTimeout(callback, ms);
    };
})();


jQuery("#input").keyup(function() {
    delay(function() { sendAjaxical(); }, 2000); //sendAjaxical is the name of remote-command
});

答案 1 :(得分:2)

如果选择了jquery / javascript解决方案,则无法使用Primefaces Ajax组件。您必须实现自己的javascript函数(支持ajax/xmlHttpRequest)并在半秒后触发该函数。

但还有另一种解决方案,一种解决方法:您可以使用自动填充组件并使用3个有用的属性: valueChangeListener A method expression that refers to a method for handling a valuchangeevent - 您可以使用它completeMethod,因为您不需要返回建议), queryDelay Delay to wait in milliseconds before sending each query to the server)和 minQueryLength Number of characters to be typed before starting to query - 如果您不想在输入一个字符后启动ajax请求。

我希望您会发现此解决方案非常有趣...请参阅此处的自动完成组件(http://www.primefaces.org/showcase-labs/ui/autocompleteHome.jsf),您可以通过阅读Primefaces用户指南3.0.M4了解更多信息。

答案 2 :(得分:1)

快速破解会在onstart的{​​{1}}中添加延迟。在javascript中的某处定义以下函数:

p:ajax

基本上,该函数在某个超时时触发ajax请求,同时为立即数返回false,并清空该timedout请求的onstart,以免陷入讨厌的循环。

然后在function keyupDelay(request, cfg, delay) { delay = delay || 2000;// if no delay supplied, two seconds are the default seconds between ajax requests setTimeout(function() { cfg.onstart = null; request.send(cfg) }, delay); return false; }

p:ajax

延迟参数在这里是可选的,默认情况下它是2秒。

相关问题