2

我正在尝试创建一个类似缓冲区的对象,该对象从输入字段中收集所有击键,然后将它们一个接一个地传递给一个函数,每个函数之间设置一个定时延迟。

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

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

我目前对如何编写这样的东西没有可靠的想法,所以无法发布代码,但我原以为这会是类似的东西

On key press:

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

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

4

1 回答 1

1

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

警告:在技术上不是有效的 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 编码。

PS 检查称为节流的东西是您的自动完成小部件的文档。解决方案可能会立即生效。

于 2013-01-27T16:09:30.363 回答