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

时间: 2024-08-02 22:12:06

PHP自动补全表单的两种方法的相关文章

jquery的ajax提交form表单的两种方法小结(推荐)_jquery

jquery的ajax提交form表单的两种方法小结(推荐) 方法一: function AddHandlingFeeToRefund() { var AjaxURL= "../OrderManagement/AjaxModifyOrderService.aspx"; alert($('#formAddHandlingFee').serialize()); $.ajax({ type: "POST", dataType: "html", url:

spring mvc 防止重复提交表单的两种方法,推荐第二种

第一种方法:判断session中保存的token 比较麻烦,每次在提交表单时都必须传入上次的token.而且当一个页面使用ajax时,多个表单提交就会有问题. 注解Token代码: package com.thinkgem.jeesite.common.repeat_form_validator; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.ann

Python实现Tab自动补全和历史命令管理的方法_python

本文实例讲述了Python实现Tab自动补全和历史命令管理的方法.分享给大家供大家参考.具体分析如下: Python的startup文件,即环境变量 PYTHONSTARTUP 对应的文件 1. 为readline添加tab键自动补全的功能 2. 像Shell一样管理历史命令 代码如下: 复制代码 代码如下: import rlcompleter import readline import atexit import os # http://stackoverflow.com/question

使用ajax异步提交表单的几种方法总结_AJAX相关

这里介绍三种常用的提交方式 方式一 手工收集所有的用户输入,封装为大的"k1=v1&k2=v2-"键值对形式,使用$.post(url, data,fn)把数据提交给服务器 $.ajax({ type:'post', url:'Notice_noTipsNotice', data:'k1=v1&k2=v2...', cache:false, dataType:'json', success:function(data){ } }); 方式二 单序列化:$('#myfor

使用ajax异步提交表单的几种方法总结

这里介绍三种常用的提交方式 方式一 手工收集所有的用户输入,封装为大的"k1=v1&k2=v2-"键值对形式,使用$.post(url, data,fn)把数据提交给服务器 $.ajax({ type:'post', url:'Notice_noTipsNotice', data:'k1=v1&k2=v2...', cache:false, dataType:'json', success:function(data){ } }); 方式二 单序列化:$('#myfor

js校验表单后提交表单的三种方法

本篇文章主要是对js校验表单后提交表单的三种方法进行了总结介绍,需要的朋友可以过来参考下,希望对大家有所帮助 第一种:  代码如下: <script type="text/javascript">          function check(form) {             if(form.userId.value=='') {                 alert("请输入用户帐号!");                 form.us

XP系统注册表初始化的两种方法

  我们知道,注册表是电脑里一个非常重要的内容,一旦被病毒攻击就非常严重了,不仅仅是会导致系统崩溃.而一些电脑用户想初始化电脑的注册表,但是又不知道该怎么操作注册表才能初始化.下面,小编就以XP系统为例子,为大家演示一下XP系统注册表初始化的两种方法! XP系统注册表初始方法一: WinXP自带系统还原功能,前提是之前有过进行系统备份,使用自带功能将系统还原到某一个还原点,注册表也将随整个系统一起恢复. XP系统注册表初始方法二: 使用软件来处理.这里推荐大家使用Registry Purify(

js校验表单后提交表单的三种方法总结

作者: 字体:[增加 减小] 类型:转载 时间:2014-02-28 本篇文章主要是对js校验表单后提交表单的三种方法进行了总结介绍,需要的朋友可以过来参考下,希望对大家有所帮助 第一种: 复制代码 代码如下: <script type="text/javascript">          function check(form) {           if(form.userId.value=='') {                 alert("请输入

利用JS提交表单的几种方法和验证(必看篇)_javascript技巧

工作中发现表单提交方便的问题,很多时候IE下提交好好的,打了火狐下就出现了问题,利用提交按钮就不成功了,于是利用JS的方式就成功了,也不知道为什么.在导师的催促下就总结出以下的几种常用表单提交的方法. 第一种方式:表单提交,在form标签中增加onsubmit事件来判断表单提交是否成功 <script type="text/javascript"> function validate(obj) { if (confirm("提交表单?")) { aler