Javascript:创建一个类似对象的缓冲区,用于收集输入的击键,然后按时间间隔将它们逐个释放到函数

标签 javascript input buffer delay timing

例如,当使用 Google Maps/Places Autocomplete Service API 时,在输入字段中进行的每次击键都会触发自动完成的请求功能,我发现如果在一个非常短的时间内进行过多的击键短时间内,自动完成请求无法返回结果。因此,我想创建某种缓冲区来收集所有击键,然后一个接一个地以 200ms 间隔将它们释放到自动完成功能。

因此输入 123 Fake St 需要 700 毫秒,然后以 200 毫秒的间隔将字符串的每个字符传递给函数 - 1 (200ms) 2 (200ms) 3 (200ms) F (200ms) A ... ect.

我目前对如何编写这样的东西没有明确的想法,所以不能发布代码,但我原以为它会是这样的

On key press:

    if( (lastRequestTime - 200) > curTime )
        send input to function

然而,这显然远未完成。有没有人对如何实现这一点有任何想法?

最佳答案

您需要在输入上使用 onkeydown 事件(如您所示)。或者在某些浏览器中,您可能需要将事件放在主体上,然后等待元素上的焦点事件。我能给出的一个主要智慧是时间模式。您应该设置一个接收 key 并处理发送它们的队列对象。基本上它应该有一个名为“就绪”的 bool 在创建时设置为 true,然后每当它获得一个新 key 时,如果它准备好了,它会立即发送它。但如果不是,它将把它添加到队列中(通常是一个数组)。每当你让它发送一个 key 时,只需设置一个超时,如果有人在那里或只是设置为 true,就会触发另一个发送(在队列中的下一个 key 上)。

警告:不是技术上有效的 javascript。主要是一个例子。

takeKey( key )
{
  if ( this.ready )
    this.sendIt( key );
  else
    this.queue.push( key );
}

sendIt ( key )
{
  this.ready = false;
  send( key );
  timeout(function () {
    this.readyUp();    
  }, time);
}

readyUp ()
{
  ready = true;
  if (this.queue.length > 0)
    this.sendIt( this.queue.shift() );
}

这应该会处理您的时间安排。剩下的只是基本的 dom 编码。

附言检查称为 throttle 的东西是你的自动完成小部件的文档。该解决方案可能会直接烘焙。

关于Javascript:创建一个类似对象的缓冲区,用于收集输入的击键,然后按时间间隔将它们逐个释放到函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14549096/

相关文章:

javascript - 如何用html css和javascript用空格编码进度条

buffer - OpenCl 2 : How to convert image2d object to buffer without copy and vice versa

C++ 刷新缓冲区

日期选择器 : How to change the focus of calendar to today's date in UI5?

jquery datepicker 多个实例

javascript - 如何计算输入 HTML 元素的宽度以匹配其内容的大小?

c - 普通 C 的可增长缓冲区

javascript - 异步等待获取未定义。怎么处理?

javascript - VueJs 使用 store 或 vuex 时出现空白页面

javascript - array push in a called function 如何更新 caller function 中的数组,该数组传递给 javascript 中的函数?