diff options
author | Arinde Eniola <eniolaarinde1@gmail.com> | 2016-04-13 15:40:42 +0300 |
---|---|---|
committer | Arinde Eniola <eniolaarinde1@gmail.com> | 2016-04-13 15:41:25 +0300 |
commit | 15966e20179c54729cb9fd1e3130412ae8fdeea8 (patch) | |
tree | c8ff9701a42c5bafd8bb156cb5c5c91714481478 | |
parent | 344f575fcf34113d8c15cd0413f4f30e0815829c (diff) |
extend the on and off methods in the event manager
-rw-r--r-- | app/assets/javascripts/glpage.js.coffee | 78 |
1 files changed, 61 insertions, 17 deletions
diff --git a/app/assets/javascripts/glpage.js.coffee b/app/assets/javascripts/glpage.js.coffee index 26767c45ea4..900deeed0e0 100644 --- a/app/assets/javascripts/glpage.js.coffee +++ b/app/assets/javascripts/glpage.js.coffee @@ -13,31 +13,75 @@ window.GlPage = { name: generated } @instances[generated] - + + delegate: (targetsObj) -> + (e, data) -> + $target = $(e.target) + + for selector, callback of targetsObj + child = $target.find(selector) + if !e.isPropagationStopped() && child.length + data ?= {} + e.currentTarget = data.el = child[0] + callback.apply(e.currentTarget, [e, data]) + + triggerEventAlias: (targetEvent) -> + (e, data) -> + $(e.target).trigger targetEvent, data + return + get: (name) -> @instances[name].instance - - on: (el, args...) -> - $el = $(el) + + on: (selector, eventType, handler) -> + $el = $(selector) + callback = undefined + type = eventType + + if typeof handler is 'string' + callback = @triggerEventAlias(handler) + else if typeof handler is 'object' + callback = @delegate(handler) + else + callback = handler + + if typeof callback isnt 'function' + throw new Error 'Unable to register event #{type}, handler should be a function, object or string' + @events.push({ el: el, - args: args + type: eventType, + handler: callback }) - $el.on.apply($el, args) - - off: (el, args...) -> - $el = $(el) - $el.off.apply($el, args) - - allOff: -> - @events.forEach((event) => - $el = $(event.el) - $el.off.apply($el, event.args) - ) + + $el.on(type, callback) + + off: (args...) -> + $el = type = callback = undefined + lastIndex = args.length - 1 + + if args.length is 0 + @events.forEach((event) => + $el = $(event.el) + $el.off(event.type, event.callback) + ) + + if typeof args[lastIndex] is 'function' + callback = args[lastIndex] + lastIndex -= 1 + + if lastIndex == 1 + $el = $(args[0]) + type = args[1] + + if callback + $el.off(type, callback) + else + $el.off(type) remove: (name) -> delete @instances[name] - + removeAll: -> @instances = {} @allOff() |