我正在尝试在与 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 或特定的设计模式。所以我开始阅读:
到目前为止,我还没有找到一个已知的 JavaScript 面向对象编程的解决方案,它与页面上的元素密切相关。我发现的所有 OO JS 示例都没有元素作为起点。欢迎所有建议。