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 相关文章推荐
Apache环境下PHP利用HTTP缓存协议原理解析及应用分析
Feb 16 PHP
通过PHP的内置函数,通过DES算法对数据加密和解密
Jun 21 PHP
php字符串分割函数explode的实例代码
Feb 07 PHP
php实现aes加密类分享
Feb 16 PHP
PHPThumb图片处理实例
May 03 PHP
PHP的Laravel框架结合MySQL与Redis数据库的使用部署
Mar 21 PHP
php远程下载类分享
Apr 13 PHP
PHP抓取淘宝商品的用户晒单评论+图片+搜索商品列表实例
Apr 14 PHP
PHP合并两个或多个数组的方法
Jan 20 PHP
Yii框架自定义数据库操作组件示例
Nov 11 PHP
laravel admin实现分类树/模型树的示例代码
Jun 10 PHP
PHP利用curl发送HTTP请求的实例代码
Jul 09 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
Win9x/ME下Apache+PHP安装配置
2006/10/09 PHP
memcache一致性hash的php实现方法
2015/03/05 PHP
php字符串按照单词进行反转的方法
2015/03/14 PHP
PHP如何通过传引用的思想实现无限分类(代码简单)
2015/10/13 PHP
PHPMailer发送邮件
2016/12/28 PHP
php使用PDO执行SQL语句的方法分析
2017/02/16 PHP
ThinkPHP5分页paginate代码实例解析
2020/11/10 PHP
阻止事件(取消浏览器对事件的默认行为并阻止其传播)
2013/11/03 Javascript
基于jQuery实现的文字按钮表单特效整理
2014/12/07 Javascript
javascript实现点击后变换按钮显示文字的方法
2015/05/13 Javascript
老生常谈遮罩层 滚动条的问题
2016/04/29 Javascript
懒加载实现的分页&amp;&amp;网站footer自适应
2016/12/21 Javascript
Bootstrap实现提示框和弹出框效果
2017/01/11 Javascript
基于javascript实现数字英文验证码
2017/01/25 Javascript
jQuery插件echarts实现的单折线图效果示例【附demo源码下载】
2017/03/04 Javascript
如何优雅地在Node应用中进行错误异常处理
2019/11/25 Javascript
微信小程序利用云函数获取手机号码
2019/12/17 Javascript
借助云开发实现小程序短信验证码的发送
2020/01/06 Javascript
JavaScript实现省份城市的三级联动
2020/02/11 Javascript
初学python数组的处理代码
2011/01/04 Python
python分析nignx访问日志脚本分享
2015/02/26 Python
python: 判断tuple、list、dict是否为空的方法
2018/10/22 Python
Python定时发送天气预报邮件代码实例
2019/09/09 Python
pymysql模块的操作实例
2019/12/17 Python
Cython编译python为so 代码加密示例
2019/12/23 Python
python中前缀运算符 *和 **的用法示例详解
2020/05/28 Python
Python selenium实现断言3种方法解析
2020/09/08 Python
10个示例带你掌握python中的元组
2020/11/23 Python
Python实现小黑屋游戏的完整实例
2021/01/06 Python
Boden英国官网:英国知名原创时装品牌
2018/11/06 全球购物
北京天润融通.net面试题笔试题
2012/02/20 面试题
分公司总经理岗位职责
2014/08/03 职场文书
防灾减灾日活动总结
2014/08/26 职场文书
人事聘任通知
2015/04/21 职场文书
中学教师教学工作总结
2015/08/13 职场文书
python+pytest接口自动化之token关联登录的实现
2022/04/06 Python