取消JSF ajax调用

时间:2011-10-25 12:29:17

标签: ajax events jsf

我在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调用?

1 个答案:

答案 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实现相同的底层队列,因此您没有风险 无序处理。

我很感激,如果你还没有使用这个库,那么这不是一个小步骤。