2011-02-04 8 views
3

この問題が発生しました:Javascript eventhandler:パラメータを持つハンドラの実行に問題があります

パラメータを必要とするイベントハンドラを定義しました。

var handler = function(p1, p2){ 
    //some code 
} 

次に、イベントハンドラを関数内のオブジェクトに追加します。

function foo(p1, p2){ 
    //Some code 
    obj.addEventListener('click', handler(p1, p2), false) 
} 

上記のコードは正しくありません。イベントに耳を傾けません。代わりに、即座に機能を実行します。これを修正するには、handler(p1, p2)を消去し、代わりにfunction(){ handler(p1, p2) }を挿入してください。しかし、問題は、後者の解決策では不可能な、イベントリスナーを削除する別の機能があることです。

function koo(){ 
    //Some code 
    obj.removeEventListener('click', handler, false) 
} 

これを修正するにはどうすればよいですか?

function foo(){ 
    //Some code 
    obj.addEventListener('click', handler, false) 
} 

それを呼び出すのではなく、関数を渡す:

+0

あなたは一つの要素またはいくつかのためにのみこれをやっていますか? 'foo'と' koo'はどのスコープで生きていますか? 'koo'はどのハンドラを削除するのか –

+0

私はあなたを正しく理解していれば、私はいくつかの要素のためにそれをやっています、そして、fooとkooは、他の関数の中ではなく、グローバルスコープで定義されています。また、イベントハンドラを削除するkoo以外の関数もいくつかあります。 – einstein

答えて

2

私はあなたが閉鎖を作成する必要がありますと思う:

var createHandler = function(p1, p2){ 
    return function (event) { 
     //some code that uses p1 and p2 
    }; 
}; 

var handler; 

...と、まだP1およびP2へのアクセスを持ちながら、今あなたは、そのようにハンドラを割り当てることができます。

function foo(p1, p2){ 
    handler = createHandler(p1, p2); 
    //Some code 
    obj.addEventListener('click', handler, false); 
} 

function koo(){ 
    //Some code 
    obj.removeEventListener('click', handler, false); 
    handler = null; 
} 

handlerはグローバル変数になりました。


更新:私はちょうどあなたのケースで、これは次のようにcreateHandlerfooを併合することによって単純化することができることを実現:

var handler; // we need this to be accessible both to foo and koo 

function foo(p1, p2){ 
    handler = function(event) { 
     // some code that uses p1 and p2 
    }; 
    //Some code 
    obj.addEventListener('click', handler, false); 
} 

function koo(){ 
    //Some code 
    obj.removeEventListener('click', handler, false); 
    handler = null; 
} 
+0

が今テストしました。問題は、var handler = createHandler(p1、p2)です。関数fooの中で定義する必要があります。外は働かなかった。しかし、外部になければイベントリスナーを削除することはできませんので、同じ問題 – einstein

+0

次に、 'foo'関数の外側に' var handler; 'を置きます(それによってグローバル変数を作成します)。私は答えを更新しました。 – Martijn

+0

はい、5時間後にデバッグしてくれました。@Martijn !! – einstein

1

はそれだけでこれではありません。

+0

明確にするには、リスナーを 'handler(p1、p2)'として設定すると、2つの引数( 'p1'と' p2')を持つ 'handler'を呼び出して、それが返す値とそれをイベントに代入しますあなたが明確に意図するように、関数 'handler'をリスナーとして割り当てます。 –

+0

これは 'event'引数を渡すだけです(' p1'や 'p2'ではなく)でしょうか? [jsFiddle](http://jsfiddle.net/alexdickson/nzDEL/) – alex

+1

パラメータはどうですか? p1とp2も渡す必要があります、それは問題です – einstein

2

私はあなたが引数を渡したいとは思わない - それはコールバックであり、それらの変数が何であるか決して分からないからです。

あなたが行うことができます...あなたはそれに引数を持ちたい理由

(function() { 

    var p1 = 'a', 
     p2 = 'b', 
     obj = document.getElementById('my-object'); 

    var handleClick = function(event) { 
     // Access to p1 and p2 
     // Access to `event` object containing info about the event 
    } 

    obj.addEventListener('click', handleClick, false); 

    // If you want to remove it 
    obj.removeEventListener('click', handleClick, false); 

})(); 

は、私が聞いてもいいですか?あなたはそれを非クリックトリガーのやり方から呼び出すつもりですか?

+0

あなたはwhat '(function(){// some code}()が何をしているのかを説明することができますか? – einstein

+0

'addEventListener'の前に' var handleClick'代入を置く必要があります。それ以外の場合、 'handleClick'は' undefined'になります。 –

+0

@Felix Klingありがとう、編集します。 – alex

関連する問題