5

onkeydown大量のコードをイベントに添付しながら、テキストをtextareaすばやくサクサク入力するにはどうすればよいでしょうか? 2 つ以上の IF ステートメントを使用すると、処理速度が大幅に低下するようです。

編集:これはデスクトップブラウザには影響しないことを追加する必要があります(忘れてしまったなんて信じられません!)。これは主に iPhone Safari の問題です。他のモバイル ブラウザも同様に影響を受ける可能性がありますが、JS を最もよく実行する iPhone Safari に焦点を当てています (AFAIK)。

4

4 に答える 4

2

これがiPhoneアクセスに焦点を合わせていることに関するあなたの編集を考慮して...

iPhoneは本当にそれほど強力ではありません。onchangeを使用するか、onblur代わりに使用する方がよいでしょうonkeydown



Daveの答えの代わりに、ユーザーが一時停止するのを待つこともできます(たとえば、5秒間)。

var textarea = document.getElementById('textarea');

function checkTextArea() {
   if (textarea.value /* ... */) {
     /* ... */
   }
}

textarea.keyDownTimeout = null;
textarea.onkeydown = function () {
  if (textarea.keyDownTimeout) clearTimeout(textarea.keyDownTimeout);
  textarea.keyDownTimeout = setTimeout(checkTextArea, 5000);
};

これにより、最初のキーダウンでタイマーが設定され、連続するキーダウンごとにタイマーが停止して再作成されます。ユーザーが入力を停止してから5秒後に最後に呼び出します。

また、の後に括弧がないことに注意してくださいcheckTextArea。これによりsetTimeout、関数の参照とその参照が得られreturnます。


これを関数で設定して、複数の要素で使いやすくすることもできます。

function setPauseTimer(element, timeout, callback) {
  var timer = null;
  element.onkeydown = function () {
    if (timer) clearTimeout(timer);
    timer = setTimeout(function(){ callback(element); }, timeout);
  };
}

function checkTextArea(textarea) { /* moved from global to argument */
   if (textarea.value /* ... */) {
     /* ... */
   }
}

setPauseTimer(document.getElementById('textarea'), 5000, checkTextArea);
于 2009-01-17T07:37:17.113 に答える
1

たぶん、「たくさんのコード」を投稿して、そこにリファクタリングがあるかどうかを話し合うことができます(タイマーで複雑にする前に)。最初に二次最適化にジャンプしているようです。

于 2009-01-17T07:55:25.453 に答える
0

さて、行く方法の1つは、onkeydownを使用せず、代わりにタイマーを使用することです。TextAreaの内容をチェックする関数を実行する間隔を設定し、そこでロジックを実行できます。オーバーヘッドの大部分をバイパスするようです。とにかく、それを試してみてください、私はそれが役立つかもしれないと思います。

使用方法は次のとおりです。

// First param is the function to call, second is 
// time interval in miliseconds
var timer = setTimeout(checkTextArea(), 5000);

function checkTextArea() {
    var text = document.getElementById("textarea").value;
    // logic...
    timer = setTimeout(checkTextArea(), 5000); // we loop it back to 
                                               //the function with the timer
}
于 2009-01-17T06:50:23.400 に答える
0

私はタイマーメソッドを考えていました。setTntervalよりも良いと思いますがsetTimeout、それは最適な解決策とは思えませんね。

于 2009-01-17T08:30:29.253 に答える