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中处理模拟rewrite 效果
Dec 09 PHP
献给php初学者(入门学习经验谈)
Oct 12 PHP
php生成excel列序号代码实例
Dec 24 PHP
curl不使用文件存取cookie php使用curl获取cookie示例
Jan 26 PHP
php+ajax实现图片文件上传功能实例
Jun 17 PHP
PHP检测字符串是否为UTF8编码的常用方法
Nov 21 PHP
PHP面试常用算法(推荐)
Jul 22 PHP
PHP中如何判断exec函数执行成功?
Aug 04 PHP
PHP简单实现上一页下一页功能示例
Sep 14 PHP
php基于数组函数实现关联表的编辑操作示例
Jul 04 PHP
laravel 时间格式转时间戳的例子
Oct 11 PHP
详解PHP设计模式之依赖注入模式
May 25 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 中的批处理的实现
2007/06/14 PHP
mac下安装nginx和php
2013/11/04 PHP
在Win7 中为php扩展配置Xcache
2014/10/08 PHP
浅谈PHP中output_buffering
2015/07/13 PHP
DD_belatedPNG,IE6下PNG透明解决方案(国外)
2010/12/06 Javascript
JQuery 获取json数据$.getJSON方法的实例代码
2013/08/02 Javascript
Nodejs实现的一个静态服务器实例
2014/12/06 NodeJs
javascript模拟评分控件实现方法
2015/05/13 Javascript
在JavaScript中使用开平方根的sqrt()方法
2015/06/15 Javascript
javascript实现一个简单的弹出窗
2016/02/22 Javascript
基于EasyUI的基础之上实现树形功能菜单
2017/06/28 Javascript
浅谈vue的iview列表table render函数设置DOM属性值的方法
2017/09/30 Javascript
利用Javascript获取选择文本所在的句子详解
2017/12/03 Javascript
KOA+egg.js集成kafka消息队列的示例
2018/11/09 Javascript
在 Vue 中使用 JSX 及使用它的原因浅析
2020/02/10 Javascript
JavaScript中的this原理及6种常见使用场景详解
2020/02/14 Javascript
JS实现网页时钟特效
2020/03/25 Javascript
javascript实现滚轮轮播图片
2020/12/13 Javascript
[42:06]2019国际邀请赛全明星赛 8.23
2019/09/05 DOTA
BP神经网络原理及Python实现代码
2018/12/18 Python
对python判断是否回文数的实例详解
2019/02/08 Python
对python3中的RE(正则表达式)-详细总结
2019/07/23 Python
python中sort和sorted排序的实例方法
2019/08/26 Python
Python实现手机号自动判断男女性别(实例解析)
2019/12/22 Python
纯CSS改变webkit内核浏览器的滚动条样式
2014/04/17 HTML / CSS
Html5 Canvas动画基础碰撞检测的实现
2018/12/06 HTML / CSS
英国哈罗德园艺:Harrod Horticultural
2020/03/31 全球购物
涉外经济法专业毕业生推荐信
2013/11/24 职场文书
幼儿园教师个人总结
2015/02/05 职场文书
黄河绝恋观后感
2015/06/08 职场文书
趣味运动会标语口号
2015/12/26 职场文书
朋友圈早安励志语录!
2019/07/08 职场文书
解决Jupyter-notebook不弹出默认浏览器的问题
2021/03/30 Python
Java 超详细讲解数据结构中的堆的应用
2022/04/02 Java/Android
Python使用华为API为图像设置多个锚点标签
2022/04/12 Python
Python作用域和名称空间的详细介绍
2022/04/13 Python