From 42350d0a507d4f8863beb8f9e357d82b9a157081 Mon Sep 17 00:00:00 2001 From: Paul Miller Date: Thu, 28 Nov 2013 18:53:00 +0200 Subject: [PATCH] Release 0.6.0. --- CHANGELOG.md | 8 +++ bower.json | 2 +- component.json | 2 +- exoskeleton.js | 130 ++++++++++++++++++++++++------------------------- lib/header.js | 2 +- package.json | 2 +- 6 files changed, 76 insertions(+), 70 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7b7da89..86a5d7f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,11 @@ +# Exoskeleton 0.6.0 (28 November 2013) +* **Breaking:** removed `View#delegate` and `View#undelegate`. + These methods now reside in `utils` and can be excluded + in custom builds. +* Collection model ids can now be arbitrary js props. + E.g. `collection.get('toString')`. +* `Collection#find` now works in no-underscore environment. + # Exoskeleton 0.5.1 (3 November 2013) * Added support for `contentType` option in `utils.ajax` diff --git a/bower.json b/bower.json index 358f294..2d1fb97 100644 --- a/bower.json +++ b/bower.json @@ -1,7 +1,7 @@ { "name": "exoskeleton", "main": "exoskeleton.js", - "version": "0.5.1", + "version": "0.6.0", "homepage": "https://github.com/paulmillr/exoskeleton", "author": "Paul Miller (http://paulmillr.com)", "description": "Faster and leaner Backbone for your HTML5 apps.", diff --git a/component.json b/component.json index e946b44..90cf0dd 100644 --- a/component.json +++ b/component.json @@ -2,7 +2,7 @@ "name": "exoskeleton", "repo": "paulmillr/exoskeleton", "description": "Faster and leaner Backbone for your HTML5 apps.", - "version": "0.5.1", + "version": "0.6.0", "keywords": [ "Backbone", "Exoskeleton", diff --git a/exoskeleton.js b/exoskeleton.js index e01de3c..b4927f8 100644 --- a/exoskeleton.js +++ b/exoskeleton.js @@ -1,5 +1,5 @@ /*! - * Exoskeleton.js 0.5.1 + * Exoskeleton.js 0.6.0 * (c) 2013 Paul Miller * Based on Backbone.js * (c) 2010-2013 Jeremy Ashkenas, DocumentCloud @@ -304,6 +304,66 @@ utils.matchesSelector = (function() { }; })(); +utils.delegate = function(view, eventName, selector, callback) { + if (typeof selector === 'function') { + callback = selector; + selector = null; + } + + if (typeof callback !== 'function') { + throw new TypeError('View#delegate expects callback function'); + } + + var root = view.el; + var bound = callback.bind(view); + var handler = selector ? function(event) { + for (var el = event.target; el && el !== root; el = el.parentNode) { + if (utils.matchesSelector(el, selector)) { + // event.currentTarget or event.target are read-only. + event.delegateTarget = el; + return bound(event); + } + } + } : bound; + + root.addEventListener(eventName, handler, false); + view._handlers.push({ + eventName: eventName, selector: selector, + callback: callback, handler: handler + }); + return handler; +}; + +utils.undelegate = function(view, eventName, selector, callback) { + if (typeof selector === 'function') { + callback = selector; + selector = null; + } + + var handlers = view._handlers; + var removeListener = function(item) { + view.el.removeEventListener(item.eventName, item.handler, false); + }; + + // Remove all handlers. + if (!eventName && !selector && !callback) { + handlers.forEach(removeListener); + view._handlers = []; + } else { + // Remove some handlers. + handlers + .filter(function(item) { + return item.eventName === eventName && + (callback ? item.callback === callback : true) && + (selector ? item.selector === selector : true); + }) + .forEach(function(item) { + removeListener(item); + handlers.splice(handlers.indexOf(item), 1); + }); + } +}; + // Make AJAX request to the server. // Usage: // var callback = function(error, data) {console.log('Done.', error, data);}; @@ -1411,75 +1471,13 @@ _.extend(View.prototype, Events, { this.el = this.$el[0]; } else { if (this.el) this.undelegateEvents(); - var el = (typeof element === 'string') ? + this.el = (typeof element === 'string') ? document.querySelector(element) : element; - this.el = el; } if (delegate !== false) this.delegateEvents(); return this; }, - delegate: function(eventName, selector, callback) { - if (typeof selector === 'function') { - callback = selector; - selector = null; - } - - if (typeof callback !== 'function') { - throw new TypeError('View#delegate expects callback function'); - } - - var root = this.el; - var bound = callback.bind(this); - var handler = selector ? function(event) { - for (var el = event.target; el && el !== root; el = el.parentNode) { - if (utils.matchesSelector(el, selector)) { - // event.currentTarget or event.target are read-only. - event.delegateTarget = el; - return bound(event); - } - } - } : bound; - - root.addEventListener(eventName, handler, false); - this._handlers.push({ - eventName: eventName, selector: selector, - callback: callback, handler: handler - }); - return handler; - }, - - undelegate: function(eventName, selector, callback) { - if (typeof selector === 'function') { - callback = selector; - selector = null; - } - - var root = this.el; - var handlers = this._handlers; - var removeListener = function(item) { - root.removeEventListener(item.eventName, item.handler, false); - }; - - // Remove all handlers. - if (!eventName && !selector && !callback) { - handlers.forEach(removeListener); - this._handlers = []; - } else { - // Remove some handlers. - handlers - .filter(function(item) { - return item.eventName === eventName && - (callback ? item.callback === callback : true) && - (selector ? item.selector === selector : true); - }) - .forEach(function(item) { - removeListener(item); - handlers.splice(handlers.indexOf(item), 1); - }); - } - }, - // Set callbacks, where `this.events` is a hash of // // *{"event selector": "callback"}* @@ -1511,7 +1509,7 @@ _.extend(View.prototype, Events, { method = method.bind(this); this.$el.on(eventName, (selector ? selector : null), method); } else { - this.delegate(eventName, selector, method); + utils.delegate(this, eventName, selector, method); } } return this; @@ -1524,7 +1522,7 @@ _.extend(View.prototype, Events, { if (Backbone.$) { this.$el.off('.delegateEvents' + this.cid); } else { - this.undelegate(); + utils.undelegate(this); } return this; }, diff --git a/lib/header.js b/lib/header.js index 28dd5da..b07487c 100644 --- a/lib/header.js +++ b/lib/header.js @@ -1,5 +1,5 @@ /*! - * Exoskeleton.js 0.5.1 + * Exoskeleton.js 0.6.0 * (c) 2013 Paul Miller * Based on Backbone.js * (c) 2010-2013 Jeremy Ashkenas, DocumentCloud diff --git a/package.json b/package.json index 00ba632..9380783 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "exoskeleton", - "version": "0.5.1", + "version": "0.6.0", "description": "Faster and leaner Backbone for your HTML5 apps.", "main": "exoskeleton.js", "directories": {