对象文字和事件监听器,最佳实践?

时间:2012-04-25 08:59:48

标签: javascript jquery oop javascript-events

假设我有一个对象,有一些属性和方法:

var Form = {
    name: 'sign-up',

    show: function() {...},
    hide: function() {...},
    validate: function() {...},
    updateCurrency: function() {...},
    handleCheckBox: function() {...}
}

现在我想在我的表单中发生某些事件时调用不同的方法,如下所示:

$('#country-select').bind('change', function() {
    Form.updateCurrency();
});

$("input[type='checkbox']").bind('change', function() {
    Form.handleCheckBox();
});

我有很多这些事件监听器,坦率地说,我发现它们很丑陋地逐一列出,而不是直接与它们相关的对象绑定。是否有更优雅的方法将它们封装在我的对象文字Form中?有最好的做法吗?

3 个答案:

答案 0 :(得分:6)

我喜欢@gillesc回答,它在正确的轨道上。 但是,我认为我们可以做得更好。

@gillesc答案的主要问题是它缺少事物的动态方面(例如事件处理程序),它也会强制你定义丑陋的回调函数。

所以我认为你应该如何解决你的问题。

// Test object
var testObj = {
    // Our event handlers. 
    // Notice how we must only define the callback function name here. 
    // Not the function itself. The callback function must be defined in testObj.
    handlers: {
        '#form submit': 'onSubmit'
    },
    // Method that will register all handlers to some selector
    registerHandlers: function() {
        var that = this;
        // Go through the handlers list.
        $.each(this.handlers, function(k, v) {
            // Parsing the event to two different parts. 
            // 1. trigger event
            // 2. selector
            var split = k.split(" "),
                el = split[0],
                trigger = split[1];

            // Delegating the trigger to selector
            $(document).delegate(el, trigger, that[v]);
        });
    },
    // Our actual callback function
    onSubmit: function(evt) {
        evt.preventDefault();
        alert("submit");
    }
};

一切如何运作?这很简单!我们只需要致电testObj.registerHandlers()

JSFiddle demo

答案 1 :(得分:3)

更好地组织标记并将类添加到与事件处理程序方法匹配的元素中,以便您可以轻松创建处理程序列表并对其进行迭代以将它们绑定到目标元素。

Var Form = {
    ....,
    handlers: {
        country: function() {},
        checkbox: function() {}
    }
};

$.each(FORMS.handlers, function(k, v) {
    $('.' + k).on('change', v);
});


<select class="country">....</select>
<input class="checkbox" type="checkbox" />

然后你要做的就是添加类和处理程序来扩展

答案 2 :(得分:0)

好吧,您不需要将函数包装在更多函数中以便开始。你不能只是:

$('#country-select').bind('change', Form.updateCurrency);
$("input[type='checkbox']").bind('change', Form.handleCheckBox);