1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 | 'use strict';
|
11 |
|
12 | var _prodInvariant = require('./reactProdInvariant');
|
13 |
|
14 | var EventListener = require('fbjs/lib/EventListener');
|
15 | var EventPropagators = require('./EventPropagators');
|
16 | var ReactDOMComponentTree = require('./ReactDOMComponentTree');
|
17 | var SyntheticAnimationEvent = require('./SyntheticAnimationEvent');
|
18 | var SyntheticClipboardEvent = require('./SyntheticClipboardEvent');
|
19 | var SyntheticEvent = require('./SyntheticEvent');
|
20 | var SyntheticFocusEvent = require('./SyntheticFocusEvent');
|
21 | var SyntheticKeyboardEvent = require('./SyntheticKeyboardEvent');
|
22 | var SyntheticMouseEvent = require('./SyntheticMouseEvent');
|
23 | var SyntheticDragEvent = require('./SyntheticDragEvent');
|
24 | var SyntheticTouchEvent = require('./SyntheticTouchEvent');
|
25 | var SyntheticTransitionEvent = require('./SyntheticTransitionEvent');
|
26 | var SyntheticUIEvent = require('./SyntheticUIEvent');
|
27 | var SyntheticWheelEvent = require('./SyntheticWheelEvent');
|
28 |
|
29 | var emptyFunction = require('fbjs/lib/emptyFunction');
|
30 | var getEventCharCode = require('./getEventCharCode');
|
31 | var invariant = require('fbjs/lib/invariant');
|
32 |
|
33 |
|
34 |
|
35 |
|
36 |
|
37 |
|
38 |
|
39 |
|
40 |
|
41 |
|
42 |
|
43 |
|
44 |
|
45 |
|
46 |
|
47 |
|
48 |
|
49 |
|
50 |
|
51 | var eventTypes = {};
|
52 | var topLevelEventsToDispatchConfig = {};
|
53 | ['abort', 'animationEnd', 'animationIteration', 'animationStart', 'blur', 'canPlay', 'canPlayThrough', 'click', 'contextMenu', 'copy', 'cut', 'doubleClick', 'drag', 'dragEnd', 'dragEnter', 'dragExit', 'dragLeave', 'dragOver', 'dragStart', 'drop', 'durationChange', 'emptied', 'encrypted', 'ended', 'error', 'focus', 'input', 'invalid', 'keyDown', 'keyPress', 'keyUp', 'load', 'loadedData', 'loadedMetadata', 'loadStart', 'mouseDown', 'mouseMove', 'mouseOut', 'mouseOver', 'mouseUp', 'paste', 'pause', 'play', 'playing', 'progress', 'rateChange', 'reset', 'scroll', 'seeked', 'seeking', 'stalled', 'submit', 'suspend', 'timeUpdate', 'touchCancel', 'touchEnd', 'touchMove', 'touchStart', 'transitionEnd', 'volumeChange', 'waiting', 'wheel'].forEach(function (event) {
|
54 | var capitalizedEvent = event[0].toUpperCase() + event.slice(1);
|
55 | var onEvent = 'on' + capitalizedEvent;
|
56 | var topEvent = 'top' + capitalizedEvent;
|
57 |
|
58 | var type = {
|
59 | phasedRegistrationNames: {
|
60 | bubbled: onEvent,
|
61 | captured: onEvent + 'Capture'
|
62 | },
|
63 | dependencies: [topEvent]
|
64 | };
|
65 | eventTypes[event] = type;
|
66 | topLevelEventsToDispatchConfig[topEvent] = type;
|
67 | });
|
68 |
|
69 | var onClickListeners = {};
|
70 |
|
71 | function getDictionaryKey(inst) {
|
72 |
|
73 |
|
74 | return '.' + inst._rootNodeID;
|
75 | }
|
76 |
|
77 | function isInteractive(tag) {
|
78 | return tag === 'button' || tag === 'input' || tag === 'select' || tag === 'textarea';
|
79 | }
|
80 |
|
81 | var SimpleEventPlugin = {
|
82 | eventTypes: eventTypes,
|
83 |
|
84 | extractEvents: function (topLevelType, targetInst, nativeEvent, nativeEventTarget) {
|
85 | var dispatchConfig = topLevelEventsToDispatchConfig[topLevelType];
|
86 | if (!dispatchConfig) {
|
87 | return null;
|
88 | }
|
89 | var EventConstructor;
|
90 | switch (topLevelType) {
|
91 | case 'topAbort':
|
92 | case 'topCanPlay':
|
93 | case 'topCanPlayThrough':
|
94 | case 'topDurationChange':
|
95 | case 'topEmptied':
|
96 | case 'topEncrypted':
|
97 | case 'topEnded':
|
98 | case 'topError':
|
99 | case 'topInput':
|
100 | case 'topInvalid':
|
101 | case 'topLoad':
|
102 | case 'topLoadedData':
|
103 | case 'topLoadedMetadata':
|
104 | case 'topLoadStart':
|
105 | case 'topPause':
|
106 | case 'topPlay':
|
107 | case 'topPlaying':
|
108 | case 'topProgress':
|
109 | case 'topRateChange':
|
110 | case 'topReset':
|
111 | case 'topSeeked':
|
112 | case 'topSeeking':
|
113 | case 'topStalled':
|
114 | case 'topSubmit':
|
115 | case 'topSuspend':
|
116 | case 'topTimeUpdate':
|
117 | case 'topVolumeChange':
|
118 | case 'topWaiting':
|
119 |
|
120 |
|
121 | EventConstructor = SyntheticEvent;
|
122 | break;
|
123 | case 'topKeyPress':
|
124 |
|
125 |
|
126 |
|
127 | if (getEventCharCode(nativeEvent) === 0) {
|
128 | return null;
|
129 | }
|
130 |
|
131 | case 'topKeyDown':
|
132 | case 'topKeyUp':
|
133 | EventConstructor = SyntheticKeyboardEvent;
|
134 | break;
|
135 | case 'topBlur':
|
136 | case 'topFocus':
|
137 | EventConstructor = SyntheticFocusEvent;
|
138 | break;
|
139 | case 'topClick':
|
140 |
|
141 |
|
142 | if (nativeEvent.button === 2) {
|
143 | return null;
|
144 | }
|
145 |
|
146 | case 'topDoubleClick':
|
147 | case 'topMouseDown':
|
148 | case 'topMouseMove':
|
149 | case 'topMouseUp':
|
150 |
|
151 |
|
152 | case 'topMouseOut':
|
153 | case 'topMouseOver':
|
154 | case 'topContextMenu':
|
155 | EventConstructor = SyntheticMouseEvent;
|
156 | break;
|
157 | case 'topDrag':
|
158 | case 'topDragEnd':
|
159 | case 'topDragEnter':
|
160 | case 'topDragExit':
|
161 | case 'topDragLeave':
|
162 | case 'topDragOver':
|
163 | case 'topDragStart':
|
164 | case 'topDrop':
|
165 | EventConstructor = SyntheticDragEvent;
|
166 | break;
|
167 | case 'topTouchCancel':
|
168 | case 'topTouchEnd':
|
169 | case 'topTouchMove':
|
170 | case 'topTouchStart':
|
171 | EventConstructor = SyntheticTouchEvent;
|
172 | break;
|
173 | case 'topAnimationEnd':
|
174 | case 'topAnimationIteration':
|
175 | case 'topAnimationStart':
|
176 | EventConstructor = SyntheticAnimationEvent;
|
177 | break;
|
178 | case 'topTransitionEnd':
|
179 | EventConstructor = SyntheticTransitionEvent;
|
180 | break;
|
181 | case 'topScroll':
|
182 | EventConstructor = SyntheticUIEvent;
|
183 | break;
|
184 | case 'topWheel':
|
185 | EventConstructor = SyntheticWheelEvent;
|
186 | break;
|
187 | case 'topCopy':
|
188 | case 'topCut':
|
189 | case 'topPaste':
|
190 | EventConstructor = SyntheticClipboardEvent;
|
191 | break;
|
192 | }
|
193 | !EventConstructor ? process.env.NODE_ENV !== 'production' ? invariant(false, 'SimpleEventPlugin: Unhandled event type, `%s`.', topLevelType) : _prodInvariant('86', topLevelType) : void 0;
|
194 | var event = EventConstructor.getPooled(dispatchConfig, targetInst, nativeEvent, nativeEventTarget);
|
195 | EventPropagators.accumulateTwoPhaseDispatches(event);
|
196 | return event;
|
197 | },
|
198 |
|
199 | didPutListener: function (inst, registrationName, listener) {
|
200 |
|
201 |
|
202 |
|
203 |
|
204 |
|
205 | if (registrationName === 'onClick' && !isInteractive(inst._tag)) {
|
206 | var key = getDictionaryKey(inst);
|
207 | var node = ReactDOMComponentTree.getNodeFromInstance(inst);
|
208 | if (!onClickListeners[key]) {
|
209 | onClickListeners[key] = EventListener.listen(node, 'click', emptyFunction);
|
210 | }
|
211 | }
|
212 | },
|
213 |
|
214 | willDeleteListener: function (inst, registrationName) {
|
215 | if (registrationName === 'onClick' && !isInteractive(inst._tag)) {
|
216 | var key = getDictionaryKey(inst);
|
217 | onClickListeners[key].remove();
|
218 | delete onClickListeners[key];
|
219 | }
|
220 | }
|
221 | };
|
222 |
|
223 | module.exports = SimpleEventPlugin; |
\ | No newline at end of file |