热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

抓取百度联想词配合jqueryautocomplete插件,轻松达到百度首页搜索自动提示效果。...

最近项目中很多文本框用需要用jquery-autocomplete插件做自动提示,以增强用户体验,但是出现的问题是,要很多自动显示的词&#

最近项目中很多文本框用需要用jquery-autocomplete插件做自动提示,以增强用户体验,但是出现的问题是,要很多自动显示的词,怎么办?

于是借助公司另外一个项目的经验(算是山寨吧!),干脆把百度首页的自动提示移植到项目中。

先贴效果,这是百度首页

这是demo效果

实现方式蛮简单的,用firebug获取文本框触发事件响应url就行了。

工具类代码如下

1 import java.io.IOException;
2 import java.io.InputStream;
3 import java.io.InputStreamReader;
4 import java.io.UnsupportedEncodingException;
5 import java.net.HttpURLConnection;
6 import java.net.MalformedURLException;
7 import java.net.URL;
8 import java.net.URLEncoder;
9 import java.util.ArrayList;
10 import java.util.List;
11 import java.util.regex.Matcher;
12 import java.util.regex.Pattern;
13 import net.sf.json.JSONArray;
14
15 public class BaiduSuggestionUtil {
16 /**
17 * 获取百度的联想词
18 *
19 * @param input
20 * 通过firebug获取请求url
21 *
23 * @return
24 */
25 public static final String BAIDU_HOST = "http://unionsug.baidu.com";
26 public static final String QUERY_PATH = "/su?wd=";
27 public static final String PARAMETER = "&cb=window.bdsug.sug&from=superpage&t=";
28 public static final String REFERER_HEADER = "Referer";
29 public static final String REFERER = "http://www.baidu.com/";
30 public static final String BAIDU_SUG_REG = "\"[\\s\\S]*?\"";
31 private InputStream in = null;
32 private InputStreamReader inr = null;
33 private HttpURLConnection conn = null;
34
35 public JSONArray getBaiduRelateWord(String input) {
36 String t = String.valueOf(System.currentTimeMillis());
37 String response = null;
38 List<BaiduSuggestionUtil> list &#61; new ArrayList<BaiduSuggestionUtil>();
39 try {
40 URL url &#61; new URL(BAIDU_HOST &#43; QUERY_PATH
41 &#43; URLEncoder.encode(input, "utf-8") &#43; PARAMETER &#43; t);
42 conn &#61; (HttpURLConnection) url.openConnection();
43 conn.setRequestProperty(REFERER_HEADER, REFERER);
44 in &#61; conn.getInputStream();
45 inr &#61; new InputStreamReader(in, "gbk");
46 int c &#61; 0;
47 StringBuffer sb &#61; new StringBuffer();
48 while ((c &#61; inr.read()) !&#61; -1) {
49 sb.append((char) c);
50 }
51 response &#61; sb.toString();
52 Pattern pattern &#61; Pattern.compile(BAIDU_SUG_REG);
53 Matcher m &#61; pattern.matcher(response);
54 while (m.find()) {
55 BaiduSuggestionUtil bd &#61; new BaiduSuggestionUtil();
56 bd.setName(m.group().replace("\"", ""));
57 if(!bd.getName().equals(input)){
58 list.add(bd);
59 System.out.println(m.group().replace("\"", ""));
60 }
61 }
62 } catch (MalformedURLException e) {
63 e.printStackTrace();
64 return null;
65 } catch (UnsupportedEncodingException e) {
66 e.printStackTrace();
67 return null;
68 } catch (IOException e) {
69 e.printStackTrace();
70 return null;
71 } finally {
72 try {
73 if (inr !&#61; null) {
74 inr.close();
75 }
76 if (in !&#61; null) {
77 in.close();
78 }
79 } catch (IOException e) {
80 e.printStackTrace();
81 return null;
82 }
83 }
84 JSONArray jsonArray &#61; JSONArray.fromObject(list);
85 return jsonArray;
86 }
87 public static void main(String args[]){
88 new BaiduSuggestionUtil().getBaiduRelateWord("zhongqiu");
89 }
90 /**
91 * 百度联想词
92 */
93 private String name;
94
95 public String getName() {
96 return name;
97 }
98
99 public void setName(String name) {
100 this.name &#61; name;
101 }
102 }

  用工具类返回一个json格式数据&#xff0c;然后再action中调用这个json就行了。

下面是action中代码

public String findSuggestioName(){
JSONArray jsonArray
&#61; baiduSuggestionUtil.getBaiduRelateWord(name);
String result
&#61; jsonArray.toString();
getResponse().setContentType(
"text/json;charset&#61;UTF-8");
try {
getResponse().getWriter().write(result);
}
catch (IOException e) {
e.printStackTrace();
}
return null;
}

 这是demo baidu.jsp

1 <HEAD>
2 <base target&#61;"_self">
3 <meta http-equiv&#61;"pragma" content&#61;"no-cache">
4 <meta http-equiv&#61;"cache-control" content&#61;"no-cache">
5 <meta http-equiv&#61;"expires" content&#61;"0">
6 <meta http-equiv&#61;"Content-Type" content&#61;"text/html; charset&#61;utf-8" />
7 <TITLE>百度联想词TITLE>
8 <link rel&#61;"icon" href&#61;"<%&#61;request.getContextPath()%>/favicon.ico" type&#61;"image/x-icon" />
9 <link rel&#61;"shortcut icon" href&#61;"<%&#61;request.getContextPath()%>/favicon.ico" type&#61;"image/x-icon" />
10 <link rel&#61;"stylesheet" type&#61;"text/css" href&#61;"<%&#61;request.getContextPath()%>/pages/js/autocomplete/jquery.autocomplete.css"/>
11 <script type&#61;"text/Javascript" src&#61;"<%&#61;request.getContextPath()%>/pub/js/jquery-1.4.2.min.js">script>
12 <script type&#61;"text/Javascript" src&#61;"<%&#61;request.getContextPath()%>/pages/js/autocomplete/jquery.autocomplete.js">script>
13 <script>
14 $(document).ready(function() {
15 $("#suggestionName").autocomplete(&#39;<%&#61;request.getContextPath() %>/findSuggestioName.action&#39;, {
16 matchContains: true,
17 minChars: 1,
18 extraParams: {name:function(){return $(&#39;#suggestionName&#39;).val();}},
19 dataType: "json",
20 mustMatch:false,
21 parse: function(data) {
22 return $.map(data, function(row) {
23 return {
24 data: row,
25 value: row.name,
26 result: row.name
27 }
28 });
29 },
30 formatItem: function(item) {
31 return item.name;
32 }
33 }).result(function(e, item) {
34 });
35 });
36
37 script>
38 HEAD>
39 <BODY>
40 <form name&#61;"siteform" action&#61;"" method&#61;"post" id&#61;"siteform">
41 <table width&#61;"100%" height&#61;"500" border&#61;"0" cellpadding&#61;"0" cellspacing&#61;"0">
42 <tr>
43 <td width&#61;"973" height&#61;"500" valign&#61;"top"><table border&#61;"0" cellpadding&#61;"0" cellspacing&#61;"0" class&#61;"section-content">
44
45 <tr>
46 <td valign&#61;"top"><table border&#61;0 align&#61;"center" cellpadding&#61;2 cellspacing&#61;1>
47 <TBODY>
48
49
50 <TR>
51 <TD align&#61;"right">百度联想词&#xff1a;TD>
52 <TD><input type&#61;"text" name&#61;"suggestionName" id&#61;"suggestionName"/>
53 TD>
54 TR>
55
56 TBODY>
57 TABLE>td>
58 tr>
59 table> td>
60 tr>
61 table>
62 form>
63 BODY>
64 HTML>

  需要用到的jar包&#xff0c;第一次来博客园,不知道怎么上传文件&#xff08;智商啊&#xff01;&#xff01;&#xff01;&#xff09;&#xff0c;就贴个图片吧&#xff01;

 

ps:jquery-autocomplete对支持火狐有点问题&#xff0c;就是在中文输入法中&#xff0c;需要多按一次键才有提示效果&#xff0c;这个bug已经解决,网上有就不贴了。

还有就是当你选中下拉列表某一行时&#xff0c;文本框不会显示你选中的那一行&#xff0c;这是jquery-autocomplete 一个bug&#xff0c;已经调好

解决办法:

只要在jquery.autocomplete.js moveSelect(step)方法第333行处添加一行代码即可

 input.value&#61;activeItem.text();

这是添加前的代码

1 function moveSelect(step) {
2 listItems.slice(active, active &#43; 1).removeClass(CLASSES.ACTIVE);
3 movePosition(step);
4 var activeItem &#61; listItems.slice(active, active &#43; 1).addClass(CLASSES.ACTIVE);
5 if(options.scroll) {
6 var offset &#61; 0;
7 listItems.slice(0, active).each(function() {
8 offset &#43;&#61; this.offsetHeight;
9 });
10 if((offset &#43; activeItem[0].offsetHeight - list.scrollTop()) > list[0].clientHeight) {
11 list.scrollTop(offset &#43; activeItem[0].offsetHeight - list.innerHeight());
12 } else if(offset < list.scrollTop()) {
13 list.scrollTop(offset);
14 }
15 }
16 };

这是添加后的代码

1 function moveSelect(step) {
2 listItems.slice(active, active &#43; 1).removeClass(CLASSES.ACTIVE);
3 movePosition(step);
4 var activeItem &#61; listItems.slice(active, active &#43; 1).addClass(CLASSES.ACTIVE);
5 input.value&#61;activeItem.text();
6 if(options.scroll) {
7 var offset &#61; 0;
8 listItems.slice(0, active).each(function() {
9 offset &#43;&#61; this.offsetHeight;
10 });
11 if((offset &#43; activeItem[0].offsetHeight - list.scrollTop()) > list[0].clientHeight) {
12 list.scrollTop(offset &#43; activeItem[0].offsetHeight - list.innerHeight());
13 } else if(offset < list.scrollTop()) {
14 list.scrollTop(offset);
15 }
16 }
17 };

这是最终的demo效果。选中某一行&#xff0c;文本框随之变化。

第一次写blog&#xff0c;记录下&#xff0c;坚持&#xff01;

 

 

 

 

 

转:https://www.cnblogs.com/montya/archive/2011/09/04/baidu.html



推荐阅读
  • oracle c3p0 dword 60,web_day10 dbcp c3p0 dbutils
    createdatabasemydbcharactersetutf8;alertdatabasemydbcharactersetutf8;1.自定义连接池为了不去经常创建连接和释放 ... [详细]
  • javascript分页类支持页码格式
    前端时间因为项目需要,要对一个产品下所有的附属图片进行分页显示,没考虑ajax一张张请求,所以干脆一次性全部把图片out,然 ... [详细]
  • 技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统
    技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统 ... [详细]
  • 本文详细介绍了在 Oracle 数据库中使用 MyBatis 实现增删改查操作的方法。针对查询操作,文章解释了如何通过创建字段映射来处理数据库字段风格与 Java 对象之间的差异,确保查询结果能够正确映射到持久层对象。此外,还探讨了插入、更新和删除操作的具体实现及其最佳实践,帮助开发者高效地管理和操作 Oracle 数据库中的数据。 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 在Ubuntu系统中安装Android SDK的详细步骤及解决“Failed to fetch URL https://dlssl.google.com/”错误的方法
    在Ubuntu 11.10 x64系统中安装Android SDK的详细步骤,包括配置环境变量和解决“Failed to fetch URL https://dlssl.google.com/”错误的方法。本文详细介绍了如何在该系统上顺利安装并配置Android SDK,确保开发环境的稳定性和高效性。此外,还提供了解决网络连接问题的实用技巧,帮助用户克服常见的安装障碍。 ... [详细]
  • 本文详细介绍了一种利用 ESP8266 01S 模块构建 Web 服务器的成功实践方案。通过具体的代码示例和详细的步骤说明,帮助读者快速掌握该模块的使用方法。在疫情期间,作者重新审视并研究了这一未被充分利用的模块,最终成功实现了 Web 服务器的功能。本文不仅提供了完整的代码实现,还涵盖了调试过程中遇到的常见问题及其解决方法,为初学者提供了宝贵的参考。 ... [详细]
  • Go 项目中数据库配置文件的优化与应用 ... [详细]
  • 利用Java开发功能完备的电话簿应用程序,支持添加、查询与删除操作
    本研究基于Java语言开发了一款功能全面的电话簿应用程序,实现了与数据库的高效连接。该应用不仅支持添加、查询和删除联系人信息,还具备输出最大和最小ID号的功能,并能够对用户输入的ID号进行有效性验证,确保数据的准确性和完整性。详细实现方法可参阅相关文档。 ... [详细]
  • 如何在Java中使用DButils类
    这期内容当中小编将会给大家带来有关如何在Java中使用DButils类,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。D ... [详细]
  • 如何使用 `org.apache.tomcat.websocket.server.WsServerContainer.findMapping()` 方法及其代码示例解析 ... [详细]
  • 深入探索HTTP协议的学习与实践
    在初次访问某个网站时,由于本地没有缓存,服务器会返回一个200状态码的响应,并在响应头中设置Etag和Last-Modified等缓存控制字段。这些字段用于后续请求时验证资源是否已更新,从而提高页面加载速度和减少带宽消耗。本文将深入探讨HTTP缓存机制及其在实际应用中的优化策略,帮助读者更好地理解和运用HTTP协议。 ... [详细]
  • 深入解析 Android 中 EditText 的 getLayoutParams 方法及其代码应用实例 ... [详细]
  • Python内置模块详解:正则表达式re模块的应用与解析
    正则表达式是一种强大的文本处理工具,通过特定的字符序列来定义搜索模式。本文详细介绍了Python内置的`re`模块,探讨了其在字符串匹配、验证和提取中的应用。例如,可以通过正则表达式验证电子邮件地址、电话号码、QQ号、密码、URL和IP地址等。此外,文章还深入解析了`re`模块的各种函数和方法,提供了丰富的示例代码,帮助读者更好地理解和使用这一工具。 ... [详细]
  • 本文深入探讨了 Python Watchdog 库的使用方法和应用场景。通过详细的代码示例,展示了如何利用 Watchdog 监控文件系统的变化,包括文件的创建、修改和删除等操作。文章不仅介绍了 Watchdog 的基本功能,还探讨了其在实际项目中的高级应用,如日志监控和自动化任务触发。读者将能够全面了解 Watchdog 的工作原理及其在不同场景下的应用技巧。 ... [详细]
author-avatar
汪健宜婉瑜
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有