Skip to content

Commit 7b1f03f

Browse files
committed
Merge pull request #4311 from jimfb/fix-input-events
Fix event target for input change events. Fixes #4288
2 parents 75c4311 + 4b804e4 commit 7b1f03f

File tree

3 files changed

+46
-10
lines changed

3 files changed

+46
-10
lines changed

src/renderers/dom/client/eventPlugins/BeforeInputEventPlugin.js

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,8 @@ function extractCompositionEvent(
237237
topLevelType,
238238
topLevelTarget,
239239
topLevelTargetID,
240-
nativeEvent
240+
nativeEvent,
241+
nativeEventTarget
241242
) {
242243
var eventType;
243244
var fallbackData;
@@ -271,7 +272,8 @@ function extractCompositionEvent(
271272
var event = SyntheticCompositionEvent.getPooled(
272273
eventType,
273274
topLevelTargetID,
274-
nativeEvent
275+
nativeEvent,
276+
nativeEventTarget
275277
);
276278

277279
if (fallbackData) {
@@ -411,7 +413,8 @@ function extractBeforeInputEvent(
411413
topLevelType,
412414
topLevelTarget,
413415
topLevelTargetID,
414-
nativeEvent
416+
nativeEvent,
417+
nativeEventTarget
415418
) {
416419
var chars;
417420

@@ -430,7 +433,8 @@ function extractBeforeInputEvent(
430433
var event = SyntheticInputEvent.getPooled(
431434
eventTypes.beforeInput,
432435
topLevelTargetID,
433-
nativeEvent
436+
nativeEvent,
437+
nativeEventTarget
434438
);
435439

436440
event.data = chars;
@@ -472,20 +476,23 @@ var BeforeInputEventPlugin = {
472476
topLevelType,
473477
topLevelTarget,
474478
topLevelTargetID,
475-
nativeEvent
479+
nativeEvent,
480+
nativeEventTarget
476481
) {
477482
return [
478483
extractCompositionEvent(
479484
topLevelType,
480485
topLevelTarget,
481486
topLevelTargetID,
482-
nativeEvent
487+
nativeEvent,
488+
nativeEventTarget
483489
),
484490
extractBeforeInputEvent(
485491
topLevelType,
486492
topLevelTarget,
487493
topLevelTargetID,
488-
nativeEvent
494+
nativeEvent,
495+
nativeEventTarget
489496
),
490497
];
491498
},

src/renderers/dom/client/eventPlugins/ChangeEventPlugin.js

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,8 @@ function manualDispatchChangeEvent(nativeEvent) {
7474
var event = SyntheticEvent.getPooled(
7575
eventTypes.change,
7676
activeElementID,
77-
nativeEvent
77+
nativeEvent,
78+
nativeEvent.target
7879
);
7980
EventPropagators.accumulateTwoPhaseDispatches(event);
8081

@@ -330,7 +331,8 @@ var ChangeEventPlugin = {
330331
topLevelType,
331332
topLevelTarget,
332333
topLevelTargetID,
333-
nativeEvent) {
334+
nativeEvent,
335+
nativeEventTarget) {
334336

335337
var getTargetIDFunc, handleEventFunc;
336338
if (shouldUseChangeEvent(topLevelTarget)) {
@@ -360,7 +362,8 @@ var ChangeEventPlugin = {
360362
var event = SyntheticEvent.getPooled(
361363
eventTypes.change,
362364
targetID,
363-
nativeEvent
365+
nativeEvent,
366+
nativeEventTarget
364367
);
365368
event.type = 'change';
366369
EventPropagators.accumulateTwoPhaseDispatches(event);

src/renderers/dom/client/wrappers/__tests__/ReactDOMInput-test.js

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,14 @@ var emptyFunction = require('emptyFunction');
1616
var mocks = require('mocks');
1717

1818
describe('ReactDOMInput', function() {
19+
var EventConstants;
1920
var React;
2021
var ReactLink;
2122
var ReactTestUtils;
2223

2324
beforeEach(function() {
2425
require('mock-modules').dumpCache();
26+
EventConstants = require('EventConstants');
2527
React = require('React');
2628
ReactLink = require('ReactLink');
2729
ReactTestUtils = require('ReactTestUtils');
@@ -134,6 +136,30 @@ describe('ReactDOMInput', function() {
134136
expect(node.value).toBe('0');
135137
});
136138

139+
it('should have the correct target value', function() {
140+
var handled = false;
141+
var handler = function(event) {
142+
expect(event.target.nodeName).toBe('INPUT');
143+
handled = true;
144+
};
145+
var stub = <input type="text" value={0} onChange={handler} />;
146+
var container = document.createElement('div');
147+
var node = React.render(stub, container);
148+
149+
node.value = 'giraffe';
150+
151+
var fakeNativeEvent = new function() {};
152+
fakeNativeEvent.target = node;
153+
fakeNativeEvent.path = [node, container];
154+
ReactTestUtils.simulateNativeEventOnNode(
155+
EventConstants.topLevelTypes.topInput,
156+
node,
157+
fakeNativeEvent
158+
);
159+
160+
expect(handled).toBe(true);
161+
});
162+
137163
it('should not set a value for submit buttons unnecessarily', function() {
138164
var stub = <input type="submit" />;
139165
stub = ReactTestUtils.renderIntoDocument(stub);

0 commit comments

Comments
 (0)