PHP+jQuery实现自动补全功能源码


Posted in PHP onMay 15, 2013

前面手工写了一个下拉自动补全功能,写的简单,只实现了鼠标选择的功能,不支持键盘选择。由于项目很多地方要用到这个功能,所以需要用心做一下。发现select2这个插件的功能可以满足当前需求。

在使用jquery插件select2的过程中遇到了一些疑惑,无论是穿json数据还是通过jsonp方式取数据,都能够正确返回。可是下拉列表中的条目却不能被选中,对鼠标和键盘选择都无效。

后来发现,select2插件在实现选中时是以数据中的id字段为准的。所以不管是json还是jsonp,ajax返回的数据都必须拥有id字段。如果实际数据库中不存在这样的id,也可以人为构造一个,但是要保证id的唯一性。

这里列出模板文件try_diy.tpl的源码
其中colum输入框是插件作用的地方,但其返回的值是id,当页面提交后我们需要把用户选择的版块重新呈现给用户,我的做法是根据表单提交的id查询对应的版面名称name,当控制器收到id值且非空的时候,把版块id对应的名称name值同时呈现到页面上显示出来。由于select2插件是把name名称放在构造的<div id="s2id_colum"></div>内层的span元素中,所以我会在查询结果页面加载后把隐藏域的name值写到span元素。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<script type="text/javascript" src="http://lib.sinaapp.com/js/jquery/1.7.2/jquery.min.js"></script> 
<link href="./static/js/select2-3.3.2/select2.css" rel="stylesheet"/> 
<script src="./static/js/select2-3.3.2/select2.js"></script> 
</head> 
<body> 
<form name="frm" id="frm" autocomplete="off" action="" method="post" > 
<input name="c" type="hidden" value="try"/> 
<input name="a" type="hidden" value="diy"/> 
<label>飞流产品版块 (Ajax调用远程数据):</label> 
<input type="hidden" class="bigdrop" id="colum" name="colum" style="width:600px" value=""/> 
<input type="hidden" id="columname" value="<{$frmname}>" name="columname" /> 
<p>版块ID:<{$frmid}></p> </form> 
<script> 
$(document).ready(function() { 
$('#colum').select2({ 
minimumInputLength: 0, 
placeholder: '选择版块', 
ajax: { 
url: "http://pm.feiliu.com/?c=try&a=ajax_diy",<SPAN style="BACKGROUND-COLOR: #f5f5f5; COLOR: #008000">//</SPAN><SPAN style="BACKGROUND-COLOR: #f5f5f5; COLOR: #008000"> 提供jsonp请求的url地址</SPAN> 
            dataType: 'jsonp', 
            jsonp: "callback",//传递给请求处理程序或页面的,用以获得jsonp回调函数名(一般默认为:callback,故可省略) 
            //jsonpCallback:"testback", 
            //jsonpCallback是自定义的jsonp回调函数名称,默认为jQuery自动生成的随机函数名,也可写"?",jQuery会自动处理数据 
quietMillis: 100, 
data: function(name, page) { 
return { 
types: ["exercise"], 
limit: -1, 
q: name 
}; 
}, 
results: function(data, page ) { 
return { results: data.items } 
} 
}, 
formatResult: function(exercise) { 
return "<div class='select2-user-result'>" + exercise.name + "</div>"; 
}, 
formatSelection: function(exercise) { 
return exercise.name; 
} 
}); 
$('#colum').change(function(){ 
frm.submit(); 
}); 
var name = $("#columname").val(); 
if(name){ 
$("#s2id_colum").find("span").text(name); 
} 
}); 
</script> 
</body> 
</html>

下面是控制器的例子:
class pmc_try 
{ 
public function diy(){ 
if($_POST['colum']) 
{ 
$fid = $_POST['colum']; 
$fname = mod_forum::get_forum_name_by_fid($fid);//根据id取name 
pm_tpl::assign('frmid',$fid); 
pm_tpl::assign('frmname',$fname); 
pm_tpl::display("try_diy"); 
}else 
{ 
pm_tpl::display("try_diy"); 
} 
} 
public function ajax_diy(){ 
$fid = $_GET['q']; 
$callback = $_GET["callback"]; //默认函数名为callback 
$forums = mod_forum::get_ajx_forum_by_tpid($fid); 
$total = count($forums); 
$result = array( 
'total'=>$total, 
'items'=>$forums 
); 
$output = json_encode($result); 
echo $callback.'('.$output.')';//构造jonsp 
exit(); 
} 
} 
?>

model方法:
public static function get_forum_name_by_fid($fid) 
{ 
$sql = "SELECT name FROM sq_forums WHERE fid='$fid' ORDER BY threads_counter DESC"; 
$data = pm_db11::result_first($sql); 
return $data; 
} 
public static function get_ajx_forum_by_tpid($tpid, $fid) 
{ 
//产品ID:tpid,版块ID:fid 
$data = array(); 
if($tpid && $fid){//构造一个id字段,也可以通过对查询结果加工构造 
$sql = "SELECT fid AS id,fid,name FROM sq_forums WHERE tpid='$tpid' AND name LIKE N'%$fid%' ORDER BY threads_counter DESC"; 
$query = pm_db11::query($sql); 
$data = pm_db11::fetch_all($query); 
} 
return $data; 
}

补充一下,实际使用为突出提示效果,可以高亮显示name中包含的查询关键字,这一点可以再select2的formatResult函数中处理,也可以在php中进行加工处理。这一点 的源码我这里就不写了。
补充参考http://www.cnblogs.com/dowinning/archive/2012/04/19/json-jsonp-jquery.html
PHP 相关文章推荐
PHP+ACCESS 文章管理程序代码
Jun 21 PHP
PHP中对于浮点型的数据需要用不同的方法解决
Mar 11 PHP
linux使用crontab实现PHP执行计划定时任务
May 10 PHP
php实现的Captcha验证码类实例
Sep 22 PHP
php面象对象数据库操作类实例
Dec 02 PHP
PHP之密码加密的几种方式
Jul 29 PHP
thinkphp项目部署到Linux服务器上报错“模板不存在”如何解决
Apr 27 PHP
Yii模型操作之criteria查找数据库的方法
Jul 15 PHP
php实现带读写分离功能的MySQL类完整实例
Jul 28 PHP
PHP将URL转换成短网址的算法分享
Sep 13 PHP
PHP实现上一篇下一篇的方法实例总结
Sep 22 PHP
php获取访问者浏览页面的浏览器类型
Jan 23 PHP
深入分析php之面向对象
May 15 #PHP
深入解析php之apc
May 15 #PHP
深入解析php之sphinx
May 15 #PHP
基于php设计模式中单例模式的应用分析
May 15 #PHP
基于php设计模式中工厂模式详细介绍
May 15 #PHP
php笔记之:数据类型与常量的使用分析
May 14 #PHP
PHP笔记之:基于面向对象设计的详解
May 14 #PHP
You might like
PHP 杂谈《重构-改善既有代码的设计》之四 简化条件表达式
2012/04/09 PHP
PHP--用万网的接口实现域名查询功能
2012/12/13 PHP
解析在PHP中使用mysqli扩展库对mysql的操作
2013/07/03 PHP
php获取URL中带#号等特殊符号参数的解决方法
2014/09/02 PHP
初识PHP
2014/09/28 PHP
PHP生成word文档的三种实现方式
2016/11/14 PHP
extjs3 combobox取value和text案例详解
2013/02/06 Javascript
用javascript替换URL中的参数值示例代码
2014/01/27 Javascript
AngularJS学习笔记之ng-options指令
2015/06/16 Javascript
浅析AngularJs HTTP响应拦截器
2015/12/28 Javascript
Javascript实现前端简单的路由实例
2016/09/11 Javascript
JS生成和下载二维码的代码
2016/12/07 Javascript
NPM 安装cordova时警告:npm WARN deprecated minimatch@2.0.10: Please update to minimatch 3.0.2 or higher to
2016/12/20 Javascript
Vue中建立全局引用或者全局命令的方法
2017/08/21 Javascript
微信小程序自定义组件之可清除的input组件
2018/07/17 Javascript
javascript实现5秒倒计时并跳转功能
2019/06/20 Javascript
基于ssm框架实现layui分页效果
2019/07/27 Javascript
layui 关闭open弹出框 刷新table表格页面的方法
2019/09/16 Javascript
javascript使用Blob对象实现的下载文件操作示例
2020/04/18 Javascript
python实现无证书加密解密实例
2014/10/27 Python
Python中return语句用法实例分析
2015/08/04 Python
python使用 HTMLTestRunner.py生成测试报告
2017/10/20 Python
Python封装原理与实现方法详解
2018/08/28 Python
Python下应用opencv 实现人脸检测功能
2019/10/24 Python
把vgg-face.mat权重迁移到pytorch模型示例
2019/12/27 Python
tensorflow指定CPU与GPU运算的方法实现
2020/04/21 Python
python中线程和进程有何区别
2020/06/17 Python
html5音频_动力节点Java学院整理
2018/08/22 HTML / CSS
万宝龙英国官网:Montblanc手表、书写工具、皮革和珠宝
2018/10/16 全球购物
高中美术教学反思
2014/01/19 职场文书
中专生自我鉴定范文
2014/02/02 职场文书
小学少先队辅导员述职报告
2015/01/10 职场文书
工作岗位职责范本
2015/02/15 职场文书
工作调动申请报告
2015/05/18 职场文书
民主生活会意见
2015/06/05 职场文书
SpringBoot+VUE实现数据表格的实战
2021/08/02 Java/Android