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-typenone;
    border:1px solid #ccc;
}
 
.auto-complete>div ul li{
    height:30px;
    line-height30px;
    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;
}