2012-04-29 8 views
0

私はJavaScript初心者です。 Node.on( 'click'、foo)にEventListenerを追加する必要がありました。私はそのようなことはしていたことをrememberredたよりEventListener例 "The Good Parts"

var i = 0; 
Y.one('#btnDel' + i).on('click', function() { 
    Y.one('#part' + i).remove(true); 
}); 

「JavaScriptの::良い部品」ブック、と私は(ページ39)それを見つけた:

を - もちろん - FAILと私の最初の試みでした
var add_the_handlers = function (nodes) { 
    var i; 
    for (i = 0; i < nodes.length; i += 1) { 
     nodes[i].onclick = function (i) { 
      return function (e) { 
       alert(e); 
      }; 
     }(i); 
    } 
}; 

しかし、これはうまくいきません。 2番目(より21番目)の見方では、私にとって間違ったことがありました。引数 'e'を必要とする内部関数を返しますが、 'i'は内部関数に呼び出されません。 私はこれを「固定」と今ではYUIと私の場合に動作します:on the errata pakgeオン

Y.one('#btnDel' + i).on('click', function (i) { 
    return function() { 
     Y.one('#part' + i).remove(true); 
    } 
}(i)); 

は、誰かがこれも「修正」を書きました。しかし、著者(Crockford!)はまだ本の版にとどまっています。私が監督するものはありますか?私の場合、私のバージョンが動作するのは偶然のことですか?

ps:私の匿名リターン機能でithis.iにバインドすると、グローバルオブジェクトになりますか?

pps:申し訳ありません、私の偉大な英語です。 :|

答えて

0

クラスセレクターですべてのボタンを集めようとします。そして、あなたは単に「各」機能を使用することができます。

Y.all(".buttonClassName").each(function (oneButtonNode) { 
    oneButtonNode.on("click", function (event) { 
     //do something 
     alert(this.get("id")); 
    }) 
}); 

YUI3ドキュメンタリー:私はループの外で定義されていますが、クリックが発生するまでの加入者機能では評価されませんのでhttp://yuilibrary.com/yui/docs/node/#nodelist

2

...または使用イベントの委任:http://yuilibrary.com/yui/docs/node/node-evt-delegation.html

は、解決策としては、イベントの委任を使用しています。

1)あなたは希望の要素(あなたのケースではボタン)に委任するイベントリスナを1つだけ持つことになります。 2)動的コンテンツの方がはるかに良いでしょう。後で別の要素(例:ボタン)を追加した場合、別のリスナを追加する必要はありません。既に委任によって処理されています。

...あなたが参照している例(ページ39)は、新人のほとんどのための邪魔になっている典型的な閉鎖です。だから心配はありません。あなたは自分で解決策を見つけましたが、それは印象的です。