javascript 自定义auto_complete

ys_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
.ys-auto-complete{
     position : absolute ;
     display : none ;
     list-style-type none ;
     padding : 0 ;
 
     border : 1px  solid  #ccc ;
     margin : 0 ;
     background-color : #fff ;
     z-index : 999 ;
 
}
 
.ys-auto-complete li{
     height : 32px ;
     line-height 32px ;
     font-size : 14px ;
     color : #222 ;
     padding-left : 10px ;
}
 
.ys-auto-complete li:hover{
     background-color : #eaeaea ;
     cursor pointer ;
}

ys_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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
( function ($){
 
     var  defaultSettings = {
         loadSource: function (keyWord,callback){  //
             //var data = [];
             //callback(this,data);
         }
     };
 
     function  refreshAutoComplete(target,list){
         if (list== null ||list.length==0){
             return ;
         }
         var  ys_auto_complete_id = $(target).attr( "ys_auto_complete" );
         var  container = $( "#" +ys_auto_complete_id);
         var  html =  "" ;
         // render the data
         list.forEach( function (item){
             var  name = item.name;
             var  value = item.value;
             html += "<li value='" +value+ "'>" +name+ "</li>" ;
         });
         container.html(html);
 
         // 计算auto_complete 坐标位置
         var  top = $(target).offset().top+$(target).outerHeight()+1;
         var  left = $(target).offset().left;
 
         container.css({
             "left" :left+ "px" ,
             "top" :top+ "px"
         });
 
         var  ys_auto_complete_id = $(target).attr( "ys_auto_complete" );
         $( "#" +ys_auto_complete_id).show();
     }
 
     var  renderHtml =     "<ul class='ys-auto-complete'></ul>" ;
 
 
     function  renderAutoComplete(target,settings){
         var  id =  "ys_auto_complete_" + new  Date().getTime()+ "" +parseInt(Math.random()*10000);
         $(target).attr( "ys_auto_complete" ,id);
         $(renderHtml).attr( "id" ,id).appendTo( "html" );  // 添加到文档中去
 
 
         var  container = $( "#" +id);
 
         var  width = $(target).outerWidth();
 
         container.css({
             "width" :width+ "px"
         });
 
         return  container;
     }
 
 
     function  bindEventHandlers(target,container,settings){
         var  timeout =  null ;
 
         var  loadSource = settings.loadSource;
 
         // 目标输入框键盘keypress事件
         $(target).on( "keydown" , function (e){
             e.stopPropagation();
             clearTimeout(timeout);
             console.log( "-------------------------" );
             timeout = setTimeout( function (){
                // load the data from backend
                 var  keyWord = $(target).val();
                 loadSource.call(target,keyWord,refreshAutoComplete);
             },300);
         });
 
         // 点击空白区域 隐藏 auto_complete
         $(document).on( "click" , function (e){
             e.preventDefault();
             $( ".ys-auto-complete" ).hide();
         });
 
         // 点击输入框 auto_complete 不隐藏
         $(target).on( "click" , function (e){
             e.stopPropagation();
             e.preventDefault();
         });
 
         // auto_complete item click 事件
         $(container).on( "click" , "li" , function (e){
             e.stopPropagation();
             e.preventDefault();
             var  value = $( this ).attr( "value" );
             var  name = $( this ).html( "name" );
 
             $(target).val(value);
             $(container).hide();
         });
 
     }
 
 
 
     var  options = {
         ysAutoComplete: function (settings) {
             var  mergedSettings = {};
             $.extend(mergedSettings,defaultSettings,settings);
 
             $( this ).each( function (){
                 var  container = renderAutoComplete( this ,mergedSettings);
 
                 bindEventHandlers( this ,container,mergedSettings);
             });
         }
     };
     $.fn.extend(options);
})(jQuery);

ys_auto_complete_demo.html

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
<!DOCTYPE html>
< html >
< head  lang = "en" >
     < meta  charset = "UTF-8" >
     < title ></ title >
     < link  rel = "stylesheet"  href = "../static/css/ys_ui_plugin/ys_auto_complete.css" >
 
     < script  src = "../static/dist/js/jquery-1.11.3.min.js" ></ script >
     < script  src = "../static/js/ys_ui_plugin/ys_auto_complete.js" ></ script >
</ head >
< body >
     < input  type = "text" />
 
 
 
< script >
     $("input").ysAutoComplete({
             loadSource:function(keyWord,callback){
                 var data = [
                                 {value:"app",name:"Apple"},
                                 {value:"bna",name:"Banana"},
                                 {value:"org",name:"Orange"}
                             ];
                 var that = this;
 
                 callback(that,data);
             }
     });
</ script >
</ body >
</ html >

wKiom1c9Ivygb1pwAAET2DL_a4Y512.jpg


 本文转自 antlove 51CTO博客,原文链接:http://blog.51cto.com/antlove/1774972


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值