javascript - 如何在 JS 中基于元素编写对象

标签 javascript jquery oop

我正在尝试用 JavaScript 构建干净的面向对象代码,该代码与 HTML 元素紧密相连。

我试图解决的情况是一个页面给出了多个建议。 每个建议都有几个选项,每个选项都有一个激活它的按钮。 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>

我知道如何在不使用对象的情况下编写脚本,但由于我想向建议添加更多功能,所以我想采用干净的面向对象方法。 我希望您知道面向对象的好处并接受我的选择

到目前为止我尝试过的内容如下:

$(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 实例的范围。

我有一些想法,但它们都有自己的注意事项:

到目前为止,我还找不到与页面元素紧密相关的 JavaScript 中面向对象编程的已知解决方案。我发现的所有 OO JS 示例都没有元素作为起点。 欢迎所有建议。

最佳答案

您可以使用 $.proxy() 来实现:

$el.click($.proxy(this.onclick, this));

然后 onclick 将在 Button 对象的上下文中调用。

关于javascript - 如何在 JS 中基于元素编写对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16250085/

相关文章:

javascript - jQuery event.Preventdefault();没有做任何事

java - 在 ArrayList 或 Map 中添加树/图的 n 个节点的空间复杂度

javascript - 如何删除base64图像字符串

javascript - 如何加速动画汽车并让它在它消失之前消失?

php - 提交按钮在 IE/Safari 中不起作用,在 Chrome 中有效,但表单信息未通过

oop - F# 未定义值或构造函数,即使使用 get 和 set

c# - 为什么我们使用无成员接口(interface)?

javascript - 在 hapi.js 中设置标题

javascript - AngularJS 将 html 附加到 dom 元素

JavaScript 隐藏 HTML 表单的提交按钮,直到从另一个输入提交