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中计算程序运行时间的类代码
Nov 03 PHP
php加速器eAccelerator的配置参数、API详解
May 05 PHP
codeigniter显示所有脚本执行时间的方法
Mar 21 PHP
PHP Opcache安装和配置方法介绍
May 28 PHP
使用xampp搭建运行php虚拟主机的详细步骤
Oct 21 PHP
PHP文件操作之获取目录下文件与计算相对路径的方法
Jan 08 PHP
网页的分页下标生成代码(PHP后端方法)
Feb 03 PHP
Symfony2框架创建项目与模板设置实例详解
Mar 17 PHP
再谈PHP中单双引号的区别详解
Jun 12 PHP
PHP执行shell脚本运行程序不产生core文件的方法
Dec 28 PHP
PHP自动识别当前使用移动终端
May 21 PHP
php 命名空间(namespace)原理与用法实例小结
Nov 13 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获取网络文件的实现代码
2010/01/01 PHP
PHP中配置IIS7实现基本身份验证的方法
2015/09/24 PHP
CI框架附属类用法分析
2018/12/26 PHP
PHP的mysqli_select_db()函数讲解
2019/01/23 PHP
PHP5.6.8连接SQL Server 2008 R2数据库常用技巧分析总结
2019/05/06 PHP
关于文本限制字数的js代码
2007/04/02 Javascript
一个用js实现控制台控件的代码
2007/09/04 Javascript
基于jquery的bankInput银行卡账号格式化
2012/08/22 Javascript
JavaScript简单实现鼠标拖动选择功能
2014/03/06 Javascript
jQuery实现鼠标滚动图片延迟加载效果附源码下载
2016/06/28 Javascript
vue中的计算属性实例详解
2018/09/19 Javascript
微信小程序module.exports模块化操作实例浅析
2018/12/20 Javascript
深入解析koa之异步回调处理
2019/06/17 Javascript
vue输入框使用模糊搜索功能的实现代码
2020/05/26 Javascript
python3.4下django集成使用xadmin后台的方法
2017/08/15 Python
python使用itchat库实现微信机器人(好友聊天、群聊天)
2018/01/04 Python
Python读写/追加excel文件Demo分享
2018/05/03 Python
python石头剪刀布小游戏(三局两胜制)
2021/01/20 Python
Python可视化mhd格式和raw格式的医学图像并保存的方法
2019/01/24 Python
详解Python 解压缩文件
2019/04/09 Python
Falsk 与 Django 过滤器的使用与区别详解
2019/06/04 Python
如何实现在jupyter notebook中播放视频(不停地展示图片)
2020/04/23 Python
sklearn和keras的数据切分与交叉验证的实例详解
2020/06/19 Python
matplotlib事件处理基础(事件绑定、事件属性)
2021/02/03 Python
HTML5+WebSocket实现多文件同时上传的实例
2016/12/29 HTML / CSS
HUGO BOSS美国官方网上商店:世界知名奢侈品牌
2017/08/04 全球购物
澳大利亚小众服装品牌:Maurie & Eve
2018/03/27 全球购物
美国男士和女士奢侈品折扣手表购物网站:Certified Watch Store
2018/06/13 全球购物
竞聘演讲稿
2014/04/24 职场文书
区级文明单位申报材料
2014/05/15 职场文书
感恩节寄语2015
2015/03/24 职场文书
交通安全月活动总结
2015/05/08 职场文书
党支部审查意见
2015/06/02 职场文书
如何理解及使用Python闭包
2021/06/01 Python
python字符串的多行输出的实例详解
2021/06/08 Python
Python加密技术之RSA加密解密的实现
2022/04/08 Python