From 09c8ec51bf28aab80b5b0dc23973fe32472f14d1 Mon Sep 17 00:00:00 2001 From: Ben Alpert Date: Tue, 31 Dec 2013 17:42:40 -0700 Subject: [PATCH] Check for selection on keyup instead of deferring This is essentially what we do for the change event in IE8 and IE9 already. --- src/eventPlugins/SelectEventPlugin.js | 42 ++++----------------------- 1 file changed, 6 insertions(+), 36 deletions(-) diff --git a/src/eventPlugins/SelectEventPlugin.js b/src/eventPlugins/SelectEventPlugin.js index 3b19274f84..ce62a8153a 100644 --- a/src/eventPlugins/SelectEventPlugin.js +++ b/src/eventPlugins/SelectEventPlugin.js @@ -19,9 +19,7 @@ "use strict"; var EventConstants = require('EventConstants'); -var EventPluginHub = require('EventPluginHub'); var EventPropagators = require('EventPropagators'); -var ExecutionEnvironment = require('ExecutionEnvironment'); var ReactInputSelection = require('ReactInputSelection'); var SyntheticEvent = require('SyntheticEvent'); @@ -49,15 +47,8 @@ var eventTypes = { } }; -var useSelectionChange = false; - -if (ExecutionEnvironment.canUseDOM) { - useSelectionChange = 'onselectionchange' in document; -} - var activeElement = null; var activeElementID = null; -var activeNativeEvent = null; var lastSelection = null; var mouseDown = false; @@ -129,24 +120,6 @@ function constructSelectEvent(nativeEvent) { } } -/** - * Handle deferred event. And manually dispatch synthetic events. - */ -function dispatchDeferredSelectEvent() { - if (!activeNativeEvent) { - return; - } - - var syntheticEvent = constructSelectEvent(activeNativeEvent); - activeNativeEvent = null; - - // Enqueue and process the abstract event manually. - if (syntheticEvent) { - EventPluginHub.enqueueEvents(syntheticEvent); - EventPluginHub.processEventQueue(); - } -} - /** * This plugin creates an `onSelect` event that normalizes select events * across form elements. @@ -207,17 +180,14 @@ var SelectEventPlugin = { // Chrome and IE fire non-standard event when selection is changed (and // sometimes when it hasn't). - case topLevelTypes.topSelectionChange: - return constructSelectEvent(nativeEvent); - // Firefox doesn't support selectionchange, so check selection status - // after each key entry. + // after each key entry. The selection changes after keydown and before + // keyup, but we check on keydown as well in the case of holding down a + // key, when multiple keydown events are fired but only one keyup is. + case topLevelTypes.topSelectionChange: case topLevelTypes.topKeyDown: - if (!useSelectionChange) { - activeNativeEvent = nativeEvent; - setTimeout(dispatchDeferredSelectEvent, 0); - } - break; + case topLevelTypes.topKeyUp: + return constructSelectEvent(nativeEvent); } } };