From 510146eb6dff1dd0f7babfa9df47a9c7e465648e Mon Sep 17 00:00:00 2001 From: Tim Yung Date: Wed, 3 Jul 2013 11:33:14 -0700 Subject: [PATCH] Faster Listener Deletion Whenever a component is unmounted, we delete all listeners that might have been attached. This sucks because most applications, Facebook included, do not use every listener. There's a lot of wasted computation, especially if many components are mounted and unmounted. This changes `deleteAllListeners` to more delete listeners more efficiently. --- src/event/CallbackRegistry.js | 17 ++++++++++++++--- src/event/EventPluginHub.js | 12 +----------- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/src/event/CallbackRegistry.js b/src/event/CallbackRegistry.js index e0cf9a5c82..04e83ec1f3 100644 --- a/src/event/CallbackRegistry.js +++ b/src/event/CallbackRegistry.js @@ -35,7 +35,7 @@ var CallbackRegistry = { /** * Stores `listener` at `listenerBank[registrationName][id]`. Is idempotent. * - * @param {string} id ID of the DOM node. + * @param {string} id ID of the DOM element. * @param {string} registrationName Name of listener (e.g. `onClick`). * @param {?function} listener The callback to store. */ @@ -46,7 +46,7 @@ var CallbackRegistry = { }, /** - * @param {string} id ID of the DOM node. + * @param {string} id ID of the DOM element. * @param {string} registrationName Name of listener (e.g. `onClick`). * @return {?function} The stored callback. */ @@ -58,7 +58,7 @@ var CallbackRegistry = { /** * Deletes a listener from the registration bank. * - * @param {string} id ID of the DOM node. + * @param {string} id ID of the DOM element. * @param {string} registrationName Name of listener (e.g. `onClick`). */ deleteListener: function(id, registrationName) { @@ -68,6 +68,17 @@ var CallbackRegistry = { } }, + /** + * Deletes all listeners for the DOM element with the supplied ID. + * + * @param {string} id ID of the DOM element. + */ + deleteAllListeners: function(id) { + for (var registrationName in listenerBank) { + delete listenerBank[registrationName][id]; + } + }, + /** * This is needed for tests only. Do not use! */ diff --git a/src/event/EventPluginHub.js b/src/event/EventPluginHub.js index ff0be9d8a1..ef75bb7704 100644 --- a/src/event/EventPluginHub.js +++ b/src/event/EventPluginHub.js @@ -112,17 +112,7 @@ var EventPluginHub = { deleteListener: CallbackRegistry.deleteListener, - /** - * Deletes all listeners for the DOM element with the supplied ID. - * - * @param {string} domID ID of a DOM element. - */ - deleteAllListeners: function(domID) { - var registrationNamesKeys = EventPluginRegistry.registrationNamesKeys; - for (var ii = 0; ii < registrationNamesKeys.length; ii++) { - CallbackRegistry.deleteListener(domID, registrationNamesKeys[ii]); - } - }, + deleteAllListeners: CallbackRegistry.deleteAllListeners, /** * Allows registered plugins an opportunity to extract events from top-level