2

入力フィールドからすべてのキーストロークを収集し、それぞれの間に設定された時間遅延で1つずつ関数に渡すオブジェクトのようなバッファを作成しようとしています。

たとえば、 を使用するGoogle Maps/Places Autocomplete Service APIと、入力フィールドでキーストロークが行われるたびにオートコンプリートのリクエスト関数が起動されます。非常に短い時間内にあまりにも多くのキーストロークが行われると、オートコンプリート リクエストが結果を返さないことがわかりました。したがって、すべてのキーストロークを収集するある種のバッファを作成し、次に a で 1 つずつ、200ms intervalそれらをオートコンプリート機能に解放したいと考えています。

したがって、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

ただし、これは明らかに完全にはほど遠いものです。これがどのように達成されるかについて誰か考えがありますか?

4

1 に答える 1

1

入力で onkeydown イベントを使用する必要があります (示したように)。または、一部のブラウザーでは、イベントを body に配置し、要素のフォーカス イベントを待つ必要がある場合があります。私が提供できる主な知恵の 1 つは、タイミング パターンに関するものです。キーを受け取り、それらの送信を処理するキュー オブジェクトを設定する必要があります。基本的に、作成時に「ready」と呼ばれる bool を 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 に答える