0

javascriptファイルにこれらの行があり、正常に機能していました。

handleInput = function(e) {
    var $this = $(this),
    id = $this.attr("id");
    alert(id);
}

....

something.bind("keyup", handleInput);

次に、入力関数を遅らせることにし、次の行を追加しました。

handleDelayedInput = function(e) {
    setTimeout(handleInput(e), 50);
}

.....

something.bind("keyup", handleDelayedInput);

しかしalert(id);、これをその関数に渡すことができなかったと思うので、今は未定義と言います。

私は正しいですか?どうすれば修正できますか?それを行うためのより良い方法はありますか?

4

4 に答える 4

2

handleInputこれは、jQueryバインドメソッドから呼び出すときのように、オブジェクトコンテキストを渡さなくなったためです。個人的には、全体を次のように書き直します。

something.on("keyup", function(e) {
    var obj = $(this);
    setTimeout(function(obj) {
        alert(obj.attr("id");
    }, 50);
});

on()代わりにの使用bind()が現在推奨されている使用法であることに注意してください。

于 2012-09-05T20:10:50.237 に答える
1

apply関数を使用します:

var handleDelayedInput = function(e) {
    var that = this;
    setTimeout(function() {
        handleInput.apply(that, [e]);
    }, 50);
}

something.bind("keyup", handleDelayedInput); // Assuming something is a 
                                             // jQuery object

これが動作するjsFiddleです。

handleInputこのように呼び出すsetTimeout(handleInput(e), 50);とコンテキストが失われるため、その場合thisに期待するものにはなりませんhandleInput

また、関数の結果setTimeoutではなく、関数を渡す必要があります(結果自体が関数である場合を除く)。

于 2012-09-05T20:07:44.947 に答える
1

jQueryがイベントハンドラーを呼び出すと、ハンドラー関数のコンテキストが設定されます。これは、2番目のコードでhandleInputが呼び出された場合には当てはまらないためthis、デフォルト値に設定されますwindow

applyまたはを使用callしてコンテキストを設定できます。

handleInput.call(this, e);

2つの違いは、引数を1つずつapply渡すことができる一方で、引数の配列を受け取ることです。callfunc.apply(context, arg1, arg2)

したがって、完全なコードは次のようになります。

handleInput = function(e) {
    var $this = $(this),
    id = $this.attr("id");
    alert(id);
}

handleDelayedInput = function(e) {
    var element = this;
    setTimeout(function(){
        handleInput.call(element, e);
    }, 50);
}

something.bind("keyup", handleDelayedInput);

setTimoutを使用しているため、要素をタイムアウトハンドラー関数に渡す方法を見つける必要があることに注意してください。また、コードでは、の戻り値をhandleInput(e)ハンドラー関数として使用しています-ではなくhandleInput

私はマイクに同意しますが、handleInputを自分で作成し、それを変更できる場合はthis、引数を渡すだけでなく、使用しても意味がありません。それでもhandleInputを別の場所で直接ハンドラーとして使用したい場合は、それを現在の状態に保つのが理にかなっています。

于 2012-09-05T20:07:55.273 に答える
0

あなたはそのようにそれをすることができます:

handleInput = function(e) {
   var $this = $(this),
   id = $this.attr("id");
   setTimeout(function() {alert(id);}, 50);
}
于 2012-09-05T20:10:08.277 に答える