Skip to content

Commit

Permalink
style cleanup. remove some underscore-specific features
Browse files Browse the repository at this point in the history
  • Loading branch information
akre54 committed Mar 29, 2014
1 parent c3cf5a8 commit 2226d30
Showing 1 changed file with 20 additions and 20 deletions.
40 changes: 20 additions & 20 deletions backbone.nativeview.js
Expand Up @@ -96,59 +96,59 @@
// result of calling bound `listener` with the parameters given to the
// handler.
delegate: function(eventName, selector, listener) {
if (_.isFunction(selector)) {
if (typeof selector === 'function') {
listener = selector;
selector = null;
}

var root = this.el, handler;
if (!selector) handler = listener;
else handler = function (e) {
var handler = selector ? function (e) {
var node = e.target || e.srcElement;
for (; node && node != root; node = node.parentNode) {
for (; node && node != this.el; node = node.parentNode) {

This comment has been minimized.

Copy link
@gaearon

gaearon Jul 6, 2014

Contributor

@akre54 The function is unbound, so at this point this.el is undefined. Thus node != this.el is always true and it blows through DOM up to document where matchSelector causes Illegal invocation.

This comment has been minimized.

Copy link
@akre54

akre54 Jul 6, 2014

Author Owner

Urg. Add a pull and I'll merge? Using Function.prototype.bind is cool here since we're only targeting modern browsers

if (matchesSelector.call(node, selector)) {
e.delegateTarget = node;
return listener.apply(this, arguments);
}
}
};
} : listener;

elementAddEventListener.call(root, eventName, handler, false);
elementAddEventListener.call(this.el, eventName, handler, false);
this._domEvents.push({eventName: eventName, handler: handler, listener: listener, selector: selector});
return handler;
},

// Remove a single delegated event. Either `eventName` or `selector` must
// be included, `selector` and `listener` are optional.
undelegate: function(eventName, selector, listener) {
if (_.isFunction(selector)) {
if (typeof selector === 'function') {
listener = selector;
selector = null;
}

var handlers = this._domEvents;

if (this.el) {
_(handlers).chain()
.filter(function(item) {
return item.eventName === eventName &&
var handlers = this._domEvents.slice();
for (var i = 0, len = handlers.length; i < len; i++) {
var item = handlers[i];

var match = item.eventName === eventName &&
(listener ? item.listener === listener : true) &&
(selector ? item.selector === selector : true);
})
.forEach(function(item) {
elementRemoveEventListener.call(this.el, item.eventName, item.handler, false);
handlers.splice(_.indexOf(handlers, item), 1);
}, this);

if (!match) continue;

elementRemoveEventListener.call(this.el, item.eventName, item.handler, false);
this._domEvents.splice(_.indexOf(handlers, item), 1);
}
}
return this;
},

// Remove all events created with `delegate` from `el`
undelegateEvents: function() {
if (this.el) {
_.each(this._domEvents, function(item) {
for (var i = 0, len = this._domEvents.length; i < len; i++) {
var item = this._domEvents[i];
elementRemoveEventListener.call(this.el, item.eventName, item.handler, false);
}, this);
};
this._domEvents = [];
}
return this;
Expand Down

0 comments on commit 2226d30

Please sign in to comment.