【问题标题】:How do I implement a delay on jQuery keyup?如何在 jQuery keyup 上实现延迟?
【发布时间】:2015-07-30 09:29:35
【问题描述】:

我正在制作一个列表过滤器,并希望延迟,以防用户是快速打字员。为类似问题寻找不同的解决方案对我没有帮助,我不理解它们实现的逻辑。

这是我当前的代码:

$.fn.filterList = function(){   
    var inputFilter = $(this);
    var list        = $('#' + inputFilter.data('list'));
    var listItems    = list.children('li');

    inputFilter.keyup(function(){

        setTimeout(function () {
            var term = inputFilter.val().toLowerCase();

            listItems.each(function(i, e){
                var city = ($(e).text()).toLowerCase();

                if(city.startsWith(term)){
                    console.log(city);
                }
            });
        }, 800);
    });

};

$('.my-input').filterList();

这样做的问题是,无论用户键入多快,它都会在每次按键时触发。

如何实现延迟,使其不会针对每个keyup 触发?

【问题讨论】:

标签: javascript jquery filter


【解决方案1】:

在每个连续的keypress 上,您需要清除前一个计时器,以便该函数仅在键入结束后 X 毫秒触发。试试这个:

var timer;

inputFilter.keyup(function() {
  clearTimeout(timer);
  timer = setTimeout(function() {
    var term = inputFilter.val().toLowerCase();

    listItems.each(function(i, e) {
      var city = $(e).text().toLowerCase();
      if (city.startsWith(term)) {
        console.log(city);
      }
    });
  }, 800);
});

这是一个简化的工作示例:

var timer;
$('#foo').keypress(function() {
  clearTimeout(timer);
  timer = setTimeout(function() {
    $('div').fadeIn('fast').delay(1000).fadeOut('fast');
  }, 800);
});
div { display: none; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input id="foo" />
<div>You stopped typing 1 second ago</div>

【讨论】:

  • 谢谢,我不知道。现在我知道了 :) 顺便说一句,我在这里找到了相同的解决方案:stackoverflow.com/questions/14577429/…
  • 您需要将计时器变量泄漏到父作用域:timer = setTimeout(...(否 var
【解决方案2】:
var delay = (function(){
  var timer = 0;
  return function(callback, ms){
    clearTimeout (timer);
    timer = setTimeout(callback, ms);
  };
})();

inputFilter.keyup(function() {
    delay(function(){
      var term = inputFilter.val().toLowerCase();

            listItems.each(function(i, e){
                var city = ($(e).text()).toLowerCase();

                if(city.startsWith(term)){
                    console.log(city);
                }
            });
    }, 800 );
});

【讨论】:

  • 当您可以直接使用setTimeout() 时,将匿名函数调用放入函数调用中的匿名函数调用有什么意义?封装没有意义。
  • 当您的项目需要更多延迟时,您可以通过传递函数和延迟时间来使用此延迟函数。只需要一次延迟调用,虽然效率不高,但仍然有效。
【解决方案3】:

试试下面的代码:

HTML:

<input type="text" id="inputtext" />

jQuery 代码:

<script type="text/javascript">
        $(document).ready(function () {
            $('#inputtext').keyup(function () {
                setTimeout(function () {
                    alert("Hi");
                }, 5000);
            });
        });
    </script>

【讨论】:

    【解决方案4】:

    在每次按键计数点击后,其中一些触发功能。
    专业提示:并使用

    .on('keyup', function(){}).
    

    【讨论】:

    • 这并不能解决用户搜索长字符串时的问题。目标是在用户完成后触发一个事件
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-04
    • 2021-01-06
    • 1970-01-01
    相关资源
    最近更新 更多