【问题标题】:Cancel JSF ajax call取消 JSF ajax 调用
【发布时间】:2011-12-14 21:53:39
【问题描述】:

我在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 调用(以及排队的调用),以便最后一个 keyup 事件立即执行一个 ajax 调用?

【问题讨论】:

    标签: ajax events jsf


    【解决方案1】:

    听起来你想合并事件,例如这将等待 在触发 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 功能。 这允许组合事件,例如在 keyup 场景中,如果你已经 靠在键盘上,当前的 ajax 请求只完成一个 请求将被发送。也可以指定请求延迟并忽略陈旧 回应。 Richfaces 没有犯的大错误(primefaces 确实犯了)是 RF 使用与 JSF 实现相同的底层队列,因此您没有风险 乱序处理。

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

    【讨论】:

    • 感谢 Oversteer,这正是我在此期间最终所做的 ^^。如果几天后没有更好的解决方案,我会坚持下去并奖励你。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-16
    • 2017-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多