【php自动加载】PHP自动补全表单的两种方法

更新时间:2021-07-09    来源:php与数据库    手机版     字体:

【www.bbyears.com--php与数据库】

效果图:

第一种:从数据库中检索之后补全

第二种:邮箱等纯前端的补全

先说第二种,使用开源的插件,所以相对简单。

github上面的项目 completer。

https://github.com/fengyuanchen/completer 做法特别容易,github上面有详细的文档。

一开始尝试用这个来配上自己的后台代码,做成第一种的自动补全,搞了半天失败了。可能本人js太差,改动太多的话,代码很复杂,除非认真研究上面这个开源项目。

主要失败在我在后台数据库找出来的完整的模糊查询得到的数据,用上面的插件只能是补全在后面,没有办法完全替换输入值。比如你输入fafe,查到fafegeg, 但是下拉的表项中只能选到 fafefafegeg,因为是补全。

下面说说第一个怎么做,百度不到什么好的经验介绍,就自己按自己的思路实现了:

 

 代码如下

/**

  * php 返回模糊搜索的结果给自动完成

  */

 publicfunctionactionComplete($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($result1as$v) {

   $string=$string.$v->username.',';

  }

  foreach($result2as$v) {

   $string=$string.''.$v->email.',';

  }

  $string=$string.'';

  //返回格式 类似username1,username2,email1,

  return$string;

 }

//前端

 

         

         

//JS

<script src="/autoComplete.js"></script>

<script language="javascript">

 functionlookup(event,inputString) {

  if(inputString.length != 0) {

   varblocked ='0';

   varrequest =newXMLHttpRequest();

   request.open("GET","user/complete&value="+ inputString +"&blocked="+ blocked);

   request.send(null);

   request.onreadystatechange =function() {

    if(request.readyState === 4) {

     if(request.status === 200) {

      varresult = request.responseText;

      ss = result.split(",")

      varautoComplete=newAutoComplete('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;

}

varBind =function(object, fun) {

 returnfunction() {

  returnfun.apply(object, arguments);

 }

}

functionAutoComplete(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){

  returnfunction(){

   _this.obj.value=this.seq;

   _this.autoObj.className="auto_hidden";

  }

 },

 //模拟鼠标移动至DIV时,DIV高亮

 autoOnmouseover:function(_this,_div_index){

  returnfunction(){

   _this.index=_div_index;

   varlength = _this.autoObj.children.length;

   for(varj=0;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(vari=0;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){

  varlength = this.autoObj.children.length;

  //光标键"↓"

  if(event.keyCode==40){

   ++this.index;

   if(this.index>length){

    this.index=0;

   }elseif(this.index==length){

    this.obj.value=this.search_value;

   }

   this.changeClassname(length);

  }

  //光标键"↑"

  elseif(event.keyCode==38){

   this.index--;

   if(this.index<-1){

    this.index=length - 1;

   }elseif(this.index==-1){

    this.obj.value=this.search_value;

   }

   this.changeClassname(length);

  }

  //回车键

  elseif(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;

   varvalueArr=this.value_arr;

   //valueArr.sort();

   if(this.obj.value.replace(/(^\s*)|(\s*$)/g,'')==""){return; }//值为空,退出

   try{varreg =newRegExp("("+ this.obj.value +")","i");}

   catch(e){return; }

   vardiv_index=0;//记录创建的DIV的索引

   for(vari=0;i

    if(reg.test(valueArr[i])){

     vardiv = 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();});

 }

}

//-->

 

本文来源:http://www.bbyears.com/jiaocheng/128641.html