auto_complete.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
<!DOCTYPE html>
<
html
>
<
head
>
<
meta
charset
=
"UTF-8"
/>
<
title
>Hello React!</
title
>
<
link
href
=
"css/auto_complete.css"
rel
=
"stylesheet"
/>
<
script
src
=
"jslib/jquery-1.11.3.min.js"
></
script
>
<
script
src
=
"jslib/react.min.js"
></
script
>
<
script
src
=
"jslib/react-dom.min.js"
></
script
>
</
head
>
<
body
>
<
div
id
=
"autocomplete"
></
div
>
<
script
src
=
"js/auto_complete.js"
></
script
>
</
body
>
</
html
>
|
js/auto_complete.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
|
var
AutoComplete = React.createClass({
list:[
"apple"
,
"banana"
,
"grape"
,
"org"
,
"orange"
],
timeout:
null
,
getInitialState:
function
(){
return
{
open:
null
,
matchedItems:
this
.generateLiHtml(
this
.list)
}
},
generateLiHtml:
function
(list){
var
matchedItems = [];
for
(
var
i=0;i<list.length;i++){
var
item = React.DOM.li({key:i,onClick:
this
.clickHandler},list[i]);
matchedItems.push(item);
}
return
matchedItems;
},
clickHandler:
function
(e){
e.stopPropagation();
e.preventDefault();
var
liItem = $(e.target);
var
content = $(liItem).html();
$(ReactDOM.findDOMNode(
this
)).find(
"input"
).val(content);
this
.setState({open:
""
});
},
keyUpHandler:
function
(e){
e.stopPropagation();
clearTimeout(
this
.timeout);
var
val = e.target.value;
var
that =
this
;
this
.timeout = setTimeout(
function
(){
var
result = [];
for
(
var
i=0;i<that.list.length;i++){
var
item = that.list[i];
if
(item.startsWith(val)){
result.push(item);
}
}
var
open =
null
;
if
(result.length>0){
open =
"open"
;
}
var
matchedItems = that.generateLiHtml(result);
that.setState({matchedItems:matchedItems,open:open});
},300);
},
render:
function
() {
return
React.DOM.div(
{className:
"auto-complete"
},
React.DOM.input({type:
"text"
,onKeyUp:
this
.keyUpHandler}),
React.DOM.div(
{className:
this
.state.open},
React.DOM.ul(
null
,
this
.state.matchedItems
)
)
);
}
});
ReactDOM.render(
React.createElement(AutoComplete),
$(
"#autocomplete"
)[0]
);
|
css/auto_complete.css
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
.auto-complete{
width
:
200px
;
}
.auto-complete input{
width
:
100%
;
box-sizing:border-box;
}
.auto-complete>div{
display
:
none
;
padding-top
:
10px
;
}
.auto-complete>div.open{
display
:
block
;}
.auto-complete>div ul{
padding
:
0
;
margin
:
0
;
list-style-type
:
none
;
border
:
1px
solid
#ccc
;
}
.auto-complete>div ul li{
height
:
30px
;
line-height
:
30px
;
border-bottom
:
1px
solid
#ccc
;
padding-left
:
10px
;
}
.auto-complete>div ul li:hover{
background-color
:
#eaeaea
;
cursor
:
pointer
;
}
.auto-complete>div ul li:last-child{
border-bottom
:
none
;
}
|
本文转自 antlove 51CTO博客,原文链接:http://blog.51cto.com/antlove/1748332