HTML 要素に密接に関連する JavaScript で、クリーンなオブジェクト指向コードを構築しようとしています。
私が解決しようとしている状況は、複数の提案が与えられているページです。すべての提案にはいくつかのオプションがあり、すべてのオプションにはそれをアクティブにするためのボタンがあります。HTML の簡略化されたスニペットは次のようになります。
<div class="row suggestion">
<div class="span6">
<ul>
<li data-id="1">
<span>Option 1</span>
<span><a class="btn btn-mini" href="#">pick me</a></span>
</li>
<li data-id="2">
<span>Option 2</span>
<span><a class="btn btn-mini" href="#">pick me</a></span>
</li>
</ul>
</div>
<div class="span6">
<button>Save</button>
</div>
</div>
オブジェクトを使用せずにこれをスクリプト化する方法は知っていますが、提案に機能を追加したいので、クリーンな OO アプローチを採用したいと考えています。OO の利点を知っていて、私の選択を選んでください。
これまでに試したことは次のようになります。
$(document).ready(function(){
var suggestions = [];
$('.row.suggestion').each(function(){
suggestions.push(
new Suggestion($(this))
);
});
});
function Suggestion($el){
var options = new Array();
$el.find('a').each(function(){
options.push(new Button($(this)));
})
}
Suggestion.prototype = {
childChange : function(){
// do some checks;
}
}
function Button($el){
this.$el = $el;
this.id = $el.parents('li').data('id');
$el.click(this.onclick);
}
Button.prototype = {
checked : false,
$el : null,
id : 0,
onclick : function(){
// set this button active
// notify my parent suggestion that i've changed
}
}
onclick 関数までは期待どおりに動作します。トリガーされると、関数は開始されますが、スコープが変更されます。オブジェクトにアクセスできると思っていましたが、クリックした要素の jQuery インスタンスのスコープに制限されています。
私はいくつかのアイデアを持っていましたが、それらにはすべて注意事項がありました。
- 特定のDOM要素にすべての属性と機能を追加しましたが、そのOOを行う方法がわかりませんでした
- 要素に属性を追加するために jquery.data() を使用します。しかし、関数をjqueryインスタンスに追加する方法がわかりませんでした。
- Prototype、YUI3、または特定のデザイン パターンなどの別のライブラリを使用します。だから私は読み始めました:
- http://prototypejs.org/learn/extensions.html
- http://addyosmani.com/resources/essentialjsdesignpatterns/book/ (少なくとも前半)
- YUI3 に関するいくつかのブログ投稿
この瞬間まで、ページ上の要素に密接に関連する JavaScript のオブジェクト指向プログラミングに対する既知の解決策を見つけることができません。私が見つけたすべての OO JS の例には、出発点として要素がありません。すべての提案を歓迎します。