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 相关文章推荐
phpfans留言版用到的数据操作类和分页类
Jan 04 PHP
php下过滤HTML代码的函数
Dec 10 PHP
php escape URL编码
Dec 10 PHP
PHP读取XML值的代码(推荐)
Jan 01 PHP
php 文件上传类代码
Aug 06 PHP
PHP数组循环操作详细介绍 附实例代码
Feb 03 PHP
php中把美国时间转为北京时间的自定义函数分享
Jul 28 PHP
Parse正式发布开源PHP SDK
Aug 11 PHP
php解析json数据实例
Aug 19 PHP
php中的ini配置原理详解
Oct 14 PHP
YII2框架中excel表格导出的方法详解
Jul 21 PHP
laravel框架实现敏感词汇过滤功能示例
Feb 15 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将整个网站生成HTML纯静态网页的方法总结
2012/02/05 PHP
php下pdo的mysql事务处理用法实例
2014/12/27 PHP
PHP7.1新功能之Nullable Type用法分析
2016/09/26 PHP
XmlUtils JS操作XML工具类
2009/10/01 Javascript
Javascript 判断客户端浏览器类型代码
2010/03/01 Javascript
JavaScript格式化数字的函数代码
2010/11/30 Javascript
jquery 为a标签绑定click事件示例代码
2014/06/23 Javascript
详解JavaScript 中的 replace 方法
2016/01/01 Javascript
javascript插件开发的一些感想和心得
2016/02/28 Javascript
js计算时间差代码【包括计算,天,时,分,秒】
2016/04/26 Javascript
很棒的Bootstrap选项卡切换效果
2016/07/01 Javascript
JS正则子匹配实例分析
2016/12/22 Javascript
Web 开发中Ajax的Session 超时处理方法
2017/01/19 Javascript
javascript 网页进度条简单实例
2017/02/22 Javascript
AngularJS表单验证功能
2017/10/19 Javascript
JS实现监控微信小程序的原理
2018/06/15 Javascript
如何手动实现es5中的bind方法详解
2018/12/07 Javascript
基于Vue 撸一个指令实现拖拽功能
2019/10/09 Javascript
vue 保留两位小数 不能直接用toFixed(2) 的解决
2020/08/07 Javascript
Python中使用第三方库xlutils来追加写入Excel文件示例
2015/04/05 Python
python实现发送邮件及附件功能
2021/03/02 Python
django的分页器Paginator 从django中导入类
2019/07/25 Python
Python Tkinter模块 GUI 可视化实例
2019/11/20 Python
python同义词替换的实现(jieba分词)
2020/01/21 Python
英国家电购物网站:Sonic Direct
2019/03/26 全球购物
巴西购物网站:Submarino
2020/01/19 全球购物
渗透攻击的测试步骤
2014/06/07 面试题
小学教师国培感言
2014/02/08 职场文书
批评与自我批评材料
2014/02/15 职场文书
承诺书怎么写
2014/03/26 职场文书
国际政治学专业推荐信
2014/09/26 职场文书
西柏坡导游词
2015/02/05 职场文书
茶楼服务员岗位职责
2015/02/09 职场文书
利用Java设置Word文本框中的文字旋转方向的实现方法
2021/06/28 Java/Android
Python中递归以及递归遍历目录详解
2021/10/24 Python
解决Mysql多行子查询的使用及空值问题
2022/01/22 MySQL