Object literals and event listeners, best practice?
javascript, jquery, jquery-events, oop
Solution
I like `@gillesc` answer, it's on the right tracks. However, I think we can do better.
The main issue with `@gillesc` answer is that its missing the dynamic aspect of things (event handlers for instance), also it forces your to define ugly callback functions.
So heres how I think you should solve your problem.
// 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");
}
};
How would it all work? Thats easy! We just need to call `testObj.registerHandlers()`.
JSFiddle demo
Problem
Suppose I have an object, with some properties and methods: ``` var Form = { name: 'sign-up', show: function() {...}, hide: function() {...}, validate: function() {...}, updateCurrency: function() {...}, handleCheckBox: function() {...} } ``` Now I want to call different methods when certain events happen in my form like so: ``` $('#country-select').bind('change', function() { Form.updateCurrency(); }); $("input[type='checkbox']").bind('change', function() { Form.handleCheckBox(); }); ``` I have a lot of these event listeners, and frankly, I find them ugly listed out one by one like that and not tied directly to the object they relate to. Is there a more elegant way of encapsulating them within my object literal `Form`? Is there a best practice?