|
|
@@ -1,6 +1,29 @@
|
|
|
var config = require('./config'),
|
|
|
watchArray = require('./watch-array')
|
|
|
|
|
|
+// sniff matchesSelector() method name.
|
|
|
+
|
|
|
+var matches = 'atchesSelector',
|
|
|
+ prefixes = ['m', 'webkitM', 'mozM', 'msM']
|
|
|
+
|
|
|
+prefixes.some(function (prefix) {
|
|
|
+ var match = prefix + matches
|
|
|
+ if (document.body[match]) {
|
|
|
+ matches = match
|
|
|
+ return true
|
|
|
+ }
|
|
|
+})
|
|
|
+
|
|
|
+function delegateCheck (current, top, selector) {
|
|
|
+ if (current.webkitMatchesSelector(selector)) {
|
|
|
+ return current
|
|
|
+ } else if (current === top) {
|
|
|
+ return false
|
|
|
+ } else {
|
|
|
+ return delegateCheck(current.parentNode, top, selector)
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
module.exports = {
|
|
|
|
|
|
text: function (value) {
|
|
|
@@ -41,14 +64,42 @@ module.exports = {
|
|
|
|
|
|
on: {
|
|
|
fn : true,
|
|
|
+ bind: function (handler) {
|
|
|
+ if (this.seed.each) {
|
|
|
+ this.selector = '[' + this.directiveName + '*="' + this.expression + '"]'
|
|
|
+ this.delegator = this.seed.el.parentNode
|
|
|
+ }
|
|
|
+ },
|
|
|
update: function (handler) {
|
|
|
+ this.unbind()
|
|
|
+ if (!handler) return
|
|
|
var self = this,
|
|
|
- event = this.arg
|
|
|
- if (this.handler) {
|
|
|
- this.el.removeEventListener(event, this.handler)
|
|
|
- }
|
|
|
- if (handler) {
|
|
|
- var proxy = function (e) {
|
|
|
+ event = this.arg,
|
|
|
+ selector = this.selector,
|
|
|
+ delegator = this.delegator
|
|
|
+ if (delegator) {
|
|
|
+
|
|
|
+ // for each blocks, delegate for better performance
|
|
|
+ if (!delegator[selector]) {
|
|
|
+ console.log('binding listener')
|
|
|
+ delegator[selector] = function (e) {
|
|
|
+ var target = delegateCheck(e.target, delegator, selector)
|
|
|
+ if (target) {
|
|
|
+ handler({
|
|
|
+ el : target,
|
|
|
+ originalEvent : e,
|
|
|
+ directive : self,
|
|
|
+ seed : target.seed
|
|
|
+ })
|
|
|
+ }
|
|
|
+ }
|
|
|
+ delegator.addEventListener(event, delegator[selector])
|
|
|
+ }
|
|
|
+
|
|
|
+ } else {
|
|
|
+
|
|
|
+ // a normal handler
|
|
|
+ this.handler = function (e) {
|
|
|
handler({
|
|
|
el : e.currentTarget,
|
|
|
originalEvent : e,
|
|
|
@@ -56,13 +107,18 @@ module.exports = {
|
|
|
seed : self.seed
|
|
|
})
|
|
|
}
|
|
|
- this.el.addEventListener(event, proxy)
|
|
|
- this.handler = proxy
|
|
|
+ this.el.addEventListener(event, this.handler)
|
|
|
+
|
|
|
}
|
|
|
},
|
|
|
unbind: function () {
|
|
|
- var event = this.arg
|
|
|
- if (this.handlers) {
|
|
|
+ var event = this.arg,
|
|
|
+ selector = this.selector,
|
|
|
+ delegator = this.delegator
|
|
|
+ if (delegator && delegator[selector]) {
|
|
|
+ delegator.removeEventListener(event, delegator[selector])
|
|
|
+ delete delegator[selector]
|
|
|
+ } else if (this.handler) {
|
|
|
this.el.removeEventListener(event, this.handler)
|
|
|
}
|
|
|
}
|
|
|
@@ -91,6 +147,7 @@ module.exports = {
|
|
|
var Seed = require('./seed'),
|
|
|
node = this.el.cloneNode(true)
|
|
|
var spore = new Seed(node, {
|
|
|
+ each: true,
|
|
|
eachPrefixRE: new RegExp('^' + this.arg + '.'),
|
|
|
parentSeed: this.seed,
|
|
|
index: index,
|