jQuery Autocomplete简介_动力节点Java学院整理


Posted in jQuery onJuly 17, 2017

jQuery UI Autocomplete是jQuery UI的自动完成组件,是我用过的最强大、最灵活的Autocomplete,它支持本地的Array/JSON数组、通过ajax请求的Array/JSON数组、JSONP、以及Function(最灵活)等方式来获取数据。

支持的数据源

jQuery UI Autocomplete主要支持字符串Array、JSON两种数据格式。

普通的Array格式没有什么特殊的,如下:

["bjpowernode","动力节点","李四"]

对于JSON格式的Array,则要求有:label、value属性,如下:

[{label: "动力节点", value: "bjpowernode"}, {label: "李四", value: "李四"}]

其中label属性用于显示在autocomplete弹出菜单,而value属性则是选中后给文本框赋的值。

如果没有指定其中一个属性则用另一个属性替代(即value和label值一样),如下:

[{label: "bjpowernode"}, {label: "李四"}]
[{value: "bjpowernode"}, {value: "李四"}]

如果label和value都没有指定,则无法用于autocomplete的提示。

另外需要注意,对于从服务器端输出的JSON的key必须用双引号,如下:

[{"label": "动力节点", "value": "bjpowernode"}, {"label": "李四", "value": "李四"}]

否则可能会出现parsererror错误。

主要的参数

jQuery UI Autocomplete常用的参数有:

1.Source:用于指定数据来源,类型为String、Array、Function

  1. String:用于ajax请求的服务器端地址,返回Array/JSON格式
  2. Array:即字符串数组 或 JSON数组
  3. Function(request, response):通过request.term获得输入的值,response([Array])来呈现数据;(JSONP是这种方式)

2.minLength:当输入框内字符串长度达到minLength时,激活Autocomplete

3.autoFocus:当Autocomplete选择菜单弹出时,自动选中第一个

4.delay:即延迟多少毫秒激活Autocomplete

其他不常用的就不罗列了。

使用方法

假如页面上有以下输入框:

<input type="text" id="autocomp" />

AJAX请求
通过指定source为服务器端的地址来实现,如下:

$("#autocomp").autocomplete({
  source: "remote.ashx",
  minLength: 2
});

然后在服务器端接收,并输出相应结果,注意默认传递的参数名称为term:

public void ProcessRequest(HttpContext context) {   
// 查询的参数名称默认为term   
string query = context.Request.QueryString["term"];   
context.Response.ContentType = "text/javascript";   
//输出字符串数组 或者 JSON 数组   
context.Response.Write("[{\"label\":\"动力节点\",\"value\":\"bjpowernode\"},{\"label\":\"李四\",\"value\":\"李四\"}]"); }

本地Array/JSON数组

// 本地字符串数组
var availableTags = [
  "C#",
  "C++",
  "Java",
  "JavaScript",
  "ASP",
  "ASP.NET",
  "JSP",
  "PHP",
  "Python",
  "Ruby"
];
$("#local1").autocomplete({
  source: availableTags
});
// 本地json数组
var availableTagsJSON = [
  { label: "C# Language", value: "C#" },
  { label: "C++ Language", value: "C++" },
  { label: "Java Language", value: "Java" },
  { label: "JavaScript Language", value: "JavaScript" },
  { label: "ASP.NET", value: "ASP.NET" },
  { label: "JSP", value: "JSP" },
  { label: "PHP", value: "PHP" },
  { label: "Python", value: "Python" },
  { label: "Ruby", value: "Ruby" }
];
$("#local2").autocomplete({
  source: availableTagsJSON
});

Callback Function方式

通过指定source为自定义函数来实现自定义数据的获取,函数主要有2个参数(request,response),分别用于获取输入的值、呈现结果

本地Array方式获取数据(模仿新浪微博的登录)

var hosts = ["gmail.com", "live.com", "hotmail.com", "yahoo.com", "bjpowernode.com", "火星.com", "李四.com"];
$("#email1").autocomplete({
  autoFocus: true,
  source: function(request, response) {
    var term = request.term, //request.term为输入的字符串
      ix = term.indexOf("@"),
      name = term, // 用户名
      host = "", // 域名
      result = []; // 结果
 
    result.push(term);
    // result.push({ label: term, value: term }); // json格式
    if (ix > -1) {
      name = term.slice(0, ix);
      host = term.slice(ix + 1);
    }
    if (name) {
      var findedHosts = (host ? $.grep(hosts, function(value) {
        return value.indexOf(host) > -1;
      }) : hosts),
      findedResults = $.map(findedHosts, function(value) {
        return name + "@" + value; //返回字符串格式
        // return { label: name + " @ " + value, value: name + "@" + value }; // json格式
      });
      result = result.concat($.makeArray(findedResults));
    }
    response(result);//呈现结果
  }
});

JSONP方式获取数据

直接从官方DEMO拿来的,通过发送ajax请求到远程服务器,然后对返回结果进行处理,最后通过response来呈现:

$("#jsonp").autocomplete({
  source: function(request, response) {
    $.ajax({
      url: "http://ws.geonames.org/searchJSON",
      dataType: "jsonp",
      data: {
        featureClass: "P",
        style: "full",
        maxRows: 12,
        name_startsWith: request.term
      },
      success: function(data) {
        response($.map(data.geonames, function(item) {
          return {
            label: item.name + (item.adminName1 ? ", " + item.adminName1 : "") + ", " + item.countryName,
            value: item.name
          }
        }));
      }
    });
  },
  minLength: 2
});

主要的事件

jQuery UI Autocomplete有一些事件,可用于在一些阶段进行额外的控制:

1.create(event, ui):Autocomplete创建时,可以在此事件中,对外观进行一些控制

2.search(event, ui): 在开始请求之前,可以在此事件中返回false来取消请求

3.open(event, ui):Autocomplete的结果列表弹出时

4.focus(event, ui):Autocomplete的结果列表任意一项获得焦点时,ui.item为获得焦点的项

5.select(event, ui):Autocomplete的结果列表任意一项选中时,ui.item为选中的项

6.close(event, ui):Autocomplete的结果列表关闭时

7.change(event, ui):当值改变时,ui.item为选中的项

这些事件的ui参数的item属性(如果有的话)默认有label和value属性,不管在source中设置的数据是Array还是JSON数组,如下3种:

["bjpowernode","动力节点","李四"]
[{label: "动力节点", value: "bjpowernode"}, {label: "李四", value: "李四"}]
[{label: "动力节点", value: "bjpowernode", id: "1"}, {label: "李四", value: "李四", id: "2"}]

假如是第三种的话,还可以得到ui.item.id的值。

这些事件可以通过2种方式来绑定,如下:

// 在参数中
$("#autocomp").autocomplete({
  source: availableTags
  , select: function(e, ui) {
   alert(ui.item.value) 
  }
});
 
// 通过bind来绑定
$("#autocomp").bind("autocompleteselect", function(e, ui) {
  alert(ui.item.value);
});

通过bind来绑定的方式使用的事件名称为"autocomplete"+事件名称,如"select"就是"autocompleteselect"。

多个值的Autocomplete

一般情况下,输入框的autocomplete仅需要一个值就可以(如:javascript);假如需要多个值(如:javascript,c#,asp.net),则需要绑定一些事件来进行额外处理:

1.在focus事件中返回false,避免输入框的值被autocomplete的单个值取代

2.在select事件中组合多个值

3.在元素的keydown事件做一些处理,理由同1

4.使用callback function方式的source,来获取最后输入的值,并呈现结果

还是直接拿官方DEMO的代码:

// 按逗号分隔多个值
function split(val) {
  return val.split(/,\s*/);
}
// 提取输入的最后一个值
function extractLast(term) {
  return split(term).pop();
}
// 按Tab键时,取消为输入框设置value
function keyDown(event) {
  if (event.keyCode === $.ui.keyCode.TAB &&
      $(this).data("autocomplete").menu.active) {
    event.preventDefault();
  }
}
var options = {
  // 获得焦点
  focus: function() {
    // prevent value inserted on focus
    return false;
  },
  // 从autocomplete弹出菜单选择一个值时,加到输入框最后,并以逗号分隔
  select: function(event, ui) {
    var terms = split(this.value);
    // remove the current input
    terms.pop();
    // add the selected item
    terms.push(ui.item.value);
    // add placeholder to get the comma-and-space at the end
    terms.push("");
    this.value = terms.join(", ");
    return false;
  }
};
// 多个值,本地数组
$("#local3").bind("keydown", keyDown)
  .autocomplete($.extend(options, {
    minLength: 2,
    source: function(request, response) {
      // delegate back to autocomplete, but extract the last term
      response($.ui.autocomplete.filter(
        availableTags, extractLast(request.term)));
    }
  }));
// 多个值,ajax返回json
$("#ajax3").bind("keydown", keyDown)
  .autocomplete($.extend(options, {
    minLength: 2,
    source: function(request, response) {
      $.getJSON("remoteJSON.ashx", {
        term: extractLast(request.term)
      }, response);
    }
  }));

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

jQuery 相关文章推荐
jquery实现tab选项卡切换效果(悬停、下方横线动画位移)
May 05 jQuery
js和jquery中获取非行间样式
May 05 jQuery
jQuery Autocomplete简介_动力节点Java学院整理
Jul 17 jQuery
jQuery实现点击下拉框中的值累加到文本框中的方法示例
Oct 28 jQuery
Vue中正确使用jQuery的方法
Oct 30 jQuery
基于jQuery中ajax的相关方法汇总(必看篇)
Nov 08 jQuery
jquery在启动页面时,自动加载数据的实例
Jan 22 jQuery
jQuery滑动效果实现方法分析
Sep 05 jQuery
jQuery实现的隔行变色功能【案例】
Feb 18 jQuery
JavaScript前端页面搜索功能案例【基于jQuery】
Jul 10 jQuery
jquery 键盘事件 keypress() keydown() keyup()用法总结
Oct 23 jQuery
jquery+ajax实现异步上传文件显示进度条
Aug 17 jQuery
jQuery Pagination分页插件_动力节点Java学院整理
Jul 17 #jQuery
jQuery Form插件使用详解_动力节点Java学院整理
Jul 17 #jQuery
jQuery列表检索功能实现代码
Jul 17 #jQuery
如何将 jQuery 从你的 Bootstrap 项目中移除(取而代之使用Vue.js)
Jul 17 #jQuery
用户管理的设计_jquery的ajax实现二级联动效果
Jul 13 #jQuery
JQuery EasyUI的一些常用组件
Jul 12 #jQuery
jQuery+Ajax请求本地数据加载商品列表页并跳转详情页的实现方法
Jul 12 #jQuery
You might like
用php或asp创建网页桌面快捷方式的代码
2010/03/23 PHP
关于zend studio 出现乱码问题的总结
2013/06/23 PHP
thinkphp框架实现删除和批量删除
2016/06/29 PHP
PHP封装返回Ajax字符串和JSON数组的方法
2017/02/17 PHP
PHP PDOStatement::setFetchMode讲解
2019/02/03 PHP
php生成随机数/生成随机字符串的方法小结【5种方法】
2020/05/27 PHP
PHP+Mysql分布式事务与解决方案深入理解
2021/02/27 PHP
Jquey拖拽控件Draggable使用方法(asp.net环境)
2010/09/28 Javascript
JS实现一个列表中包含上移下移删除等功能
2014/09/24 Javascript
AngularJS基础 ng-switch 指令简单示例
2016/08/03 Javascript
vuejs事件中心管理组件间的通信详解
2017/08/09 Javascript
解析Vue2 dist 目录下各个文件的区别
2017/11/22 Javascript
layui之table checkbox初始化时选中对应选项的方法
2019/09/02 Javascript
Python中的字符串类型基本知识学习教程
2016/02/04 Python
python paramiko模块学习分享
2017/08/23 Python
python+matplotlib绘制3D条形图实例代码
2018/01/17 Python
Python机器学习k-近邻算法(K Nearest Neighbor)实例详解
2018/06/25 Python
Python设计模式之状态模式原理与用法详解
2019/01/15 Python
windows上安装python3教程以及环境变量配置详解
2019/07/18 Python
Python通过递归获取目录下指定文件代码实例
2019/11/07 Python
python如何利用Mitmproxy抓包
2020/10/10 Python
英国知名衬衫品牌美国网站:Charles Tyrwhitt美国
2016/08/28 全球购物
西班牙香水和化妆品网上商店:Douglas
2017/10/29 全球购物
Delphi软件工程师试题
2013/01/29 面试题
预备党员思想汇报
2014/01/08 职场文书
预备党员思想汇报范文
2014/01/11 职场文书
综合实践活动方案
2014/02/14 职场文书
音乐教育感言
2014/03/05 职场文书
宪法宣传周工作方案
2014/05/26 职场文书
企业安全生产月活动总结
2014/07/05 职场文书
2014年国庆节演讲稿
2014/09/02 职场文书
学习焦裕禄精神践行三严三实心得体会
2014/10/13 职场文书
学生检讨书范文
2014/10/30 职场文书
2015年市场部工作总结
2015/04/30 职场文书
如何撰写创业策划书
2019/06/27 职场文书
Vue3中toRef与toRefs的区别
2022/03/24 Vue.js