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 ;
}