From b7765d9416cc4865fc7abc0e582306adb337c5d8 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Tue, 23 Sep 2014 19:15:18 -0600 Subject: [PATCH] Process commands invoked with jQuery trigger in CommandRegistry MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Especially in specs, trigger has been used to invoke events. jQuery does not invoke native listeners in this situation, so we use ::on to listen for them instead. If we didn’t handle the event with a native capture handler, we’ll still support invoking via trigger. --- src/command-registry.coffee | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/src/command-registry.coffee b/src/command-registry.coffee index 800b48077..abeaa155e 100644 --- a/src/command-registry.coffee +++ b/src/command-registry.coffee @@ -53,8 +53,8 @@ class CommandRegistry @rootNode = newRootNode for commandName of @listenersByCommandName - oldRootNode?.removeEventListener(commandName, @handleCommandEvent, true) - newRootNode?.addEventListener(commandName, @handleCommandEvent, true) + @removeCommandListener(oldRootNode, commandName) + @addCommandListener(newRootNode, commandName) # Public: Add one or more command listeners associated with a selector. # @@ -90,7 +90,7 @@ class CommandRegistry return disposable unless @listenersByCommandName[commandName]? - @rootNode?.addEventListener(commandName, @handleCommandEvent, true) + @addCommandListener(@rootNode, commandName) @listenersByCommandName[commandName] = [] listener = new CommandListener(selector, callback) @@ -101,7 +101,7 @@ class CommandRegistry listenersForCommand.splice(listenersForCommand.indexOf(listener), 1) if listenersForCommand.length is 0 delete @listenersByCommandName[commandName] - @rootNode.removeEventListener(commandName, @handleCommandEvent, true) + @removeCommandListener(@rootNode, commandName) # Public: Find all registered commands matching a query. # @@ -161,6 +161,8 @@ class CommandRegistry @setRootNode(rootNode) # restore listeners for commands in snapshot handleCommandEvent: (originalEvent) => + originalEvent.__handledByCommandRegistry = true + propagationStopped = false immediatePropagationStopped = false matched = false @@ -201,6 +203,17 @@ class CommandRegistry matched + handleJQueryCommandEvent: (event) => + @handleCommandEvent(event) unless event.originalEvent?.__handledByCommandRegistry + + addCommandListener: (node, commandName, listener) -> + node?.addEventListener(commandName, @handleCommandEvent, true) + $(node).on commandName, @handleJQueryCommandEvent + + removeCommandListener: (node, commandName) -> + node?.removeEventListener(commandName, @handleCommandEvent, true) + $(node).off commandName, @handleJQueryCommandEvent + class CommandListener enabled: true