dresscode-bricks
Advanced tools
Comparing version 0.2.5 to 0.2.6
Bricks.EventsController = Bricks.create({ | ||
constructor: function() { | ||
this._listeners = {}; | ||
this._listeners = []; | ||
}, | ||
on: function(el, events, fn, ctx) { | ||
var names = events.split(','); | ||
for (var i = 0; i < names.length; i++) { | ||
var name = Bricks.String.trim(names[i]); | ||
this._listeners[name] = this._listeners[name] || []; | ||
var handler = function(evt) { | ||
return fn.call(ctx, evt || window.event); | ||
}; | ||
this._listeners[name].push([el, fn, ctx, handler]); | ||
if (el.addEventListener) { | ||
el.addEventListener(name, handler, false); | ||
} else if (el.attachEvent) { | ||
el.attachEvent('on' + name, handler); | ||
events = this._normalizeEventTypes(events); | ||
var handler = function(evt) { | ||
return fn.call(ctx, evt || window.event); | ||
}; | ||
for (var i = 0; i < events.length; i++) { | ||
var event = typeof events[i] === 'string' ? events[i] : 'action'; | ||
var observable = typeof events[i] === 'string' ? el : new events[i](el); | ||
this._listeners.push([el, events[i], fn, ctx, observable, event, handler]); | ||
if (observable.addEventListener) { | ||
observable.addEventListener(event, handler, false); | ||
} else if (observable.attachEvent) { | ||
observable.attachEvent('on' + event, handler); | ||
} | ||
@@ -24,11 +24,12 @@ } | ||
un: function(el, events, fn, ctx) { | ||
var names = events.split(','); | ||
for (var i = 0; i < names.length; i++) { | ||
var name = Bricks.String.trim(names[i]); | ||
var listeners = this._listeners[name] || []; | ||
for (var j = 0; j < listeners.length; j++) { | ||
var listener = listeners[j]; | ||
if (listener[0] == el && listener[1] == fn && listener[2] == ctx) { | ||
listeners.splice(j, 1); | ||
this._removeListener(el, name, listener[3]); | ||
events = this._normalizeEventTypes(events); | ||
for (var i = 0; i < events.length; i++) { | ||
for (var j = 0; j < this._listeners.length; j++) { | ||
var item = this._listeners[j]; | ||
if (item[0] === el && item[1] === events[i] && item[2] === fn && item[3] === ctx) { | ||
this._listeners.splice(j, 1); | ||
this._removeListener(item[4], item[5], item[6]); | ||
if (typeof item[1] === 'function' && typeof item[4].destroy === 'function') { | ||
item[4].destroy(); | ||
} | ||
break; | ||
@@ -41,13 +42,33 @@ } | ||
unAll: function() { | ||
for (var name in this._listeners) { | ||
if (this._listeners.hasOwnProperty(name)) { | ||
for (var i = 0; i < this._listeners[name].length; i++) { | ||
this._removeListener(this._listeners[name][i][0], name, this._listeners[name][i][3]); | ||
for (var i = 0; i < this._listeners.length; i++) { | ||
var item = this._listeners[i]; | ||
this._removeListener(item[4], item[5], item[6]); | ||
if (typeof item[1] === 'function' && typeof item[4].destroy === 'function') { | ||
item[4].destroy(); | ||
} | ||
} | ||
this._listeners.length = 0; | ||
}, | ||
_normalizeEventTypes: function(events) { | ||
if (!Bricks.isArray(events)) { | ||
events = [events]; | ||
} | ||
var result = []; | ||
for (var i = 0; i < events.length; i++) { | ||
if (typeof events[i] === 'string') { | ||
var names = events[i].split(','); | ||
for (var j = 0; j < names.length; j++) { | ||
result.push(Bricks.String.trim(names[j])); | ||
} | ||
delete this._listeners[name]; | ||
} else if (typeof events[i] === 'function') { | ||
result.push(events[i]); | ||
} else { | ||
throw new TypeError('events parameter must be a string, a constructor or an array of strings and/or constructors.'); | ||
} | ||
} | ||
return result; | ||
}, | ||
_removeListener: function(el, name, fn) { | ||
@@ -54,0 +75,0 @@ if (el.removeEventListener) { |
{ | ||
"name": "dresscode-bricks", | ||
"version": "0.2.5", | ||
"version": "0.2.6", | ||
"author": { | ||
@@ -5,0 +5,0 @@ "name": "Kolyaj", |
128159
3022