效果图:
第一种:从数据库中检索之后补全
第二种:邮箱等纯前端的补全
先说第二种,使用开源的插件,所以相对简单。
github上面的项目 completer。
https://github.com/fengyuanchen/completer 做法特别容易,github上面有详细的文档。
一开始尝试用这个来配上自己的后台代码,做成第一种的自动补全,搞了半天失败了。可能本人js太差,改动太多的话,代码很复杂,除非认真研究上面这个开源项目。
主要失败在我在后台数据库找出来的完整的模糊查询得到的数据,用上面的插件只能是补全在后面,没有办法完全替换输入值。比如你输入fafe,查到fafegeg, 但是下拉的表项中只能选到 fafefafegeg,因为是补全。
下面说说第一个怎么做,百度不到什么好的经验介绍,就自己按自己的思路实现了:
php" id="highlighter_380612">
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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
|
/** * php 返回模糊搜索的结果给自动完成 */ public function actioncomplete( $value , $blocked ) { //将输入的值与用户名和邮箱进行模糊查询 $result1 = user::find()->where([ 'blocked' => $blocked ])->andwhere([ 'type' => $this ->type])->andwhere([ 'like' , 'username' , $value ])->all(); $result2 = user::find()->where([ 'blocked' => $blocked ])->andwhere([ 'type' => $this ->type])->andwhere([ 'like' , 'email' , $value ])->all(); $string = '' ; foreach ( $result1 as $v ) { $string = $string . $v ->username. ',' ; } foreach ( $result2 as $v ) { $string = $string . '' . $v ->email. ',' ; } $string = $string . '' ; //返回格式 类似username1,username2,email1, return $string ; } //前端 <input type= "text" id= "o" onkeyup= "lookup(event,this.value);" placeholder= "按用户名和邮箱检索" name= "value" > <div class = "auto_hidden" id= "auto" ><!--自动完成 div--></div> <button type= "submit" style= "height: 30px;width: 55px" class = "btn" >检索</button> //js <link href= "<?= backend_css_url ?>/autocomplete.css" rel= "external nofollow" rel= "stylesheet" /> <script src= "<?= backend_js_url ?>/autocomplete.js" ></script> <script language= "javascript" > function lookup(event,inputstring) { if (inputstring.length != 0) { var blocked = '0' ; var request = new xmlhttprequest(); request.open( "get" , "<?= pre_backend_url ?>user/complete&value=" + inputstring + "&blocked=" + blocked); request.send(null); request.onreadystatechange = function () { if (request.readystate === 4) { if (request.status === 200) { var result = request.responsetext; ss = result.split( "," ) var autocomplete= new autocomplete( 'o' , 'auto' ,ss); autocomplete.start(event,ss); } } } } } // lookup </script> //autocomplete.css .auto_hidden { width:204px;border-top: 1px solid #333; border-bottom: 1px solid #333; border-left: 1px solid #333; border-right: 1px solid #333; position:absolute; display:none; } .auto_show { width:204px; border-top: 1px solid #333; border-bottom: 1px solid #333; border-left: 1px solid #333; border-right: 1px solid #333; position:absolute; z-index:9999; /* 设置对象的层叠顺序 */ display:block; } .auto_onmouseover{ color:#ffffff; background-color:highlight; width:100%; } .auto_onmouseout{ color:#000000; width:100%; background-color:#ffffff; } //autocomplete.js /* 通用: 自动补全(仿百度搜索框) */ var $ = function (id) { return "string" == typeof id ? document.getelementbyid(id) : id; } var bind = function (object, fun) { return function () { return fun.apply(object, arguments); } } function autocomplete(obj,autoobj,arr){ this.obj=$(obj); //输入框 this.autoobj=$(autoobj); //div的根节点 this.value_arr=arr; //不要包含重复值 this.index=-1; //当前选中的div的索引 this.search_value= "" ; //保存当前搜索的字符 } autocomplete.prototype={ //初始化div的位置 init: function (){ this.autoobj.style.left = this.obj.offsetleft + "px" ; this.autoobj.style.top = this.obj.offsettop + this.obj.offsetheight + "px" ; this.autoobj.style.width= this.obj.offsetwidth - 2 + "px" ; //减去边框的长度2px }, //删除自动完成需要的所有div deletediv: function (){ while (this.autoobj.haschildnodes()){ this.autoobj.removechild(this.autoobj.firstchild); } this.autoobj.classname= "auto_hidden" ; }, //设置值 setvalue: function (_this){ return function (){ _this.obj.value=this.seq; _this.autoobj.classname= "auto_hidden" ; } }, //模拟鼠标移动至div时,div高亮 autoonmouseover: function (_this,_div_index){ return function (){ _this.index=_div_index; var length = _this.autoobj.children.length; for ( var j=0;j<length;j++){ if (j!=_this.index ){ _this.autoobj.childnodes[j].classname= 'auto_onmouseout' ; } else { _this.autoobj.childnodes[j].classname= 'auto_onmouseover' ; } } } }, //更改classname changeclassname: function (length){ for ( var i=0;i<length;i++){ if (i!=this.index ){ this.autoobj.childnodes[i].classname= 'auto_onmouseout' ; } else { this.autoobj.childnodes[i].classname= 'auto_onmouseover' ; this.obj.value=this.autoobj.childnodes[i].seq; } } } , //响应键盘 presskey: function (event){ var length = this.autoobj.children.length; //光标键"↓" if (event.keycode==40){ ++this.index; if (this.index>length){ this.index=0; } else if (this.index==length){ this.obj.value=this.search_value; } this.changeclassname(length); } //光标键"↑" else if (event.keycode==38){ this.index--; if (this.index<-1){ this.index=length - 1; } else if (this.index==-1){ this.obj.value=this.search_value; } this.changeclassname(length); } //回车键 else if (event.keycode==13){ this.autoobj.classname= "auto_hidden" ; this.index=-1; } else { this.index=-1; } }, //程序入口 start: function (event,result){ if (event.keycode!=13&&event.keycode!=38&&event.keycode!=40){ this.init(); this.deletediv(); this.search_value=this.obj.value; var valuearr=this.value_arr; //valuearr.sort(); if (this.obj.value.replace(/(^\s*)|(\s*$)/g, '' )== "" ){ return ; } //值为空,退出 try { var reg = new regexp( "(" + this.obj.value + ")" , "i" );} catch (e){ return ; } var div_index=0; //记录创建的div的索引 for ( var i=0;i<valuearr.length;i++){ if (reg.test(valuearr[i])){ var div = document.createelement( "div" ); div.classname= "auto_onmouseout" ; div.seq=valuearr[i]; div.onclick=this.setvalue(this); div.onmouseover=this.autoonmouseover(this,div_index); div.innerhtml= result[i]; console.log(); this.autoobj.appendchild(div); this.autoobj.classname= "auto_show" ; div_index++; } } } this.presskey(event); window.onresize=bind(this, function (){this.init();}); } } //--> |
以上所述是小编给大家介绍的php自动补全表单的两种方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对服务器之家网站的支持!
原文链接:http://m.blog.csdn.net/article/details?id=52296783&utm_source=tuicool&utm_medium=referral