Skip to content

Commit 3f59d81

Browse files
author
zhangking
committedJun 23, 2015
commit
1 parent 74e62a4 commit 3f59d81

File tree

310 files changed

+127552
-0
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

310 files changed

+127552
-0
lines changed
 

‎README.md

+52
Original file line numberDiff line numberDiff line change
@@ -1 +1,53 @@
11
# react_util
2+
3+
some util function for react
4+
5+
## Installation
6+
7+
npm install react_util
8+
9+
10+
## dom
11+
12+
getWindow
13+
14+
getDocument
15+
16+
getComputedStyles
17+
18+
getOffset
19+
20+
getPosition
21+
22+
getOffsetParent
23+
24+
contains
25+
26+
## event
27+
28+
add
29+
30+
remove
31+
32+
addEnd
33+
34+
removeEnd
35+
36+
preventDefault
37+
38+
stopPropagation
39+
40+
## chileren
41+
42+
map
43+
44+
forEach
45+
46+
count
47+
48+
toArray
49+
50+
51+
## License
52+
53+
MIT

‎index.js

+240
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,240 @@
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

Comments
 (0)
Please sign in to comment.