jQuery+PHP+Mysql实现输入自动完成提示的功能

原创文章 作者:月光光 2011年09月22日 14:11helloweba.com 标签:jQuery  PHP  JSON 

我们在很多项目中使用了搜索功能来帮助用户更快更准确的找到想要的信息。本文将介绍如何实现用户输入自动提示的功能,就像谷歌百度搜索引擎一样,当用户输入关键字时,输入框下方会有提示,将与关键字相关的信息展现出来供用户选择,提升了用户体验。

jQuery+PHP+Mysql实现输入自动完成提示的功能

本文将使用jquery ui的autocomplete插件,结合后端PHP,数据源通过PHP读取mysql数据表的数据。

XHTML

首先将jquery库和相关ui插件,以及css导入。

<link rel="stylesheet" href="jquery.ui.autocomplete.css"/>
<script type="text/javascript" src="js/jquery.js"></script>
<script type="text/javascript" src="ui/jquery.ui.core.js"></script>
<script type="text/javascript" src="ui/jquery.ui.widget.js"></script>
<script type="text/javascript" src="ui/jquery.ui.position.js"></script>
<script type="text/javascript" src="ui/jquery.ui.autocomplete.js"></script>

jQuery ui 插件可以在官网上下载:www.jqueryui.com

接着在body中写一个输入框:

<input type="text" id="key" name="key" />

jQuery

$(function(){
	$("#key").autocomplete({
		source: "search.php",
		minLength: 2
	});
});

一看就明白,调用autocomplete插件,数据源来自search.php,当用户输入1个字符的时候就调用数据源。autocomplte插件提供了几个可配置的参数:

disabled:是否在页面加载后不可用,默认为false,这个没必要设置成true,没有多大意义。

appendTo:输入时下拉的提示框追加元素,默认为"body"。

autoFocus:默认为false,当设置成true时,下拉提示框第一个将会是被选中的状态。

delay:加载数据时的延迟时间,默认为300,单位毫秒。

minLength:输入多少个字符时就会出现下拉提示,默认为1。

position:定义下拉提示框的位置。

source:定义数据源,数据源必须是json形式的,本例是通过请求search.php获取的数据源。

autocomplete还提供了许多事件和方法,详情请查看其官网:http://jqueryui.com/demos/autocomplete

PHP

调用了autocomplete插件后,还并没有提示效果,别着急,因为需要调用数据源。

首先我们需要一张表,并要往表中添加适量数据,表的结构如下:

CREATE TABLE `art` (
  `id` int(11) NOT NULL auto_increment,
  `title` varchar(100) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 ;

请自行建表,并往表art中添加数据。

search.php实现了连接Mysql数据库,并根据前端用户的输入,查询并获取数据表中相匹配的内容,然后以JSON形式输出。

include_once("connect.php"); //连接数据库

$q = strtolower($_GET["term"]); //获取用户输入的内容
$query=mysql_query("select * from art where title like '$q%' limit 0,10");
//查询数据库,并将结果集组成数组
while ($row=mysql_fetch_array($query)) {
	$result[] = array(
		'id' => $row['id'],
		'label' => $row['title']
	);
}
echo json_encode($result);  //输出JSON数据

最后输出的JSON数据格式为:

[{"id":"3","title":"\u4f7f\u7528CSS\u548cjQuery\u5236\u4f5c\u6f02\u4eae\u7684\u4e0b
\u62c9\u9009\u9879\u83dc\u5355"},
{"id":"4","title":"\u4f7f\u7528jQuery\u548cCSS\u63a7\u5236\u9875\u9762\u6253\u5370
\u533a\u57df"}]

这时,再测试下输入,是不是看到你要的效果了呢?

最后,值得一提的是,autocomplete插件在firefox上有一个输入BUG,输入后并不能提示,需要向前空格再退格才有提示。网上有很多同学给出了解决方案,但是目前最新的autocomplete插件代码貌视进行了重构,我的解决方法是,在133行中加入如下代码:

.bind("input.autocomplete",function(){
	//修复FF不支持中文bug
	self.search(self.item);
});

好,到此本例讲解已经完成,helloweba.net将继续为各位在路上的同学提供优质、实用的前后端应用方面的文章,敬请关注。

声明:本文为原创文章,helloweba.net和作者拥有版权,如需转载,请注明来源于helloweba.net并保留原文链接:https://www.helloweba.net/javascript/145.html

19条评论

  • 你要和楼主用一个版本 jq min 1.7,2

  • 修改了js版本 没用啊

  • 兄弟,这个问题 我找到了 是jq版本的问题 楼主这里用的是1.7,2 而我用的是1.10.2 出现的问题和你一样,我改了css也不管用,替换下就好了 !

  • 求助楼主,同一个网页有2个以上输入框时,只有第一个输入框有自动提示,这是为什么?我两个输入框的type和id都是一样的。

  • 为什么我搜索出来的显示 .undefined
    但是JSON有返回数据

  • http://www.helloweba.com/demo/css/main.css

  • main.css,是哪个?楼主

  • 为什毛我这里啥都没显示?看控制台ajax是提交了,也收到返回值了。。

  • 搞好了 谢谢

  • $q = strtolower($_GET["term"]); 我想问下 这个term在index.html里并没有提交这个输入的值啊

  • 中文可以支持的!我试过!

  • 你好,想问一下,我按照你的方法,为什么提示框不是在输入框正下方,而是跳到了屏幕左上方了!怎么也找不到解决办法!很奇怪!

  • 博主,你的DEMO为什么速度那么快!用的什么空间?我用sae有明显的卡顿啊

  • 呵呵[织]

  • 最好能输入开头字母就能把中文标题显示出来,但是还没有,这个功能已经很好了

  • 太棒了

  • 不用带参数,默认通过term传过去。
    不支持中文,可以把jquery-autocomplete.js 的ajax方法修改一下,type默认是get,换为post即可。

  • 不错~~~ 分享是好滴~

  • 1、请问当用户输入关键字或是擦掉重输,读取的频率很高会不会影响 2、我试了下,好象这个自动提示,当用户选中了某个值时,它不会跳转到相应的连接上 3、如果当用户选了这个值后,结果出现在input上,请问能像百度那样自动提交搜索吗