PHP自动补全表单的两种方法


Posted in PHP onMarch 06, 2017

效果图:

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

PHP自动补全表单的两种方法

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

PHP自动补全表单的两种方法

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

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 ;
 }
//前端
 <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自动补全表单的两种方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

PHP 相关文章推荐
新版mysql+apache+php Linux安装指南
Oct 09 PHP
FCKeditor添加自定义按钮
Mar 27 PHP
php pcntl_fork和pcntl_fork 的用法
Apr 13 PHP
解析yii数据库的增删查改
Jun 20 PHP
浅析51个PHP处理字符串的函数
Aug 02 PHP
怎么在Windows系统中搭建php环境
Aug 31 PHP
php修改上传图片尺寸的方法
Apr 14 PHP
php从文件夹随机读取文件的方法
Jun 01 PHP
php通过获取头信息判断图片类型的方法
Jun 26 PHP
Yii的Srbac插件用法详解
Jul 14 PHP
Yii输入正确验证码却验证失败的解决方法
Jun 06 PHP
php+jQuery实现的三级导航栏下拉菜单显示效果
Aug 10 PHP
PHP中for循环与foreach的区别
Mar 06 #PHP
微信公众平台开发-微信服务器IP接口实例(含源码)
Mar 05 #PHP
php实现留言板功能
Mar 05 #PHP
Linux服务器下PHPMailer发送邮件失败的问题解决
Mar 04 #PHP
php获取网站根目录物理路径的几种方法(推荐)
Mar 04 #PHP
PHP获取路径和目录的方法总结【必看篇】
Mar 04 #PHP
php redis实现对200w用户的即时推送
Mar 04 #PHP
You might like
php.ini中文版
2006/10/09 PHP
解析strtr函数的效率问题
2013/06/26 PHP
PHP中执行cmd命令的方法
2014/10/11 PHP
php实现的IMEI限制的短信验证码发送类
2015/05/05 PHP
php使用imagecopymerge()函数创建半透明水印
2018/01/25 PHP
通过JAVASCRIPT读取ASP设定的COOKIE
2007/02/15 Javascript
javascript 从if else 到 switch case 再到抽象
2010/07/17 Javascript
prettify 代码高亮着色器google出品
2010/12/28 Javascript
使用javascript实现有效时间的控制,并显示将要过期的时间
2014/01/02 Javascript
纯js写的分页表格数据为json串
2014/02/18 Javascript
jQuery拖拽div实现思路
2014/02/19 Javascript
jQuery结合CSS制作漂亮的select下拉菜单
2015/05/03 Javascript
png在IE6 下无法透明的解决方法汇总
2015/05/21 Javascript
深入学习js瀑布流布局
2016/10/14 Javascript
headjs实现网站并行加载但顺序执行JS
2016/11/29 Javascript
js实现的简练高效拖拽功能示例
2016/12/21 Javascript
Angular1.x自定义指令实例详解
2017/03/01 Javascript
Angular1.x复杂指令实例详解
2017/03/01 Javascript
vue+axios 前端实现的常用拦截的代码示例
2018/08/23 Javascript
Vue CLI3 如何支持less的方法示例
2018/08/29 Javascript
解决cordova+vue 项目打包成APK应用遇到的问题
2019/05/10 Javascript
JS使用正则表达式提交页面验证的代码
2019/10/16 Javascript
node创建Vue项目步骤详解
2020/03/06 Javascript
python异步任务队列示例
2014/04/01 Python
Python写的服务监控程序实例
2015/01/31 Python
Python生成随机MAC地址
2015/03/10 Python
浅谈Python实现2种文件复制的方法
2018/01/19 Python
python2与python3的print及字符串格式化小结
2018/11/30 Python
python pandas移动窗口函数rolling的用法
2020/02/29 Python
Python API len函数操作过程解析
2020/03/05 Python
pymysql之cur.fetchall() 和cur.fetchone()用法详解
2020/05/15 Python
css3翻牌翻数字的示例代码
2020/02/07 HTML / CSS
接口中的方法可以是abstract的吗
2015/07/23 面试题
投标单位介绍信
2015/05/05 职场文书
2015国庆节感想
2015/08/04 职场文书
2019年描写人生经典诗句大全
2019/07/08 职场文书