2009-05-27 5 views
5

私はjQueryを使用していますが、イベントコールバックとして機能する関数を持っています。その関数では、 "this"はイベントをキャプチャしたオブジェクトを表します。しかし、別の関数から関数を明示的に呼び出す場合があります。この場合、関数内で "this"が等しくなるように設定するにはどうすればよいですか?例えばJavascript関数を呼び出すとき、どのようにカスタム値 "this"を設定しますか?

function doStuff(el) { 
    $(el).removeClass("sad").addClass("happy"); 
} 

function handleEvent(event) { 
    doStuff(this); 
} 

$("a.sad").click(handleEvent); // in this case, "this" is the anchor clicked 

function differentEvent(event) { 
    $("input.sad").keydown(e) { 
     doSomeOtherProcessing(); 
     doStuff(this); 
    } 
} 

答えて

12

使用applycall

function handleEvent(event) { 
    $(this).removeClass("sad").addClass("happy"); 
} 

$("a.sad").click(handleEvent); // in this case, "this" is the anchor clicked 

function differentEvent(event) { 
    $("input.sad").keydown(e) { 
     doSomeOtherProcessing(); 
     handleEvent(e); // in this case, "this" will be the window object 
         // but I'd like to set it to be, say, the input in question 
    } 
} 
+3

代替:call()を使用します。これはapply()とまったく同じですが、引数の配列の代わりに一連の引数を渡す点が異なります。 (https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Function/call) –

+1

apply()とcall()は私が探していたものです(上記の答えのコードでは[ e]というのは、Danielが言ったように、apply()は一連の議論を取っているからです)。 – Charles

+0

訂正していただきありがとうございます。私は答えを更新しました。 –

4

ちょうどあなたが興味を持っている機能をパラメータ化。

handleEvent.call(this, e); 
+0

LOLZ:しかし、あなたのニーズに応じて、その要素のすべてクリックハンドラをトリガするjQueryのclick()関数の引数なしのバージョンを使用するより堅牢かもしれません。素敵な回避策。 – simplyharsh

+2

私はパトリックの答えを上回っている人たちを信じることはできません。元の質問に必要なものです。これは、jQueryが呼び出すコードに 'this'というキーワードを割り当てる方法で、これがどのように行われるべきかを示します。組み込み関数や一般的に理解されている関数で簡単に実行できるものに対応する関数のパラメータを変更するには、テールが犬を揺らすケースがあります... –

+2

これは多くの人がいることを示していますJavaScriptをgrokしないでください。おそらくjQueryのようなライブラリの使用は、言語自体を実際に理解する時間がかからないので、無知を確実にしています。 –

1

使用

e.target 
1

私はjQueryのプラグインとして使用するリファクタリングあなたの関数のアドバイスと思います。

handleEvent.apply(this,e) //transfers this from one scope, to another 
+0

+1適用が適切と思われる – annakata

+0

jQueryプラグインとしてのリファクタリングが、call()を使用するよりも良いオプションとなるのはなぜですか? – Charles

+0

チャールズなので、$( "div")。handleEvent()や$(this).handleEvent()のようなすべてのjqueryオブジェクトで普遍的に使用できるので、関数を連鎖できるという特別な利点があります。 – duckyflip

0

あなたは、単にそれが正常にトリガされていたかのように単一のイベントハンドラを呼び出すために探しているなら、apply/call正常に動作します:

しかし、ここでは簡単な修正です。私はそれが好き...

function differentEvent(event) { 
    $("input.sad").keydown(e) { 
     doSomeOtherProcessing(); 
     $(this).click(); // simulate a click 
    } 
} 
関連する問題