2012-01-10 11 views
1

jQueryで.delegate()を使用しているハンドラコールバックに問題があります。この設定では、$ Bが作成された場所にある2つのファイルと、単純な$(doc).readyファイルが使用されます。jQuery代理コールバック

<g>の束(50+)を持つSVGファイルがあります。<g>ノードに機能を追加する代わりに、デリゲートはクリーンなオプションのように見えます。

しかし、私はJavaScriptに関する知識が相対的に不足していると考えています。正常に動作します

$C.Events.onStation({ 
    click : function(e){ 
     console.log(e) 
      return false; 
    }, 
    mouseenter : function(e){ 
     return false; 
    }, 
    mouseleave : function(e){ 
     return false; 
    } 
}) 

はここに私のメインの準備()ファイルのセットアップです。すべてのは、私の$ B.Eventsは、オブジェクトの内部など、通過:

Events : new function(){ 
    var _station = function(obj){ 
     // delegate the events to the primary SVG node 
     for(var type in obj){ 
      $(City.Map.node).delegate('g', type, function(){ 
      obj[type]() 
     }) 
    } 
    return { 
     onStation : _station 
    } 
    // others taken out for relevance 
}() 

さて、これで、私は別の関数でラップするのではなく、obj[type]に渡した場合、それが正常に動作します。それだけで問題が起こるのは、渡された関数(つまりイベントデータオブジェクトを使いこなす)でいくつかの事前作業を行うだけでなく、すべてのreturn falseを委任コードに移動して、他のファイルを掘り起こす必要がないことです。

jQueryの.delegate()関数でコールバックハンドラ関数内で実行される最初のコードブロックから関数を取得するにはどうすればよいですか?

編集レスポンス

で、私はそれが正しい方向への一歩だと思います。私はそれがJSの性質に起因するものであり、必ずしもロジックではないと感じていました。だから私は時々Javascriptが嫌いです。

このソリューションの問題は、プリミティブをジェネリックビルダー関数に渡すことです。実行可能な関数を格納して返す必要があります。私が試みたいくつかのことは成功しなかった。

var _station = function(events){ 
    var _funcs = {} 
    var _selection = null; 

    var create = function(f){ 
     return function(){ return f() } 
    } 
    for(var t in events){ 
     _funcs[t] = create(t, events[t]) 
    } 
    console.log(_funcs) 

    // delegate the events to the primary SVG node 
    for(var type in events){ 
     $('#stations', Bart.Map.node).delegate('g', type, function(e){     
      _funcs[type](e) 
      e.stopPropagation() 
     }) 
    } 
} 

を、私はそれが機能として戻ってくるが、私は私の人生のためにそれを実行することはできませんlog(_funcs[type])時:ここに私が試した多くの例があります。

この閉鎖物は私を殺します。

+1

私は確信していませんが、私はあなたの問題は、ループでクロージャを作成していると仮定しています。 [この質問]を見てください(http:// stackoverflow。com/questions/750486/javascript-closure-inside-loops-simple-practical-example)、この問題が修正されたかどうかをお知らせください。 –

+0

はい、私はそれが何かとは思っていますが、自分の用途に合ったコードを手に入れることはできません。元の投稿を反映するように更新しました。感謝フェリックス、将来の使用のためにそれをブックマークするつもり。 – Phix

答えて

2

クロージャとループの生成にはまだ問題があります。あなたは、イベントデータとしてtypeを渡すことができます。

var $target = $('#stations', Bart.Map.node); // capturing is a good idea 

for(var type in events){ 
    $target.on(type, 'g', {type: type}, function(e){     
     _funcs[e.data.type](e); 
     e.stopPropagation(); 
    }) 
} 

それとも、jQuery.eacheventsを反復処理することができます。

​​

重要な点は、すべての閉鎖(イベントハンドラ)はそれ自身のtype変数へのアクセス権を持っていることです。

.delegate()の代わりに.on()を使用しました。これはjQuery 1.7以降で優先されています。

+0

あなたはそれに私を打つ!私は 'on()'メソッドを再訪しました。これはうまくいくようです。時間を置いていただきありがとうございます。乾杯! – Phix

+0

あなたは大歓迎です:) –

+0

@FelixKling、SVG要素のイベントを委任する方法を知っていますか? – Starx

関連する問題