我在f:ajax
标记内有一个h:inputText
标记,对keyup事件进行ajax调用:
<h:inputText id="searchinput" value="#{tvShowForm.name}">
<f:ajax event="keyup" render="results" listener="#{tvShowForm.search}" />
</h:inputText>
每次通话都需要足够的时间,以便用户在第一次通话结束前键入多个字符。
有没有办法取消当前的ajax调用(和排队的调用),以便最后一个keyup事件立即执行ajax调用?
答案 0 :(得分:4)
听起来你想要合并事件,例如这会等待 在发出ajax请求之前半秒钟,以及输入的任何输入 积分将包括在内。但是你不会为每个角色发出一个ajax请求 键入。
<h:inputText onkeyup="keyupHandler();"/>
...
<script>
var keystrokeTimeout;
keyupHandler = function(event) {
var minChars = 4;
var len = $(this).val().length;
if((len != 0) && (len < minChars)) {
return;
}
var ajaxRequest = function() {
jsf.ajax.request('results', null, {
execute: 'results',
render: 'results'
});
}
clearTimeout(keystrokeTimeout);
keystrokeTimeout = setTimeout(ajaxRequest, 500); // millisecs
}
</script>
这远远不像你想做的那样吗?
编辑:另一个建议是你看看Richfaces 4 a4j:队列功能。 这允许组合事件,例如,如果你曾经在键盘场景中 当你的当前ajax请求只完成一个时,它依靠你的键盘 请求将被发送。也可以指定请求延迟并忽略陈旧 响应。 Richfaces没有做出的重大错误(那些素数确实如此)就是这样 RF使用与JSF实现相同的底层队列,因此您没有风险 无序处理。
我很感激,如果你还没有使用这个库,那么这不是一个小步骤。