1
+ var React = require ( 'react' ) ;
2
+ // dom
3
+ // event
4
+ // children
5
+
6
+
7
+ var dom = {
8
+ getWindow :function ( componentOrElement ) {
9
+ var elem = React . findDOMNode ( componentOrElement ) ;
10
+
11
+ return ( elem != null && elem == elem . window ) ?
12
+ elem :
13
+ elem . nodeType === 9 ?
14
+ elem . defaultView || elem . parentWindow :
15
+ false ;
16
+ } ,
17
+ getDocument :function ( componentOrElement ) {
18
+ var elem = React . findDOMNode ( componentOrElement ) ;
19
+ return ( elem && elem . ownerDocument ) || document ;
20
+ } ,
21
+ getComputedStyles :function ( elem ) {
22
+ return this . getDocument ( elem ) . defaultView . getComputedStyle ( elem , null ) ;
23
+ } ,
24
+ getOffset :function ( DOMNode ) {
25
+ var docElem = this . getDocument ( DOMNode ) . documentElement ;
26
+ var box = { top : 0 , left : 0 } ;
27
+
28
+ if ( typeof DOMNode . getBoundingClientRect !== 'undefined' ) {
29
+ box = DOMNode . getBoundingClientRect ( ) ;
30
+ }
31
+
32
+ return {
33
+ top : box . top + ( window . pageYOffset || docElem . scrollTop ) - ( docElem . clientTop || 0 ) ,
34
+ left : box . left + ( window . pageXOffset || docElem . scrollLeft ) - ( docElem . clientLeft || 0 )
35
+ } ;
36
+ } ,
37
+ getPosition :function ( elem , offsetParent ) {
38
+ var offset ,
39
+ parentOffset = { top : 0 , left : 0 } ;
40
+
41
+ if ( this . getComputedStyles ( elem ) . position === 'fixed' ) {
42
+ offset = elem . getBoundingClientRect ( ) ;
43
+ } else {
44
+ if ( ! offsetParent ) {
45
+ offsetParent = this . getOffsetParent ( elem ) ;
46
+ }
47
+
48
+ offset = this . getOffset ( elem ) ;
49
+ if ( offsetParent . nodeName !== 'HTML' ) {
50
+ parentOffset = this . getOffset ( offsetParent ) ;
51
+ }
52
+
53
+ parentOffset . top += parseInt ( this . getComputedStyles ( offsetParent ) . borderTopWidth , 10 ) ;
54
+ parentOffset . left += parseInt ( this . getComputedStyles ( offsetParent ) . borderLeftWidth , 10 ) ;
55
+ }
56
+
57
+ // Subtract parent offsets and element margins
58
+ return {
59
+ top : offset . top - parentOffset . top - parseInt ( this . getComputedStyles ( elem ) . marginTop , 10 ) ,
60
+ left : offset . left - parentOffset . left - parseInt ( this . getComputedStyles ( elem ) . marginLeft , 10 )
61
+ } ;
62
+ } ,
63
+ getOffsetParent :function ( elem ) {
64
+ var docElem = this . getDocument ( elem ) . documentElement ;
65
+ var offsetParent = elem . offsetParent || docElem ;
66
+
67
+ while ( offsetParent && ( offsetParent . nodeName !== 'HTML' &&
68
+ this . getComputedStyles ( offsetParent ) . position === 'static' ) ) {
69
+ offsetParent = offsetParent . offsetParent ;
70
+ }
71
+
72
+ return offsetParent || docElem ;
73
+ } ,
74
+ contains :function ( elem , inner ) {
75
+ function ie8Contains ( root , node ) {
76
+ while ( node ) {
77
+ if ( node === root ) {
78
+ return true ;
79
+ }
80
+ node = node . parentNode ;
81
+ }
82
+ return false ;
83
+ }
84
+
85
+ return ( elem && elem . contains )
86
+ ? elem . contains ( inner )
87
+ : ( elem && elem . compareDocumentPosition )
88
+ ? elem === inner || ! ! ( elem . compareDocumentPosition ( inner ) & 16 )
89
+ : ie8Contains ( elem , inner ) ;
90
+ }
91
+ }
92
+
93
+
94
+
95
+ var EVENT_NAME_MAP = {
96
+ transitionend : {
97
+ 'transition' : 'transitionend' ,
98
+ 'WebkitTransition' : 'webkitTransitionEnd' ,
99
+ 'MozTransition' : 'mozTransitionEnd' ,
100
+ 'OTransition' : 'oTransitionEnd' ,
101
+ 'msTransition' : 'MSTransitionEnd'
102
+ } ,
103
+
104
+ animationend : {
105
+ 'animation' : 'animationend' ,
106
+ 'WebkitAnimation' : 'webkitAnimationEnd' ,
107
+ 'MozAnimation' : 'mozAnimationEnd' ,
108
+ 'OAnimation' : 'oAnimationEnd' ,
109
+ 'msAnimation' : 'MSAnimationEnd'
110
+ }
111
+ } ;
112
+
113
+ function detectEvents ( ) {
114
+ var testEl = document . createElement ( 'div' ) ;
115
+ var style = testEl . style ;
116
+
117
+ if ( ! ( 'AnimationEvent' in window ) ) {
118
+ delete EVENT_NAME_MAP . animationend . animation ;
119
+ }
120
+
121
+ if ( ! ( 'TransitionEvent' in window ) ) {
122
+ delete EVENT_NAME_MAP . transitionend . transition ;
123
+ }
124
+
125
+ for ( let baseEventName in EVENT_NAME_MAP ) {
126
+ let baseEvents = EVENT_NAME_MAP [ baseEventName ] ;
127
+ for ( let styleName in baseEvents ) {
128
+ if ( styleName in style ) {
129
+ endEvents . push ( baseEvents [ styleName ] ) ;
130
+ break ;
131
+ }
132
+ }
133
+ }
134
+ }
135
+ detectEvents ( ) ;
136
+
137
+
138
+ var event = {
139
+ add :function ( componentOrElement , type , handler ) {
140
+ var elem = React . findDOMNode ( componentOrElement ) ;
141
+ if ( elem . addEventListener ) {
142
+ elem . addEventListener ( type , handler , false ) ;
143
+ } else if ( elem . attachEvent ) {
144
+ elem . attachEvent ( 'on' + type , function ( ) {
145
+ handler . call ( elem ) ;
146
+ } ) ;
147
+ } else {
148
+ elem [ 'on' + type ] = handler ;
149
+ }
150
+ } ,
151
+ remove :function ( componentOrElement , type , handler ) {
152
+ var elem = React . findDOMNode ( componentOrElement ) ;
153
+ if ( elem . removeEnentListener ) {
154
+ elem . removeEnentListener ( type , handler , false ) ;
155
+ } else if ( elem . datachEvent ) {
156
+ elem . detachEvent ( 'on' + type , handler ) ;
157
+ } else {
158
+ elem [ 'on' + type ] = null ;
159
+ }
160
+ } ,
161
+ addEnd :function ( elem , handler ) {
162
+ if ( endEvents . length === 0 ) {
163
+ window . setTimeout ( handler , 0 ) ;
164
+ return ;
165
+ }
166
+ endEvents . forEach ( function ( endEvent ) {
167
+ this . add ( elem , endEvent , handler ) ;
168
+ } ) ;
169
+ } ,
170
+ removeEnd :function ( elem , handler ) {
171
+ if ( endEvents . length === 0 ) {
172
+ return ;
173
+ }
174
+ endEvents . forEach ( function ( endEvent ) {
175
+ removeEventListener ( elem , endEvent , handler ) ;
176
+ } ) ;
177
+ } ,
178
+ preventDefault :function ( e ) {
179
+ if ( e . preventDefault ) {
180
+ e . preventDefault ( ) ;
181
+ } else {
182
+ e . returnValue = false ;
183
+ }
184
+ } ,
185
+ stopPropagation :function ( e ) {
186
+ if ( e . stopPropagation ) {
187
+ e . stopPropagation ( ) ;
188
+ } else {
189
+ e . cancelBubble = true ;
190
+ }
191
+ }
192
+ }
193
+
194
+ var chileren = {
195
+ map :function ( children , func , context ) {
196
+ var index = 0 ;
197
+
198
+ return React . Children . map ( children , function ( child ) {
199
+ if ( React . isValidElement ( child ) ) {
200
+ var lastIndex = index ;
201
+ index ++ ;
202
+ return func . call ( context , child , lastIndex ) ;
203
+ }
204
+
205
+ return child ;
206
+ } ) ;
207
+ } ,
208
+ forEach :function ( children , func , context ) {
209
+ var index = 0 ;
210
+
211
+ return React . Children . forEach ( children , function ( child ) {
212
+ if ( React . isValidElement ( child ) ) {
213
+ func . call ( context , child , index ) ;
214
+ index ++ ;
215
+ }
216
+ } ) ;
217
+ } ,
218
+ count :function ( children ) {
219
+ var count = 0 ;
220
+
221
+ React . Children . forEach ( children , function ( child ) {
222
+ if ( React . isValidElement ( child ) ) { count ++ ; }
223
+ } ) ;
224
+
225
+ return count ;
226
+ } ,
227
+ toArray :function ( children ) {
228
+ var ret = [ ] ;
229
+ React . Children . forEach ( children , function ( child ) {
230
+ ret . push ( child ) ;
231
+ } ) ;
232
+ return ret ;
233
+ }
234
+ }
235
+
236
+ module . exports = {
237
+ dom : dom ,
238
+ event :event ,
239
+ children :chileren
240
+ }
0 commit comments