diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/dom_utils.coffee | 4 | ||||
| -rw-r--r-- | lib/handler_stack.coffee | 37 |
2 files changed, 41 insertions, 0 deletions
diff --git a/lib/dom_utils.coffee b/lib/dom_utils.coffee index 30530e0d..501e43a5 100644 --- a/lib/dom_utils.coffee +++ b/lib/dom_utils.coffee @@ -131,5 +131,9 @@ DomUtils = document.documentElement.appendChild(flashEl) setTimeout((-> DomUtils.removeElement flashEl), 400) + suppressEvent: (event) -> + event.preventDefault() + event.stopPropagation() + root = exports ? window root.DomUtils = DomUtils diff --git a/lib/handler_stack.coffee b/lib/handler_stack.coffee new file mode 100644 index 00000000..858f2ec9 --- /dev/null +++ b/lib/handler_stack.coffee @@ -0,0 +1,37 @@ +root = exports ? window + +class root.HandlerStack + + constructor: -> + @stack = [] + @counter = 0 + + genId: -> @counter = ++@counter & 0xffff + + # Adds a handler to the stack. Returns a unique ID for that handler that can be used to remove it later. + push: (handler) -> + handler.id = @genId() + @stack.push handler + handler.id + + # Called whenever we receive a key event. Each individual handler has the option to stop the event's + # propagation by returning a falsy value. + bubbleEvent: (type, event) -> + for i in [(@stack.length - 1)..0] by -1 + handler = @stack[i] + # We need to check for existence of handler because the last function call may have caused the release + # of more than one handler. + if handler && handler[type] + @currentId = handler.id + passThrough = handler[type].call(@, event) + if not passThrough + DomUtils.suppressEvent(event) + return false + true + + remove: (id = @currentId) -> + for i in [(@stack.length - 1)..0] by -1 + handler = @stack[i] + if handler.id == id + @stack.splice(i, 1) + break |
