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.NET的入门教程
Oct 09 PHP
PHP 长文章分页函数 带使用方法,不会分割段落,翻页在底部
Oct 22 PHP
php下删除一篇文章生成的多个静态页面
Aug 08 PHP
关于PHP的curl开启问题探讨
Apr 08 PHP
Laravel 4 初级教程之视图、命名空间、路由
Oct 30 PHP
php使用cookie显示用户上次访问网站日期的方法
Jan 26 PHP
PHP实现远程下载文件到本地
May 17 PHP
PHP使用缓存即时输出内容(output buffering)的方法
Aug 03 PHP
php根据用户名和手机号查询是否存在手机号码
Feb 16 PHP
php 截取GBK文档某个位置开始的n个字符方法
Mar 08 PHP
ThinkPHP5 的简单搭建和使用详解
Nov 15 PHP
php获取是星期几的的一些常用姿势
Dec 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 分页类(模仿google)-面试题目解答
2009/09/13 PHP
下拉列表多级联动dropDownList示例代码
2013/06/27 PHP
教你如何使用php session
2013/10/28 PHP
php中有关字符串的4个函数substr、strrchr、strstr、ereg介绍和使用例子
2014/04/24 PHP
WordPress中邮件的一些修改和自定义技巧
2015/12/15 PHP
php 解决substr()截取中文字符乱码问题
2016/07/18 PHP
PHP基于pdo的数据库操作类【可支持mysql、sqlserver及oracle】
2018/05/21 PHP
PHP fprintf()函数用法讲解
2019/02/16 PHP
Thinkphp5框架使用validate实现验证功能的方法
2019/08/27 PHP
gridpanel动态加载数据的实例代码
2013/07/18 Javascript
jQuery定义插件的方法
2015/12/18 Javascript
Node.js 中exports 和 module.exports 的区别
2017/03/14 Javascript
从零开始学习Node.js系列教程五:服务器监听方法示例
2017/04/13 Javascript
详谈js对url进行编码和解码(三种方式的区别)
2017/08/16 Javascript
JavaScript 完成注册页面表单校验的实例
2017/08/19 Javascript
浅谈Angular路由守卫
2017/08/26 Javascript
prototype.js简单实现ajax功能示例
2017/10/18 Javascript
Angular服务Request异步请求的实例讲解
2018/08/13 Javascript
vue前端框架—Mint UI详解(更适用于移动端)
2019/04/30 Javascript
vue将后台数据时间戳转换成日期格式
2019/07/31 Javascript
微信公众号平台接口开发 获取access_token过程解析
2019/08/14 Javascript
使用Python操作Elasticsearch数据索引的教程
2015/04/08 Python
win10下Python3.6安装、配置以及pip安装包教程
2017/10/01 Python
python导入csv文件出现SyntaxError问题分析
2017/12/15 Python
使用Python来开发微信功能
2018/06/13 Python
python实现动态数组的示例代码
2019/07/15 Python
python发qq消息轰炸虐狗好友思路详解(完整代码)
2020/02/15 Python
使用Django实现把两个模型类的数据聚合在一起
2020/03/28 Python
pyinstaller将含有多个py文件的python程序做成exe
2020/04/29 Python
python如何导入依赖包
2020/07/13 Python
css3的过滤效果简单实例
2016/08/03 HTML / CSS
项目管理计划书
2014/01/09 职场文书
大队委竞选演讲稿
2014/04/28 职场文书
迎国庆演讲稿
2014/09/15 职场文书
毕业生就业推荐表自我鉴定
2019/06/20 职场文书
2019送给家人们的中秋节祝福语
2019/08/15 职场文书