8

UnderscoreJS を使用しようとしてい_.debounce()ます。これは、キーアップ イベントで繰り返し起動するためのコールバック関数を停止する方法です。入力を開始するたびに AJAX 呼び出しが起動されるため、入力する文字ごとに呼び出しを行うのは非常にコストがかかるためです (:

これは私がメソッドを使用している方法です:

onTypeEvents : function(selector, callback) {
        return $(selector).on('keyup', function(event){

            var that = $(this).val().trim();

            switch(event.keyCode) {
                case 8:
                    if(that !== '') {
                        if(that.length >= 2) {
                            return _.debounce(function() { callback.apply(that, [ that ]) }, 150);
                        } else {
                            return _.debounce(function() { callback.apply(null, [ null ]) }, 150);
                        };
                    };
                    break;
                case 9:
                    break;
                case 13:
                    break;
                case 27:
                    break;
                case 37:
                    break;
                case 38:
                    break;
                case 39:
                    break;
                case 40:
                    break;
                default:
                    if(that !== '') {
                        if(that.length >= 2) {
                            return _.debounce(function() { callback.apply(that, [ that ]) }, 150);
                        } else {
                            return _.debounce(function() { callback.apply(null, [ null ]) }, 150);
                        };
                    };
                    break;
            };

            event.preventDefault();
            event.stopPropagation();
        });
    },

しかし、何も起動していないため、明らかに機能しませんが、メソッドを削除すると、コードは正常に機能します (: では、そこで何が問題になっている可能性がありますか?間違っているのでしょうか、それとも何か不足していますか?

4

1 に答える 1

19

アイデアは、キーアップ コールバック自体をデバウンスすることです。そうすれば、コードは、ユーザーが入力を停止する前に入力した最後のキーにのみ反応します。何かのようなもの:

$(selector).on('keyup', _.debounce(function (e) {
  switch (e.keyCode) {
    /* your code */
  }
}, 500));
于 2012-10-31T13:15:45.340 に答える