我在 h:inputText
标签内有一个 f:ajax
标签,对 keyup 事件进行 ajax 调用:
<h:inputText id="searchinput" value="#{tvShowForm.name}">
<f:ajax event="keyup" render="results" listener="#{tvShowForm.search}" />
</h:inputText>
每次调用都需要足够的时间,用户在第一次调用完成之前已经键入了几个字符。
有没有办法取消当前的ajax调用(以及排队的ajax调用),以便最后一个keyup事件立即执行ajax调用?
最佳答案
听起来您想合并事件,例如这将等待 触发 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:queue 功能。 这允许组合事件,例如在键盘场景中,如果您已经 靠在键盘上,当当前的 ajax 请求仅完成另一次时 将发送请求。还可以指定请求延迟并忽略陈旧的请求 回应。 Richfaces 没有犯的大错误(primefaces 确实犯过)是 RF 使用与 JSF 实现相同的底层队列,因此您没有风险 无序处理。
我很感激,如果您还没有使用这个库,那么这不是一个小步骤。
关于ajax - 取消 JSF ajax 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7889257/