私は独自のクラス (SVG オブジェクト用) を構築しており、最近イベント処理を追加し始めました。標準モデルに従って、このタイプの相互作用が欲しい
svgobj.bind('click', function(e){
// do stuff here on click with svgobj
});
jQuery を使用してイベントをアタッチしていますが、この「バインド」は jQuerybind()
メソッドではなく、svgobj は jQuery オブジェクトではありません
私が遭遇している問題は、複数のオブジェクトを作成すると、svgobj
その匿名関数内の参照がsvgobj
、イベントが発生したオブジェクトではなく、最後に作成されたものになることです。したがって、たとえば、イベントがオブジェクトのステータスの変更を処理する場合、どのオブジェクトをクリックしても、最後のオブジェクトのみがステータスを変更します。
私はこれが閉鎖の問題であることを知っており、同僚の助けを借りて修正を見つけましたが、それはひどく醜いものです。これには、関数を自己実行型の匿名関数でラップすることが含まれます。この関数に正しい関数を渡しsvgobj
、元の関数を返します。例を次に示します。
svgobj.bind('click', (function(target){
return function(e){
// do stuff here on click with target, i.e. the correct svgobj
}
})(svgobj)
);
それは機能し、この例をhttp://jsfiddle.net/2late2die/98te2/で見ることができます。赤/緑の領域をクリックすると、ドラッグ イベント (円の部分) とステータス変更イベントをテストできます。
この問題を解決するより良い方法はありますか? イベントで何かをするたびに、2 つの匿名関数を使用する必要がないようにしたいと思います。おそらく、自己実行関数を最初にイベントを呼び出すメソッドに移動する方法があるので、「外側では」1つの通常の関数がパラメーターとして渡されているように見えますか?