|
|
@@ -727,29 +727,12 @@ CompilerProto.parseDeps = function () {
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * Add an event delegation listener
|
|
|
+ * Add an event listener to the delegator
|
|
|
* listeners are instances of directives with `isFn:true`
|
|
|
*/
|
|
|
CompilerProto.addListener = function (listener) {
|
|
|
var event = listener.arg,
|
|
|
- delegator = this.delegators[event]
|
|
|
- if (!delegator) {
|
|
|
- // initialize a delegator
|
|
|
- delegator = this.delegators[event] = {
|
|
|
- targets: [],
|
|
|
- handler: function (e) {
|
|
|
- var i = delegator.targets.length,
|
|
|
- target
|
|
|
- while (i--) {
|
|
|
- target = delegator.targets[i]
|
|
|
- if (target.el.contains(e.target) && target.handler) {
|
|
|
- target.handler(e)
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- this.el.addEventListener(event, delegator.handler)
|
|
|
- }
|
|
|
+ delegator = this.delegators[event] || this.addDelegator(event)
|
|
|
delegator.targets.push(listener)
|
|
|
}
|
|
|
|
|
|
@@ -761,6 +744,33 @@ CompilerProto.removeListener = function (listener) {
|
|
|
targets.splice(targets.indexOf(listener), 1)
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * Add an event delegator
|
|
|
+ */
|
|
|
+CompilerProto.addDelegator = function (event) {
|
|
|
+ var delegator = this.delegators[event] = {
|
|
|
+ targets: [],
|
|
|
+ handler: function (e) {
|
|
|
+ var target,
|
|
|
+ i = delegator.targets.length,
|
|
|
+ stop = e.stopPropagation
|
|
|
+ // overwrite propagation control
|
|
|
+ e.stopPropagation = function () {
|
|
|
+ e.stopped = true
|
|
|
+ stop.call(e)
|
|
|
+ }
|
|
|
+ while (i--) {
|
|
|
+ target = delegator.targets[i]
|
|
|
+ if (!e.stopped && target.handler && target.el.contains(e.target)) {
|
|
|
+ target.handler(e)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ this.el.addEventListener(event, delegator.handler)
|
|
|
+ return delegator
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* Do a one-time eval of a string that potentially
|
|
|
* includes bindings. It accepts additional raw data
|