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

js封装:

/*
/// <reference path="jquery-autocomplete2.0.js" />
zhangs
20140516
*/
(function($) { $.fn.combox = function(options) {
var KEY = {
UP: 38,
DOWN: 40,
DEL: 46,
TAB: 9,
RETURN: 13, //回车
ESC: 27,
COMMA: 188,
PAGEUP: 33,
PAGEDOWN: 34,
BACKSPACE: 8
}; //默认属性
var defaults = {
hidvalueid: "combox_hid_value", //保存选中元素值的input的ID
boxwidth: "150px", //文本框宽度
url: "", //提交的页面/方法名,URL ="AsynHandler.ashx?ywtype=GetUserNameList"
param: null//要发送到服务端参数格式,主要是要动态取值的参数:[{ keyname: "catalog", keyvalue: "txtCata" }, { keyname: "cba", keyvalue: "txtCata2"},……]
};
var options = $.extend(defaults, options); //将传入的参数进行合并
var hidvalue = $("#" + defaults.hidvalueid); //选中的值 //实现功能
return this.each(function() {
var cb = $(this); //输入框<div id="searchresult" style="display: none;"/>
cb.width(defaults.boxwidth);
var id = cb.attr("id");
var searchresultdiv = $("<div id='" + id + "_searchresult' style='display: none;' />").insertAfter(cb);
searchresultdiv.addClass("searchresult").width(defaults.boxwidth); var strTmp = "";
if (defaults.url.indexOf("?") == -1) {
strTmp += "?";
} else {
strTmp += "&";
} cb.keyup(function(evt) {
changeCoords(); //控制查询结果div坐标
var k = window.event ? evt.keyCode : evt.which;
//输入框的id为txt_search,这里监听输入框的keyup事件
//不为空 && 不为上箭头或下箭头或回车
if (cb.val() != "" && k != KEY.UP && k != KEY.DOWN && k != KEY.RETURN) {
var strTmp2 = "";
//拼接传入的参数
if (defaults.param != null) {
$.each(defaults.param, function(i, item) {
if (typeof item.keyvalue != "string") {
alert("控件参数格式有错误,请检查");
return;
}
var value = $("#" + item.keyvalue).val();
if (value != "" || value != null) {
strTmp2 += item.keyname + "=" + escape(value) + "&";
}
}); } var sUrl = defaults.url + strTmp + strTmp2 + "key=" + escape(cb.val()) + "&rdnum=" + Math.random();
$.ajax({
type: 'GET',
async: false, //同步执行,不然会有问题
dataType: "json",
url: sUrl, //提交的页面/方法名
//data: , //参数(如果没有参数:null)
contentType: "application/json; charset=utf-8",
error: function(msg) {//请求失败处理函数
alert("数据加载失败");
},
success: function(data) { //请求成功后处理函数。
showlist(data);
}
});
}
else if (k == KEY.UP) {//上箭头
$('#' + id + '_combox_table tr.combox-hover').prev().addClass("combox-hover").width(defaults.boxwidth);
$('#' + id + '_combox_table tr.combox-hover').next().removeClass("combox-hover");
var tr_box_hover = $('#' + id + '_combox_table tr.combox-hover');
if (tr_box_hover.position() != undefined) {
if (tr_box_hover.position().top < 0) {
//向上滚动遮住的部分+本身的高度+padding高度
searchresultdiv.scrollTop(searchresultdiv.scrollTop() - (tr_box_hover.height() - tr_box_hover.position().top + 4));
}
cb.val($('#' + id + '_combox_table tr.combox-hover').text());
hidvalue.val($('#' + id + '_combox_table tr.combox-hover td').attr("value"));
}
} else if (k == KEY.DOWN) {//下箭头
if ($('#' + id + '_combox_table tr.combox-hover').size() == 0) {
$(".combox-line:first").addClass("combox-hover").width(defaults.boxwidth); //若无选中的,则选中第一个
} else {
$('#' + id + '_combox_table tr.combox-hover').next().addClass("combox-hover").width(defaults.boxwidth);
$('#' + id + '_combox_table tr.combox-hover').prev().removeClass("combox-hover");
var tr_box_hover = $('#' + id + '_combox_table tr.combox-hover');
if (tr_box_hover.position().top + tr_box_hover.height() > searchresultdiv.height()) {
//向下滚动遮住的部分+本身高度+padding高度
searchresultdiv.scrollTop(searchresultdiv.scrollTop() + tr_box_hover.height() + (tr_box_hover.position().top + tr_box_hover.height()) - searchresultdiv.height() + 4);
}
}
cb.val($('#' + id + '_combox_table tr.combox-hover').text());
hidvalue.val($('#' + id + '_combox_table tr.combox-hover td').attr("value"));
}
else if (k == KEY.RETURN) {//回车
if ($('#' + id + '_combox_table tr.combox-hover').text() != "") {
cb.val($('#' + id + '_combox_table tr.combox-hover').text());
hidvalue.val($('#' + id + '_combox_table tr.combox-hover td').attr("value"));
}
searchresultdiv.empty();
searchresultdiv.css("display", "none");
}
else {
searchresultdiv.empty();
hidvalue.val(""); //为空时,值也为空
searchresultdiv.css("display", "none");
}
});
searchresultdiv.bind("mouseleave", function() {
searchresultdiv.empty();
searchresultdiv.css("display", "none");
}); //根据data生成下拉列表
function showlist(data) {
if (data == "false") {
return;
}
if (data.length > 0) {
var layer = "";
layer = "<table id='" + id + "_combox_table'>";
$.each(data, function(idx, item) {
layer += "<tr class='combox-line' style='width:" + defaults.boxwidth + "'><td style='width:" + defaults.boxwidth + "' value='" + item.Value + "'>" + item.Name + "</td></tr>";
});
layer += "</table>"; //将结果添加到div中
searchresultdiv.empty();
searchresultdiv.append(layer);
//$(".combox-line:first").addClass("combox-hover"); //初始化时不能显示,此时回车不会选中第一个
searchresultdiv.css("display", "");
//鼠标移动事件
$(".combox-line").hover(function() {
$(".combox-line").removeClass("combox-hover");
$(this).addClass("combox-hover").width(defaults.boxwidth);
}, function() {
$(this).removeClass("combox-hover");
//searchresultdiv.css("display", "none");
});
//鼠标点击事件
$(".combox-line").click(function() {
cb.val($(this).text());
hidvalue.val($(this).children()[0].value);
searchresultdiv.css("display", "none");
});
} else {
searchresultdiv.empty();
searchresultdiv.css("display", "none");
}
} //设置查询结果div坐标
function changeCoords() {
var left = cb.position().left; //获取距离最左端的距离,像素,整型
var top = cb.position().top + 20; ; //获取距离最顶端的距离,像素,整型(20为搜索输入框的高度)
searchresultdiv.css("left", left + "px"); //重新定义CSS属性
searchresultdiv.css("top", top + "px"); //同上
}
return cb;
}); };
})(jQuery);

对应css

 .searchresult
{
max-height:200px;
position: absolute;
z-index:;
overflow: auto;
left: 130px;
top: 71px;
background: #E0E0E0;
border-top: none;
}
.combox-line
{
font-size: 12px;
background: #E0E0E0;
padding: 2px;
}
.combox-hover
{
background: #007ab8;
color: #fff;
}

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

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

form表单:

<form id="form1" runat="server">
<div style="width:300px">
智能模糊查询提示
<input id="txt_search" type="text" runat="server" />
<input id="hidselvalue" type="hidden" runat="server" />
</div>
</form>

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

异步页面AsynHandler.ashx:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
using System.Text;
using System.Data; namespace WebApp
{
/// <summary>
/// $codebehindclassname$ 的摘要说明
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class AsynHandler : IHttpHandler
{
public bool IsReusable
{
get
{
return false;
}
} /// <summary>
/// post方法接收数据
/// </summary>
/// <param name="context">HttpContext</param>
public string getPostStr(HttpContext context)
{
Int32 intLen = Convert.ToInt32(context.Request.InputStream.Length);
byte[] b = new byte[intLen];
context.Request.InputStream.Read(b, , intLen);
return System.Text.Encoding.UTF8.GetString(b);
} public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/plain";
string ywtype = context.Request["ywtype"];
string strReturn = String.Empty; //返回值
switch (ywtype)
{
case "GetUserNameList":
strReturn = GetUserNameList(context);
break;
default:
strReturn = "false";
break;
} context.Response.Write(strReturn);
} private string GetUserNameList(HttpContext context)
{
StringBuilder returnStr = new StringBuilder();
string userName = context.Request["key"];
userName = HttpUtility.UrlDecode(userName);
List<ConboxItem> conboxlist = new List<ConboxItem>();
ConboxItem item = new ConboxItem("政治", "zz");
conboxlist.Add(item);
item = new ConboxItem("acb", "zz");
conboxlist.Add(item);
item = new ConboxItem("语言", "yy");
conboxlist.Add(item);
item = new ConboxItem("三个", "sg");
conboxlist.Add(item);
item = new ConboxItem("数据", "sj");
conboxlist.Add(item);
item = new ConboxItem("英文", "yw");
conboxlist.Add(item);
item = new ConboxItem("a", "yw");
conboxlist.Add(item);
item = new ConboxItem("acb1", "zz1");
conboxlist.Add(item);
item = new ConboxItem("a", "yw");
conboxlist.Add(item);
item = new ConboxItem("acb1", "zz1");
conboxlist.Add(item);
item = new ConboxItem("a", "yw");
conboxlist.Add(item);
item = new ConboxItem("acb1", "zz1");
conboxlist.Add(item);
item = new ConboxItem("a", "yw");
conboxlist.Add(item);
item = new ConboxItem("acb1", "zz1");
conboxlist.Add(item);
item = new ConboxItem("a", "yw");
conboxlist.Add(item);
item = new ConboxItem("acb1", "zz1");
conboxlist.Add(item);
item = new ConboxItem("语言1", "yy1");
conboxlist.Add(item);
item = new ConboxItem("三个1", "sg1");
conboxlist.Add(item);
item = new ConboxItem("数据1", "sj1");
conboxlist.Add(item);
item = new ConboxItem("英文1", "yw2");
conboxlist.Add(item);
item = new ConboxItem("a1", "yw1");
conboxlist.Add(item); List<ConboxItem> resultlist = conboxlist.Where(p => p.Name.Contains(userName)).ToList(); if (resultlist.Count > )
{
returnStr.Append(ToJson(resultlist));
return returnStr.ToString();
}
else
{
item = new ConboxItem("未查询到记录!", "");
resultlist.Add(item);
return ToJson(resultlist);
} } #region List转换成Json格式
/// <summary>
/// List转换成Json格式
/// </summary>
/// <param name="dt"></param>
/// <returns></returns>
public static string ToJson(List<ConboxItem> conboxlist)
{
StringBuilder jsonBuilder = new StringBuilder(); jsonBuilder.Append("[");
for (int i = ; i < conboxlist.Count; i++)
{
jsonBuilder.Append("{"); jsonBuilder.Append("\"");
jsonBuilder.Append("Name");
jsonBuilder.Append("\":\"");
jsonBuilder.Append(conboxlist[i].Name);
jsonBuilder.Append("\","); jsonBuilder.Append("\"");
jsonBuilder.Append("Value");
jsonBuilder.Append("\":\"");
jsonBuilder.Append(conboxlist[i].Value);
jsonBuilder.Append("\","); jsonBuilder.Remove(jsonBuilder.Length - , );
jsonBuilder.Append("},");
}
jsonBuilder.Remove(jsonBuilder.Length - , );
jsonBuilder.Append("]");
return jsonBuilder.ToString();
}
#endregion
#region dataTable转换成Json格式
/// <summary>
/// dataTable转换成Json格式
/// </summary>
/// <param name="dt"></param>
/// <returns></returns>
public static string ToJson(DataTable dt)
{
StringBuilder jsonBuilder = new StringBuilder(); jsonBuilder.Append("[");
for (int i = ; i < dt.Rows.Count; i++)
{
jsonBuilder.Append("{");
for (int j = ; j < dt.Columns.Count; j++)
{
jsonBuilder.Append("\"");
jsonBuilder.Append(dt.Columns[j].ColumnName);
jsonBuilder.Append("\":\"");
jsonBuilder.Append(dt.Rows[i][j].ToString());
jsonBuilder.Append("\",");
}
jsonBuilder.Remove(jsonBuilder.Length - , );
jsonBuilder.Append("},");
}
jsonBuilder.Remove(jsonBuilder.Length - , );
jsonBuilder.Append("]");
return jsonBuilder.ToString();
}
#endregion public class ConboxItem
{
public string Name { get; set; }
public string Value { get; set; }
public ConboxItem(string Name, string Value)
{
this.Name = Name;
this.Value = Value;
}
}
}
}

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. Visual Studio 2015 如何将全英界面转成中文

    1 启动VS2015程序,在菜单栏中找到tools 2 在弹出的下拉窗口中选中options 3 此时弹出的对话框,选中Environment下的international setting 4 点击获 ...

  2. IIS Community Newsletter June 2013

    Announcements Windows 2012 Server R2 preview released Windows Server 2012 R2 provides a wide range o ...

  3. HTML和CSS经典布局1

    如下图: 需求: 1. 如图 2. 可以从body标签开始. <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xht ...

  4. 剑指Offer面试题:14.链表的倒数第k个节点

    PS:这是一道出境率极高的题目,记得去年参加校园招聘时我看到了3次,但是每次写的都不完善. 一.题目:链表的倒数第k个节点 题目:输入一个链表,输出该链表中倒数第k个结点.为了符合大多数人的习惯,本题 ...

  5. Hadoop学习笔记—20.网站日志分析项目案例(三)统计分析

    网站日志分析项目案例(一)项目介绍:http://www.cnblogs.com/edisonchou/p/4449082.html 网站日志分析项目案例(二)数据清洗:http://www.cnbl ...

  6. 如何理解T-SQL中Merge语句

    写在前面的话:之前看过Merge语句,感觉没什么用,完全可以用其他的方式来替代,最近又看了看Merge语句,确实挺好用,可以少写很多代码,看起来也很紧凑,当然也有别的优点. ====正文开始===== ...

  7. 【玩转单片机系列002】 如何使用STM32提供的DSP库进行FFT

    前些日子,因为需要在STM32F103系列处理器上,对采集的音频信号进行FFT,所以花了一些时间来研究如何高效并精确的在STM32F103系列处理器上实现FFT.在网上找了很多这方面的资料做实验并进行 ...

  8. VVDocumenter 使用

    函数说明文档插件下载链接 https://github.com/onevcat/VVDocumenter-Xcode 下载后,直接运行项目 升级Xcode后可能不能再次使用,需要做一些处理从Xcode ...

  9. Python格式化输出

    今天写程序又记不清格式化输出细节了……= =索性整理一下. python print格式化输出. 1. 打印字符串 print ("His name is %s"%("A ...

  10. 循序渐进,了解Hive是什么!

    一直想抽个时间整理下最近的所学,断断续续接触hive也有半个多月了,大体上了解了很多Hive相关的知识.那么,一般对陌生事物的认知都会经历下面几个阶段: 为什么会出现?解决了什么问题? 如何搭建?如何 ...