7

イベントのハンドラーにパラメーターを渡す方法は?

これがやろうとしていることですが、機能しません:

for (var i = 0; i < myobj.length; i++) {
myobj[i].onmouseover = myfun(myobj[i]);
}

以下も動作しません。

myobj[i].onmouseover = myfun.call(myobj[i]);
myobj[i].onmouseover = function () {myfun(myobj[i]);};
myobj[i].onmouseover = function () {myfun.call(myobj[i]);}; 

なぜそれが機能しないのか、そして同じスタイルの解決策に主に興味があります。

ありがとう。

4

2 に答える 2

9

渡すパラメーターをカプセル化するには、ハンドラーのクリエーター関数を使用するだけです。

function createHandler( param ) {
  return function() {
    myfun( param );
  }
}

for (var i = 0; i < myobj.length; i++) {
  myobj[i].onmouseover = createHandler( myobj[i] );
}

あなたのアプローチが機能しない理由は、関数参照ではなく関数呼び出しの結果を渡すためです。したがって、最初の例myfun( myobj[i] )では が評価され、結果がイベント ハンドラーとして渡されます。

あなたが本当に意味しているのは、イベントが発生した場合、関数が評価されるということだと思います。そのためには、パラメーターを何らかのグローバル変数を介して渡すか、データセット プロパティとして渡す必要があります。

ただし、よりクリーンな解決策は、上記のようにジェネレーター関数を使用することです。

于 2012-04-25T12:18:50.600 に答える
3

もう 1 つの方法は、イベントを発生させる DOM 要素のメソッドonmouseover(関数ではなく)として呼び出される事実を使用することです。

つまり、誰かがこれを行うことを期待しているかのようにコードを記述します。

obj = xahlees();
obj.onmouseover();

解決策は次のとおりです。

for (var i = 0; i < myobj.length; i++) {
  myobj[i].onmouseover = function() { myFun(this) };
}

より完全な例をアップロードしました。

于 2012-04-25T13:24:49.337 に答える