イベント処理の委譲
ステートフルJavaScript4.2.4
by FiNGAHOLiC
HTML
<script src="https://getfirebug.com/firebug-lite-debug.js"></script>
<div id="users">
<form>
<input type="search" value="" placeholder="Enter a query">
<button>Search</button>
</form>
</div>
JavaScript
var exports = this;
(function($, exports){
var mod = {};
mod.create = function(includes){
var result = function(){
this.initializer.apply(this, arguments);
this.init.apply(this, arguments);
};
result.fn = result.prototype;
result.fn.init = function(){};
result.proxy = function(func){ return $.proxy(func, this); };
result.fn.proxy = result.proxy;
result.include = function(ob){ $.extend(this.fn, ob); };
result.extend = function(ob){ $.extend(this, ob); };
result.include({
initializer: function(options){
this.options = options;
for(var key in this.options){
this[key] = this.options[key];
};
if(this.events) this.delegateEvents();
if(this.elements) this.refreshElements();
},
$: function(selector){
return $(selector, this.el);
},
refreshElements: function(){
for(var key in this.elements){
this[this.elements[key]] = this.$(key);
};
},
eventSplitter: /^(\w+)\s*(.*)$/,
delegateEvents: function(){
for(var key in this.events){
var methodName = this.events[key];
var method = this.proxy(this[methodName]);
var match = key.match(this.eventSplitter);
var eventName = match[1], selector = match[2];
if(selector === ''){
this.el.bind(eventName, method);
}else{
this.el.delegate(selector, eventName, method);
};
};
}
});
if(includes)...