1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 | 'use strict';
|
10 |
|
11 | var EventPropagators = require('./EventPropagators');
|
12 | var ReactDOMComponentTree = require('./ReactDOMComponentTree');
|
13 | var SyntheticMouseEvent = require('./SyntheticMouseEvent');
|
14 |
|
15 | var eventTypes = {
|
16 | mouseEnter: {
|
17 | registrationName: 'onMouseEnter',
|
18 | dependencies: ['topMouseOut', 'topMouseOver']
|
19 | },
|
20 | mouseLeave: {
|
21 | registrationName: 'onMouseLeave',
|
22 | dependencies: ['topMouseOut', 'topMouseOver']
|
23 | }
|
24 | };
|
25 |
|
26 | var EnterLeaveEventPlugin = {
|
27 | eventTypes: eventTypes,
|
28 |
|
29 | |
30 |
|
31 |
|
32 |
|
33 |
|
34 |
|
35 |
|
36 | extractEvents: function (topLevelType, targetInst, nativeEvent, nativeEventTarget) {
|
37 | if (topLevelType === 'topMouseOver' && (nativeEvent.relatedTarget || nativeEvent.fromElement)) {
|
38 | return null;
|
39 | }
|
40 | if (topLevelType !== 'topMouseOut' && topLevelType !== 'topMouseOver') {
|
41 |
|
42 | return null;
|
43 | }
|
44 |
|
45 | var win;
|
46 | if (nativeEventTarget.window === nativeEventTarget) {
|
47 |
|
48 | win = nativeEventTarget;
|
49 | } else {
|
50 |
|
51 | var doc = nativeEventTarget.ownerDocument;
|
52 | if (doc) {
|
53 | win = doc.defaultView || doc.parentWindow;
|
54 | } else {
|
55 | win = window;
|
56 | }
|
57 | }
|
58 |
|
59 | var from;
|
60 | var to;
|
61 | if (topLevelType === 'topMouseOut') {
|
62 | from = targetInst;
|
63 | var related = nativeEvent.relatedTarget || nativeEvent.toElement;
|
64 | to = related ? ReactDOMComponentTree.getClosestInstanceFromNode(related) : null;
|
65 | } else {
|
66 |
|
67 | from = null;
|
68 | to = targetInst;
|
69 | }
|
70 |
|
71 | if (from === to) {
|
72 |
|
73 | return null;
|
74 | }
|
75 |
|
76 | var fromNode = from == null ? win : ReactDOMComponentTree.getNodeFromInstance(from);
|
77 | var toNode = to == null ? win : ReactDOMComponentTree.getNodeFromInstance(to);
|
78 |
|
79 | var leave = SyntheticMouseEvent.getPooled(eventTypes.mouseLeave, from, nativeEvent, nativeEventTarget);
|
80 | leave.type = 'mouseleave';
|
81 | leave.target = fromNode;
|
82 | leave.relatedTarget = toNode;
|
83 |
|
84 | var enter = SyntheticMouseEvent.getPooled(eventTypes.mouseEnter, to, nativeEvent, nativeEventTarget);
|
85 | enter.type = 'mouseenter';
|
86 | enter.target = toNode;
|
87 | enter.relatedTarget = fromNode;
|
88 |
|
89 | EventPropagators.accumulateEnterLeaveDispatches(leave, enter, from, to);
|
90 |
|
91 | return [leave, enter];
|
92 | }
|
93 | };
|
94 |
|
95 | module.exports = EnterLeaveEventPlugin; |
\ | No newline at end of file |