malike 发表于 2018-2-11 11:56:44


            效果图:
第一种:从数据库中检索之后补全
http://files.jb51.net/file_images/article/201703/20173694545021.png?20172694618
第二种:邮箱等纯前端的补全
http://files.jb51.net/file_images/article/201703/20173694641336.png?20172694652
先说第二种,使用开源的插件,所以相对简单。
github上面的项目 completer。
https://github.com/fengyuanchen/completer 做法特别容易,github上面有详细的文档。
一开始尝试用这个来配上自己的后台代码,做成第一种的自动补全,搞了半天失败了。可能本人js太差,改动太多的话,代码很复杂,除非认真研究上面这个开源项目。
主要失败在我在后台数据库找出来的完整的模糊查询得到的数据,用上面的插件只能是补全在后面,没有办法完全替换输入值。比如你输入fafe,查到fafegeg, 但是下拉的表项中只能选到 fafefafegeg,因为是补全。
下面说说第一个怎么做,百度不到什么好的经验介绍,就自己按自己的思路实现了:
/**
* 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 ;
}
//前端

         
         检索
//JS
/autoComplete.css" rel="external nofollow" rel="stylesheet" />
//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;jlength){
    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]
查看完整版本: PHP自动补全表单的两种方法