插件根据实际需要在单功能上封装的,实现传入后台数据地址,要保存值的input,前台要传入的参数(过滤条件),来返回下拉提示数据,数据过多可上下滚动选择,选择后显示文本与对应的值,供后台操作,如图:

js封装:

  1. /*
  2. /// <reference path="jquery-autocomplete2.0.js" />
  3. zhangs
  4. 20140516
  5. */
  6. (function($) {
  7.  
  8. $.fn.combox = function(options) {
  9. var KEY = {
  10. UP: 38,
  11. DOWN: 40,
  12. DEL: 46,
  13. TAB: 9,
  14. RETURN: 13, //回车
  15. ESC: 27,
  16. COMMA: 188,
  17. PAGEUP: 33,
  18. PAGEDOWN: 34,
  19. BACKSPACE: 8
  20. };
  21.  
  22. //默认属性
  23. var defaults = {
  24. hidvalueid: "combox_hid_value", //保存选中元素值的input的ID
  25. boxwidth: "150px", //文本框宽度
  26. url: "", //提交的页面/方法名,URL ="AsynHandler.ashx?ywtype=GetUserNameList"
  27. param: null//要发送到服务端参数格式,主要是要动态取值的参数:[{ keyname: "catalog", keyvalue: "txtCata" }, { keyname: "cba", keyvalue: "txtCata2"},……]
  28. };
  29. var options = $.extend(defaults, options); //将传入的参数进行合并
  30. var hidvalue = $("#" + defaults.hidvalueid); //选中的值
  31.  
  32. //实现功能
  33. return this.each(function() {
  34. var cb = $(this); //输入框<div id="searchresult" style="display: none;"/>
  35. cb.width(defaults.boxwidth);
  36. var id = cb.attr("id");
  37. var searchresultdiv = $("<div id='" + id + "_searchresult' style='display: none;' />").insertAfter(cb);
  38. searchresultdiv.addClass("searchresult").width(defaults.boxwidth);
  39.  
  40. var strTmp = "";
  41. if (defaults.url.indexOf("?") == -1) {
  42. strTmp += "?";
  43. } else {
  44. strTmp += "&";
  45. }
  46.  
  47. cb.keyup(function(evt) {
  48. changeCoords(); //控制查询结果div坐标
  49. var k = window.event ? evt.keyCode : evt.which;
  50. //输入框的id为txt_search,这里监听输入框的keyup事件
  51. //不为空 && 不为上箭头或下箭头或回车
  52. if (cb.val() != "" && k != KEY.UP && k != KEY.DOWN && k != KEY.RETURN) {
  53. var strTmp2 = "";
  54. //拼接传入的参数
  55. if (defaults.param != null) {
  56. $.each(defaults.param, function(i, item) {
  57. if (typeof item.keyvalue != "string") {
  58. alert("控件参数格式有错误,请检查");
  59. return;
  60. }
  61. var value = $("#" + item.keyvalue).val();
  62. if (value != "" || value != null) {
  63. strTmp2 += item.keyname + "=" + escape(value) + "&";
  64. }
  65. });
  66.  
  67. }
  68.  
  69. var sUrl = defaults.url + strTmp + strTmp2 + "key=" + escape(cb.val()) + "&rdnum=" + Math.random();
  70. $.ajax({
  71. type: 'GET',
  72. async: false, //同步执行,不然会有问题
  73. dataType: "json",
  74. url: sUrl, //提交的页面/方法名
  75. //data: , //参数(如果没有参数:null)
  76. contentType: "application/json; charset=utf-8",
  77. error: function(msg) {//请求失败处理函数
  78. alert("数据加载失败");
  79. },
  80. success: function(data) { //请求成功后处理函数。
  81. showlist(data);
  82. }
  83. });
  84. }
  85. else if (k == KEY.UP) {//上箭头
  86. $('#' + id + '_combox_table tr.combox-hover').prev().addClass("combox-hover").width(defaults.boxwidth);
  87. $('#' + id + '_combox_table tr.combox-hover').next().removeClass("combox-hover");
  88. var tr_box_hover = $('#' + id + '_combox_table tr.combox-hover');
  89. if (tr_box_hover.position() != undefined) {
  90. if (tr_box_hover.position().top < 0) {
  91. //向上滚动遮住的部分+本身的高度+padding高度
  92. searchresultdiv.scrollTop(searchresultdiv.scrollTop() - (tr_box_hover.height() - tr_box_hover.position().top + 4));
  93. }
  94. cb.val($('#' + id + '_combox_table tr.combox-hover').text());
  95. hidvalue.val($('#' + id + '_combox_table tr.combox-hover td').attr("value"));
  96. }
  97. } else if (k == KEY.DOWN) {//下箭头
  98. if ($('#' + id + '_combox_table tr.combox-hover').size() == 0) {
  99. $(".combox-line:first").addClass("combox-hover").width(defaults.boxwidth); //若无选中的,则选中第一个
  100. } else {
  101. $('#' + id + '_combox_table tr.combox-hover').next().addClass("combox-hover").width(defaults.boxwidth);
  102. $('#' + id + '_combox_table tr.combox-hover').prev().removeClass("combox-hover");
  103. var tr_box_hover = $('#' + id + '_combox_table tr.combox-hover');
  104. if (tr_box_hover.position().top + tr_box_hover.height() > searchresultdiv.height()) {
  105. //向下滚动遮住的部分+本身高度+padding高度
  106. searchresultdiv.scrollTop(searchresultdiv.scrollTop() + tr_box_hover.height() + (tr_box_hover.position().top + tr_box_hover.height()) - searchresultdiv.height() + 4);
  107. }
  108. }
  109. cb.val($('#' + id + '_combox_table tr.combox-hover').text());
  110. hidvalue.val($('#' + id + '_combox_table tr.combox-hover td').attr("value"));
  111. }
  112. else if (k == KEY.RETURN) {//回车
  113. if ($('#' + id + '_combox_table tr.combox-hover').text() != "") {
  114. cb.val($('#' + id + '_combox_table tr.combox-hover').text());
  115. hidvalue.val($('#' + id + '_combox_table tr.combox-hover td').attr("value"));
  116. }
  117. searchresultdiv.empty();
  118. searchresultdiv.css("display", "none");
  119. }
  120. else {
  121. searchresultdiv.empty();
  122. hidvalue.val(""); //为空时,值也为空
  123. searchresultdiv.css("display", "none");
  124. }
  125. });
  126. searchresultdiv.bind("mouseleave", function() {
  127. searchresultdiv.empty();
  128. searchresultdiv.css("display", "none");
  129. });
  130.  
  131. //根据data生成下拉列表
  132. function showlist(data) {
  133. if (data == "false") {
  134. return;
  135. }
  136. if (data.length > 0) {
  137. var layer = "";
  138. layer = "<table id='" + id + "_combox_table'>";
  139. $.each(data, function(idx, item) {
  140. layer += "<tr class='combox-line' style='width:" + defaults.boxwidth + "'><td style='width:" + defaults.boxwidth + "' value='" + item.Value + "'>" + item.Name + "</td></tr>";
  141. });
  142. layer += "</table>";
  143.  
  144. //将结果添加到div中
  145. searchresultdiv.empty();
  146. searchresultdiv.append(layer);
  147. //$(".combox-line:first").addClass("combox-hover"); //初始化时不能显示,此时回车不会选中第一个
  148. searchresultdiv.css("display", "");
  149. //鼠标移动事件
  150. $(".combox-line").hover(function() {
  151. $(".combox-line").removeClass("combox-hover");
  152. $(this).addClass("combox-hover").width(defaults.boxwidth);
  153. }, function() {
  154. $(this).removeClass("combox-hover");
  155. //searchresultdiv.css("display", "none");
  156. });
  157. //鼠标点击事件
  158. $(".combox-line").click(function() {
  159. cb.val($(this).text());
  160. hidvalue.val($(this).children()[0].value);
  161. searchresultdiv.css("display", "none");
  162. });
  163. } else {
  164. searchresultdiv.empty();
  165. searchresultdiv.css("display", "none");
  166. }
  167. }
  168.  
  169. //设置查询结果div坐标
  170. function changeCoords() {
  171. var left = cb.position().left; //获取距离最左端的距离,像素,整型
  172. var top = cb.position().top + 20; ; //获取距离最顶端的距离,像素,整型(20为搜索输入框的高度)
  173. searchresultdiv.css("left", left + "px"); //重新定义CSS属性
  174. searchresultdiv.css("top", top + "px"); //同上
  175. }
  176. return cb;
  177. });
  178.  
  179. };
  180. })(jQuery);

对应css

  1. .searchresult
  2. {
  3. max-height:200px;
  4. position: absolute;
  5. z-index:;
  6. overflow: auto;
  7. left: 130px;
  8. top: 71px;
  9. background: #E0E0E0;
  10. border-top: none;
  11. }
  12. .combox-line
  13. {
  14. font-size: 12px;
  15. background: #E0E0E0;
  16. padding: 2px;
  17. }
  18. .combox-hover
  19. {
  20. background: #007ab8;
  21. color: #fff;
  22. }

前台引用这两个文件后调用,这里要注意的是param参数,如果有其它控件要控制此提示框内容过滤条件,则将对应名与控件id传入,如下类别名catalog,对应txtCata控件,多个可按此格式传入,后台会通过context.Request["catalog"]取到txtCata的值,若有文本作为过滤条件,直接拼接在url中:

  1. <link href="style/jquery-autocomplete2.0.css" rel="stylesheet" type="text/css" />
  2. <script src="scripts/jquery-1.6.2.min.js" type="text/javascript"></script>
  3. <script src="scripts/jquery-autocomplete2.0.js" type="text/javascript"></script>
  4. <script type="text/javascript">
  5. $(function() {
  6.  
  7. var strurl = "AsynHandler.ashx?ywtype=GetUserNameList";
  8. $("#txt_search").combox({ hidvalueid: "hidselvalue",boxwidth:"150px", url: strurl, param: [{ keyname: "catalog", keyvalue: "txtCata" }, { keyname: "cba", keyvalue: "txtCata1"}] });
  9. $("#form1").keydown(function() {
  10. //防止选中后回车提交表单
  11. return (event.keyCode != 13);
  12. });
  13. });
  14. </script>

form表单:

  1. <form id="form1" runat="server">
  2. <div style="width:300px">
  3. 智能模糊查询提示
  4. <input id="txt_search" type="text" runat="server" />
  5. <input id="hidselvalue" type="hidden" runat="server" />
  6. </div>
  7. </form>

其中txt_search为要显示内容的input,hidselvalue为要保存选中值,在后台可用hidselvalue.Value来取得(因为要在后台取值,所以没有封装进去,主要用于NET后台)

异步页面AsynHandler.ashx:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5. using System.Web.Services;
  6. using System.Text;
  7. using System.Data;
  8.  
  9. namespace WebApp
  10. {
  11. /// <summary>
  12. /// $codebehindclassname$ 的摘要说明
  13. /// </summary>
  14. [WebService(Namespace = "http://tempuri.org/")]
  15. [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
  16. public class AsynHandler : IHttpHandler
  17. {
  18. public bool IsReusable
  19. {
  20. get
  21. {
  22. return false;
  23. }
  24. }
  25.  
  26. /// <summary>
  27. /// post方法接收数据
  28. /// </summary>
  29. /// <param name="context">HttpContext</param>
  30. public string getPostStr(HttpContext context)
  31. {
  32. Int32 intLen = Convert.ToInt32(context.Request.InputStream.Length);
  33. byte[] b = new byte[intLen];
  34. context.Request.InputStream.Read(b, , intLen);
  35. return System.Text.Encoding.UTF8.GetString(b);
  36. }
  37.  
  38. public void ProcessRequest(HttpContext context)
  39. {
  40. context.Response.ContentType = "text/plain";
  41. string ywtype = context.Request["ywtype"];
  42. string strReturn = String.Empty; //返回值
  43. switch (ywtype)
  44. {
  45. case "GetUserNameList":
  46. strReturn = GetUserNameList(context);
  47. break;
  48. default:
  49. strReturn = "false";
  50. break;
  51. }
  52.  
  53. context.Response.Write(strReturn);
  54. }
  55.  
  56. private string GetUserNameList(HttpContext context)
  57. {
  58. StringBuilder returnStr = new StringBuilder();
  59. string userName = context.Request["key"];
  60. userName = HttpUtility.UrlDecode(userName);
  61. List<ConboxItem> conboxlist = new List<ConboxItem>();
  62. ConboxItem item = new ConboxItem("政治", "zz");
  63. conboxlist.Add(item);
  64. item = new ConboxItem("acb", "zz");
  65. conboxlist.Add(item);
  66. item = new ConboxItem("语言", "yy");
  67. conboxlist.Add(item);
  68. item = new ConboxItem("三个", "sg");
  69. conboxlist.Add(item);
  70. item = new ConboxItem("数据", "sj");
  71. conboxlist.Add(item);
  72. item = new ConboxItem("英文", "yw");
  73. conboxlist.Add(item);
  74. item = new ConboxItem("a", "yw");
  75. conboxlist.Add(item);
  76. item = new ConboxItem("acb1", "zz1");
  77. conboxlist.Add(item);
  78. item = new ConboxItem("a", "yw");
  79. conboxlist.Add(item);
  80. item = new ConboxItem("acb1", "zz1");
  81. conboxlist.Add(item);
  82. item = new ConboxItem("a", "yw");
  83. conboxlist.Add(item);
  84. item = new ConboxItem("acb1", "zz1");
  85. conboxlist.Add(item);
  86. item = new ConboxItem("a", "yw");
  87. conboxlist.Add(item);
  88. item = new ConboxItem("acb1", "zz1");
  89. conboxlist.Add(item);
  90. item = new ConboxItem("a", "yw");
  91. conboxlist.Add(item);
  92. item = new ConboxItem("acb1", "zz1");
  93. conboxlist.Add(item);
  94. item = new ConboxItem("语言1", "yy1");
  95. conboxlist.Add(item);
  96. item = new ConboxItem("三个1", "sg1");
  97. conboxlist.Add(item);
  98. item = new ConboxItem("数据1", "sj1");
  99. conboxlist.Add(item);
  100. item = new ConboxItem("英文1", "yw2");
  101. conboxlist.Add(item);
  102. item = new ConboxItem("a1", "yw1");
  103. conboxlist.Add(item);
  104.  
  105. List<ConboxItem> resultlist = conboxlist.Where(p => p.Name.Contains(userName)).ToList();
  106.  
  107. if (resultlist.Count > )
  108. {
  109. returnStr.Append(ToJson(resultlist));
  110. return returnStr.ToString();
  111. }
  112. else
  113. {
  114. item = new ConboxItem("未查询到记录!", "");
  115. resultlist.Add(item);
  116. return ToJson(resultlist);
  117. }
  118.  
  119. }
  120.  
  121. #region List转换成Json格式
  122. /// <summary>
  123. /// List转换成Json格式
  124. /// </summary>
  125. /// <param name="dt"></param>
  126. /// <returns></returns>
  127. public static string ToJson(List<ConboxItem> conboxlist)
  128. {
  129. StringBuilder jsonBuilder = new StringBuilder();
  130.  
  131. jsonBuilder.Append("[");
  132. for (int i = ; i < conboxlist.Count; i++)
  133. {
  134. jsonBuilder.Append("{");
  135.  
  136. jsonBuilder.Append("\"");
  137. jsonBuilder.Append("Name");
  138. jsonBuilder.Append("\":\"");
  139. jsonBuilder.Append(conboxlist[i].Name);
  140. jsonBuilder.Append("\",");
  141.  
  142. jsonBuilder.Append("\"");
  143. jsonBuilder.Append("Value");
  144. jsonBuilder.Append("\":\"");
  145. jsonBuilder.Append(conboxlist[i].Value);
  146. jsonBuilder.Append("\",");
  147.  
  148. jsonBuilder.Remove(jsonBuilder.Length - , );
  149. jsonBuilder.Append("},");
  150. }
  151. jsonBuilder.Remove(jsonBuilder.Length - , );
  152. jsonBuilder.Append("]");
  153. return jsonBuilder.ToString();
  154. }
  155. #endregion
  156. #region dataTable转换成Json格式
  157. /// <summary>
  158. /// dataTable转换成Json格式
  159. /// </summary>
  160. /// <param name="dt"></param>
  161. /// <returns></returns>
  162. public static string ToJson(DataTable dt)
  163. {
  164. StringBuilder jsonBuilder = new StringBuilder();
  165.  
  166. jsonBuilder.Append("[");
  167. for (int i = ; i < dt.Rows.Count; i++)
  168. {
  169. jsonBuilder.Append("{");
  170. for (int j = ; j < dt.Columns.Count; j++)
  171. {
  172. jsonBuilder.Append("\"");
  173. jsonBuilder.Append(dt.Columns[j].ColumnName);
  174. jsonBuilder.Append("\":\"");
  175. jsonBuilder.Append(dt.Rows[i][j].ToString());
  176. jsonBuilder.Append("\",");
  177. }
  178. jsonBuilder.Remove(jsonBuilder.Length - , );
  179. jsonBuilder.Append("},");
  180. }
  181. jsonBuilder.Remove(jsonBuilder.Length - , );
  182. jsonBuilder.Append("]");
  183. return jsonBuilder.ToString();
  184. }
  185. #endregion
  186.  
  187. public class ConboxItem
  188. {
  189. public string Name { get; set; }
  190. public string Value { get; set; }
  191. public ConboxItem(string Name, string Value)
  192. {
  193. this.Name = Name;
  194. this.Value = Value;
  195. }
  196. }
  197. }
  198. }

jQuery打造智能提示插件的更多相关文章

  1. jQuery打造智能提示插件二(可编辑下拉框)

    在上一篇 jQuery打造智能提示插件 上改进,增加下拉按钮,修复点击下拉区域外不隐藏BUG 效果 下拉按钮素材: js封装,注意红色部分为BUG修复,然后传入boxwidth不带px: /* /// ...

  2. jquery的智能提示控件

    福利到~分享一个基于jquery的智能提示控件intellSeach.js   一.需求 我们经常会遇到[站内搜索]的需求,为了提高用户体验,我们希望能做到像百度那样的即时智能提示.例如:某公司人事管 ...

  3. Visual Studio 2012设置Jquery/Javascript智能提示

    Visual Studio 2012设置Jquery/Javascript智能提示 在Visual Studio 2008 Visual Studio 2010中微软已经开始支持jquery/java ...

  4. jQuery框架学习第十一天:实战jQuery表单验证及jQuery自动完成提示插件

    jQuery框架学习第一天:开始认识jQueryjQuery框架学习第二天:jQuery中万能的选择器jQuery框架学习第三天:如何管理jQuery包装集 jQuery框架学习第四天:使用jQuer ...

  5. 如何取消MSSQL自带智能提示步骤,使用第三方智能提示插件

    步骤1如下: [工具]——[选项]——[文本编辑器]——[Transact-SQL]——[IntelliSense]——[Transact-SQL IntelliSense 设置]——(取消选择)—— ...

  6. sqlserver 智能提示插件

    文章:SqlServer智能提示插件SQLPrompt 地址:https://blog.csdn.net/u013628152/article/details/83274478

  7. 福利到~分享一个基于jquery的智能提示控件intellSeach.js

    一.需求 我们经常会遇到[站内搜索]的需求,为了提高用户体验,我们希望能做到像百度那样的即时智能提示.例如:某公司人事管理系统,想搜索李XX,只要输入“李”,系统自然会提示一些姓李的员工,这样方便用户 ...

  8. 一个基于jquery的智能提示控件intellSeach.js

    一.需求 我们经常会遇到[站内搜索]的需求,为了提高用户体验,我们希望能做到像百度那样的即时智能提示.例如:某公司人事管理系统,想搜索李XX,只要输入“李”,系统自然会提示一些姓李的员工,这样方便用户 ...

  9. 让Visual Studio Code对jQuery支持智能提示!

    本人新手,对代码各种不熟悉,记不准确,总是打错,造成各种失误!! 其实这个方法应该适合大部分前端开发工具!! 园里子有前人写了一篇文章对智能提示的实现!不过很多新手看不懂吧. http://www.c ...

随机推荐

  1. 使用pip安装BeautifulSoup4模块

    1.测试是否安装了BeautifulSoup4模块 import bs4 print bs4 执行报错说明没有安装该模块 Traceback (most recent call last): File ...

  2. WPF整理-二进制资源和内容

    WPF中的Binary Resource(二进制资源)是相对于前面所说的Logical resource(逻辑资源)而说的,一般指Image.XML文件等. 注意:这里说的是Resource" ...

  3. WebServer+ADO+百万数据查询

    很简单的demo,查询速度快,易理解,废话不说  上demo 看完就明白了 源码地址:http://files.cnblogs.com/files/SpadeA/WebDemo.zip 这是关于Web ...

  4. java身份证验证

    import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; impor ...

  5. Nova PhoneGap框架 第四章 本地数据库

    我一直想把EntityFramework(简称EF)的那一套搬过来,应用于HTML5 SQLite. 幸运的是,我几乎做到了,有些功能无法完成的那是因为SQLite本身不支持.至少从现在已经完成的功能 ...

  6. MySQL5.7 新增配置

    1.log_timestamps 在5.7.2以后的版本中增加一个单独控制error log , general log,slow log的记录的时间,默认是UTC,需要配置成SYSTEM(本地时间) ...

  7. npm不是以管理身份运行遇到的问题

    环境:win10+npm3.10.5 问题:在npm install lodash时,出现下列错误("npm-debug.log"文件内容) 0 info it worked if ...

  8. java中 用telnet 判断服务器远程端口是否开启

    package net.jweb.common.util; import java.io.BufferedReader; import java.io.BufferedWriter; import j ...

  9. 我心中的核心组件(可插拔的AOP)~大话开篇及目录

    回到占占推荐博客索引 核心组件 我心中的核心组件,核心组件就是我认为在项目中比较常用的功能,如日志,异常处理,消息,邮件,队列服务,调度,缓存,持久化,分布式文件存储,NoSQL存储,IoC容器,方法 ...

  10. WPF datagrid 加入图片

    <DataGridTemplateColumn Header="图像" Width="SizeToCells"> <DataGridTempl ...