jQuery autoComplete插件两种使用方式及动态改变参数值的方法详解

本文实例讲述了jQuery autoComplete插件两种使用方式及动态改变参数值的方法。分享给大家供大家参考,具体如下:

一、一次加载、多次使用:

前端JS代码:

/*客户名称自动匹配*/
function customerAutoComplete(){
  $.ajax({
    type:"GET",
    url:encodeURI("/approvalajax/salesOrderApproval_findCustomerList"),
    dataType:"json",
    success:function(data, textStatus){
      if(data != null && data.customerList != null){
        $("#customerFullName").autocomplete(data.customerList, {
          /**加自定义表头**/
          tableHead: "<div><span style='width:40%' class='col-1'>客户编码</span> <span style='width:58%' class='col-2'>客户名称</span></div>",
          minChars: 0,
          width: 310,
          matchContains: "true",
          autoFill: false,
          extraParams: {ledger:$("#ledger").val()},
          formatItem: function(row, i, max) {
            return "<span style='width:40%' class='col-1'>" + row.cusCode + "</span> " + "<span style='width:58%' class='col-2'>" + row.cusName + "</span>";
          },
          formatMatch: function(row, i, max) {
            return row.cusCode+row.cusName;
          },
          formatResult: function(row) {
            return row.cusName;
          }
        }).result(function(e,data,value,sec){/**加选中后的回调函数**/
          clearCustomerInfo();
          $("#customerShortName").val(data.cusAbbName);
          $("#customerFullName").val(data.cusName);
          $("#customerCode").val(data.cusCode);
          /*根据选择的客户、账套加载 对应产品线、收付款协议、账期*/
          setPLAndPCAndCP(data.cusCode);
          /*加载存货编码*/
          setInventoryAutoComplete(data.cusCode);
        }).bind("unmatch", function(){
          clearCustomerInfo();
        });
      }
    }
  });
}

后台JAVA代码:

/**
 * 异步请求结果.
 */
private Map<String, Object> ajaxResultMap;
/**
 * @Description 根据账套异步加载客户列表
 * @throws Exception
 * @return String
 */
public String findCustomerList() throws Exception {
  ajaxResultMap = new HashMap<String, Object>();
  response.setContentType("text/html;charset=UTF-8");
  response.setCharacterEncoding("UTF-8");
  List<ErpCustomer> list = erpDataService.findCustomerList(ledger);
  ajaxResultMap.put("customerList", list);
  return SUCCESS;
}

配置文件相关代码:

<package name="approval-ajax" extends="json-default" namespace="/approvalajax">
    <!-- 销售订单 审批相关 -->
    <action name="salesOrderApproval_*" method="{1}" class="xx.xxx.xxAction">
      <result type="json">
        <param name="root">ajaxResultMap</param>
        <param name="contentType">text/html</param>
      </result>
    </action>
</package>

二、根据输入内容动态加载:

前端JS代码:

/*客户名称自动匹配*/
function customerAutoComplete(){
  $("#customerFullName").autocomplete(encodeURI("/approvalajax/salesOrderApproval_findCustomerList"), {
    /**加自定义表头**/
    tableHead: "<div><span style='width:40%' class='col-1'>客户编码</span> <span style='width:58%' class='col-2'>客户名称</span></div>",
    minChars: 0,
    width: 310,
    matchContains: "true",
    autoFill: false,
    extraParams: {ledger:$("#ledger").val()},
    dataType: 'json',
    parse: function(data) {
      var rows = [];
      if(data == null || data.customerList == null){
        return rows;
      }
      for(var i=0; i<data.customerList.length; i++){
        rows[rows.length] = {
          data:data.customerList[i],       //下拉框显示数据格式
          value:data.customerList[i].cusName,   //选定后实际数据格式
          result:data.customerList[i].cusName  //选定后输入框显示数据格式
        };
      }
      return rows;
    },
    formatItem: function(row, i, max) {
      return "<span style='width:40%' class='col-1'>" + row.cusCode + "</span> " + "<span style='width:58%' class='col-2'>" + row.cusName + "</span>";
    },
    formatMatch: function(row, i, max) {
      return row.cusCode+row.cusName;
    },
    formatResult: function(row) {
      return row.cusName;
    }
  }).result(function(e,data,value,sec){/**加选中后的回调函数**/
    clearCustomerInfo();
    $("#customerShortName").val(data.cusAbbName);
    $("#customerFullName").val(data.cusName);
    $("#customerCode").val(data.cusCode);
    $("#licensecode").val(data.licensecode);
    /*根据选择的客户、账套加载 对应产品线、收付款协议、账期*/
    setPLAndPCAndCP(data.cusCode);
    /*存货编码*/
    addInventoryAutoComplete($("#detailListTbody").find("input[tdTag=inventoryCode]"));
  }).bind("unmatch", function(){
    clearCustomerInfo();
  });
}

后台JAVA代码:

/**
 * @Fields q 自动填充辅助字符
 */
private String q;
/**
 * 异步请求结果.
 */
private Map<String, Object> ajaxResultMap;
/**
 * @Description 根据账套异步加载客户列表
 * @throws Exception
 * @return String
 */
public String findCustomerList() throws Exception {
  ajaxResultMap = new HashMap<String, Object>();
  response.setContentType("text/html;charset=UTF-8");
  response.setCharacterEncoding("UTF-8");
  List<ErpCustomer> list = erpDataService.findTop5CustomerList(ledger, q);
  ajaxResultMap.put("customerList", list);
  return SUCCESS;
}

说明:在使用动态加载时,请求的URL中插件会自动追加q参数,用于传输输入的参数。

注:使用Jquery中的autoComplete插件实现自动匹配功能时,直接使用它来解析json对象时,会出现一个错误提示,因为它默认使用"/n"拆分行、"|"拆分字段。如果需要使用它来解析json对象,则需要自己实现其parse方法。

参数说明:

* minChars (Number):
    在触发autoComplete前用户至少需要输入的字符数.Default: 1,如果设为0,在输入框内双击或者删除输入框内内容时显示列表
* width (Number):
    指定下拉框的宽度. Default: input元素的宽度
* max (Number):
    autoComplete下拉显示项目的个数.Default: 10
* delay (Number):
    击键后激活autoComplete的延迟时间(单位毫秒).Default: 远程为400 本地10
* autoFill (Boolean):
    要不要在用户选择时自动将用户当前鼠标所在的值填入到input框. Default: false
* mustMatch (Booolean):
    如果设置为true,autoComplete只会允许匹配的结果出现在输入框,所有当用户输入的是非法字符时将会得不到下拉框.Default: false
* matchContains (Boolean):
    决定比较时是否要在字符串内部查看匹配,如ba是否与foo bar中的ba匹配.使用缓存时比较重要.不要和autofill混用.Default: false
* selectFirst (Boolean):
    如果设置成true,在用户键入tab或return键时autoComplete下拉列表的第一个值将被自动选择,尽管它没被手工选中(用键盘或鼠标).当然如果用户选中某个项目,那么就用用户选中的值. Default: true
* cacheLength (Number):
    缓存的长度.即对从数据库中取到的结果集要缓存多少条记录.设成1为不缓存.Default: 10
* matchSubset (Boolean):
    autoComplete可不可以使用对服务器查询的缓存,如果缓存对foo的查询结果,那么如果用户输入foo就不需要再进行检索了,直接使用缓存.通常是打开这个选项以减轻服务器的负担以提高性能.只会在缓存长度大于1时有效.Default: true
* matchCase (Boolean):
    比较是否开启大小写敏感开关.使用缓存时比较重要.如果你理解上一个选项,这个也就不难理解,就好比foot要不要到FOO的缓存中去找.Default: false
* multiple (Boolean):
    是否允许输入多个值即多次使用autoComplete以输入多个值. Default: false
* multipleSeparator (String):
    如果是多选时,用来分开各个选择的字符. Default: ","
* scroll (Boolean):
    当结果集大于默认高度时是否使用卷轴显示 Default: true
* scrollHeight (Number):
    自动完成提示的卷轴高度用像素大小表示  Default: 180
* formatItem (Function):
    为每个要显示的项目使用高级标签.即对结果中的每一行都会调用这个函数,返回值将用LI元素包含显示在下拉列表中. Autocompleter会提供三个参数(row, i, max): 返回的结果数组, 当前处理的行数(即第几个项目,是从1开始的自然数), 当前结果数组元素的个数即项目的个数. Default: none, 表示不指定自定义的处理函数,这样下拉列表中的每一行只包含一个值.
* formatResult (Function):
    和formatItem类似,但可以将将要输入到input文本框内的值进行格式化.同样有三个参数,和formatItem一样.Default: none,表示要么是只有数据,要么是使用formatItem提供的值.
* formatMatch (Function):
    对每一行数据使用此函数格式化需要查询的数据格式. 返回值是给内部搜索算法使用的. 参数值row
* extraParams (Object):
    为后台(一般是服务端的脚本)提供更多的参数.和通常的作法一样是使用一个键值对对象.如果传过去的值是{ bar:4 },将会被autocompleter解析成my_autocomplete_backend.php?q=foo&bar=4 (假设当前用户输入了foo). Default: {}
* result (handler)  Returns: jQuery
    此事件会在用户选中某一项后触发,参数为:
    event: 事件对象. event.type为result.
    data: 选中的数据行.
    formatted:formatResult函数返回的值
    例如:

$("#singleBirdRemote").result(function(event, data, formatted) {
 //如选择后给其他控件赋值,触发别的事件等等
});

注:另一种方式可动态改变参数传入值。

我们知道这个插件有一个extraParams的参数,因为jquery.autoComplete只支持q和limit两个参数,假如有这样的情况,我们需要向服务器提交更多参数怎么办呢,幸好,作者为我们提供一个扩展参数,就是extraParams。extraParams好是好,可是不幸的是,它是一个死的参数,有时候,我们需要提交一个活的参数到服务器。举例说明,比如说我们有一个公司名称的自动完成功能,但我们同时需要向服务器提供一个城市的参数,正常的情况下没有问题。但当城市的名称是由用户选择的时候,就有问题了,也就说,这个城市的名称是根据用户选择而实时变化的,这个时候,现有的jquery.autoComplete就无能为力了。

这个时候我们就要考虑修改修改一下jquery.autoComplete了,我们先看一下代码,代码有一个onChange事件,这是一个解发事件,我们可以在这里添加一个回调函数来解决问题。首先我们要为options中添加一个参数叫onBegin,大致就在400行左右吧,有一行这样的代码:

$.Autocompleter.defaults =

我们在后面添加一段

onBegin: null,

然后我们找到onChange事件,约在226行,代码如下:

function onChange(crap, skipPrevCheck)

在函数时里面添加如下代码:

if (options.onBegin) {
        var op = options.onBegin(options);
        if (op) {
            $.extend(options, op);
        }
}

这段代码被修改过后看起来就像这样:

function onChange(crap, skipPrevCheck) {
    //2010-01-27 ,添加onBegin函数,以便在启动onChange的时候,可以重新设置options
    if (options.onBegin) {
      var op = options.onBegin(options);
      if (op) {
        $.extend(options, op);
      }
    }
    //end
    if( lastKeyPressCode == KEY.DEL ) {
      select.hide();
      return;
    }
    var currentValue = $input.val();
    if ( !skipPrevCheck && currentValue == previousValue )
      return;
    previousValue = currentValue;
    currentValue = lastWord(currentValue);
    if ( currentValue.length >= options.minChars) {
      $input.addClass(options.loadingClass);
      if (!options.matchCase)
        currentValue = currentValue.toLowerCase();
      request(currentValue, receiveData, hideResultsNow);
    } else {
      stopLoading();
      select.hide();
    }
};

再来看调用:

/*客户名称自动匹配*/
function customerAutoComplete(){
  $("#customerFullName").autocomplete(encodeURI("/approvalajax/salesOrderApproval_findCustomerList"), {
    /**加自定义表头**/
    tableHead: "<div><span style='width:40%' class='col-1'>客户编码</span> <span style='width:58%' class='col-2'>客户名称</span></div>",
    minChars: 0,
    width: 310,
    multiple: false,
    mustMatch: false,
    matchContains: false,
    matchSubset: false,
    autoFill: false,
    onBegin: function(options) { //修改--用于动态改变ledger的值
      options.extraParams.ledger= $("#ledger").val();
      return options;
    },
    //extraParams: {ledger:$("#ledger").val()},
    dataType: 'json',
    parse: function(data) {
      var rows = [];
      if(data == null || data.customerList == null){
        return rows;
      }
      for(var i=0; i<data.customerList.length; i++){
        rows[rows.length] = {
          data:data.customerList[i],       //下拉框显示数据格式
          value:data.customerList[i].cusName,   //选定后实际数据格式
          result:data.customerList[i].cusName  //选定后输入框显示数据格式
        };
      }
      return rows;
    },
    formatItem: function(row, i, max) {
      return "<span style='width:40%' class='col-1'>" + row.cusCode + "</span> " + "<span style='width:58%' class='col-2'>" + row.cusName + "</span>";
    },
    formatMatch: function(row, i, max) {
      return row.cusCode+row.cusName;
    },
    formatResult: function(row) {
      return row.cusName;
    }
  }).result(function(e,data,value,sec){/**加选中后的回调函数**/
    clearCustomerInfo();
    $("#customerShortName").val(data.cusAbbName);
    $("#customerFullName").val(data.cusName);
    $("#customerCode").val(data.cusCode);
    $("#licensecode").val(data.licensecode);
    /*根据选择的客户、账套加载 对应产品线、收付款协议、账期*/
    setPLAndPCAndCP(data.cusCode);
  }).bind("unmatch", function(){
    clearCustomerInfo();
  });
}

其实做的只有三步:

1. 在options中添加一个onBegin的参数
2. 在onChange中判断onBegin是否有赋值,如果有,则调用这个函数,返回将返回值合并到options中去
3. 调用的时候,在onBegin函数中添加一些业务逻辑,并可以重新设置options

就这样,我们不仅可以达到动态去添加extraParams参数,而且还可以动态地修改其它options参数,这个onBegin在用户改变输入框的值就会触发。

更多关于jQuery相关内容感兴趣的读者可查看本站专题:《jQuery窗口操作技巧总结》、《jQuery拖拽特效与技巧总结》、《jQuery常用插件及用法总结》、《jquery中Ajax用法总结》、《jQuery表格(table)操作技巧汇总》、《jQuery扩展技巧总结》、《jQuery常见经典特效汇总》、《jQuery动画与特效用法总结》及《jquery选择器用法总结》

希望本文所述对大家jQuery程序设计有所帮助。

(0)

相关推荐

  • jquery中获取id值方法小结

    复制代码 代码如下: <div id="product_shift_out_{m}"> </div><script language = "JavaScript" type="text/javascript">$(document).ready(function(){name = $('div').eq(0).attr('id');alert(name)});</script> eq(0)是取第一个

  • JQuery上传插件Uploadify使用详解及错误处理

    什么是Uploadify Uploadify是JQuery的一个上传插件,支持多文件上传,实现的效果非常不错,带进度显示. 官网提供的是PHP的DEMO,在这里我详细介绍在Asp.net下的使用. 下载 官方下载 官方文档 官方演示 我们提供的Uploadify下载地址 如何使用 1 创建Web项目,命名为JQueryUploadDemo,从官网上下载最新的版本解压后添加到项目中 2 在项目中添加UploadHandler.ashx文件用来处理文件的上传. 3 在项目中添加UploadFile文

  • jQuery中ajax的4种常用请求方式介绍

    AJAX 是一种与服务器交换数据的技术,可以在补充在整个页面的情况下更新网页的一部分. jQuery中ajax的4种常用请求方式: 1.$.ajax()返回其创建的 XMLHttpRequest 对象. $.ajax() 只有一个参数:参数 key/value 对象,包含各配置及回调函数信息.详细参数选项见下. 如果你指定了 dataType 选项,请确保服务器返回正确的 MIME 信息,(如 xml 返回 "text/xml"). 实例: 保存数据到服务器,成功时显示信息. $.aj

  • JQuery datepicker 使用方法

    官方地址:http://docs.jquery.com/UI/Datepicker,官方示例: http://jqueryui.com/demos/datepicker/. 一个不错的地址,用来DIY jQuery UI界面效果的站点http://jqueryui.com/themeroller/ DatePicker基本使用方法: 复制代码 代码如下: <!DOCTYPE html> <html> <head> <link href="http://a

  • jQuery插件实现可输入和自动匹配的下拉框

    实现可输入+带自动匹配功能的下拉框,我试过以下几种方法: 1.直接使用h5的新标签<datalist>,对应demo如下: <input list="browsers"> <datalist id="browsers"> <option value="Internet Explorer"> <option value="Firefox"> <option val

  • jQuery检查元素存在性(推荐)

    javascript检查元素存在性:即使这个元素被删除了,也不担心javascript代码报错: jquery检查元素存在性: 代码如下: if(!document.getElementById("preview")) return false; jquery $("#preview")获取的永远是对象,即使网页上没有此元素. 不能使用以下代码: if($("#preview"){ //do something } 因此要用jquery检查某个元

  • jQuery 检查某个元素在页面上是否存在实例代码

    最近做项目,有这么个功能用jQuery检查某个元素在网页上是否存在,这里记录下,也许能帮助正在读文章的朋友. 用jQuery检查某个元素在网页上是否存在时,应该根据获取元素的长度来判断,代码如下: if($("#tt").length > 0) { //元素存在时执行的代码 } 具体原因如下: 在JavaScript中,我们在使用传统的getElementById()和getElementsByTagName()时,如果在网页中找不到相关元素,那么浏览器就会报错,影响后续代码的执

  • jQuery+json实现动态创建复杂表格table的方法

    本文实例讲述了jQuery+json实现动态创建复杂表格table的方法.分享给大家供大家参考,具体如下: function SetSubTable() { var obj = jQuery.parseJSON($("#SubJsonStrValue").val()); window.ALLPARAMTERS = obj; var row_str = ""; var span_num = 1 for (var i = 0; i < obj.length; i+

  • jQuery autoComplete插件两种使用方式及动态改变参数值的方法详解

    本文实例讲述了jQuery autoComplete插件两种使用方式及动态改变参数值的方法.分享给大家供大家参考,具体如下: 一.一次加载.多次使用: 前端JS代码: /*客户名称自动匹配*/ function customerAutoComplete(){ $.ajax({ type:"GET", url:encodeURI("/approvalajax/salesOrderApproval_findCustomerList"), dataType:"j

  • uniapp打包安卓App的两种方式(云打包、本地打包)方法详解

    在HBuilder上对APP提供了两种打包方式,云打包和本地打包,下面主要对这两种打包方式做个介绍 两者的区别:云打包相对简单,但是每天最多只能打包五次,而且在高峰期打包时间可能会很长,本地打包相对比较复杂,但是不限制次数,打包时间也短 一. uniapp云打包安卓App: 只需要设置相应参数即可.比较复杂的地方可能就是证书,如果你是测试包,Android的话直接选择共用证书即可,ios则需要申请相应证书,申请证书的具体方法官方也介绍的很清楚了,就不赘述了. 二. uniapp本地打包安卓App

  • Vue3父子通讯方式及Vue3插槽的使用方法详解

    在Vue3中父子通讯方式 Vue3父传子(props) 父组件如下: <template> <div class="about"> <h1>This is an about page</h1> <children :num="num" age="30"></children> </div> </template> <script> impo

  • jQuery实现checkbox全选、反选及删除等操作的方法详解

    本文实例讲述了jQuery实现checkbox全选.反选及删除等操作的方法.分享给大家供大家参考,具体如下: 运行效果: 1.list.html 说明:用checkbox数组Check[]存放每一行的ID值 <div id="con"> <table width="100%" cellspacing="1" cellpadding="0"> <tr> <th><input

  • Android编程使用pull方式解析xml格式文件的方法详解

    本文实例讲述了Android编程使用pull方式解析xml格式文件的方法.分享给大家供大家参考,具体如下: 上次已经说过使用Android sax解析xml,实际上还可以使用pull解析xml.这样的方式效率也是比较高的.pull不仅可以在Android上使用也可以用在javaee里面,需要的就是pull的jar包.这次的xml也使用上次的那个,如下所示 <?xml version="1.0" encoding="UTF-8"?> <persons

  • java中四种生成和解析XML文档的方法详解(介绍+优缺点比较+示例)

    众所周知,现在解析XML的方法越来越多,但主流的方法也就四种,即:DOM.SAX.JDOM和DOM4J 下面首先给出这四种方法的jar包下载地址 DOM:在现在的Java JDK里都自带了,在xml-apis.jar包里 SAX:http://sourceforge.net/projects/sax/ JDOM:http://jdom.org/downloads/index.html DOM4J:http://sourceforge.net/projects/dom4j/  一.介绍及优缺点分析

  • 6种查看Linux进程占用端口号的方法详解

    对于 Linux 系统管理员来说,清楚某个服务是否正确地绑定或监听某个端口,是至关重要的.如果你需要处理端口相关的问题,这篇文章可能会对你有用. 端口是 Linux 系统上特定进程之间逻辑连接的标识,包括物理端口和软件端口.由于 Linux 操作系统是一个软件,因此本文只讨论软件端口.软件端口始终与主机的 IP 地址和相关的通信协议相关联,因此端口常用于区分应用程序.大部分涉及到网络的服务都必须打开一个套接字来监听传入的网络请求,而每个服务都使用一个独立的套接字. 套接字是和 IP 地址.软件端

  • bootstrap paginator分页插件的两种使用方式实例详解

    分页有两种方式: 1. 前台分页:ajax一次请求获取全部数据,适合少量数据(万条数据以下): $.ajax({ type: "GET", url: "",//后台接口地址 dataType: "json", success: function (msg) { var pages = Math.ceil(msg.data / 5);//data是数据总量 var element = $('#id');//对应ul的id element.boots

  • Pycharm激活码激活两种快速方式(附最新激活码和插件)

    小张的Pycharm最近弹出提示框 Your license has expired提示过期....纳尼!!!! 是不是看到这个也很头疼,.于是我就在想有没有一种方式可以让他永久免费的,于是小张从网上进行搜索,还真发现了几乎免费永久激活的方式,以下是小张为大家整理常见的两种激活方式. 一.激活码激活(不推荐): 一般一年多需要激活一次,在License Activation激活界面,选择Active,选择Activation code,粘贴如下激活码,点击ok.这个不过多详细介绍. 二.永久激活

  • 实现jquery放大镜的两种方法

    jquery写的两种放大镜效果,没有使用到插件.调理和思路清晰.不是使用面向对象方式写的,初学者较容易看懂.废话不多说,看代码.图片这里就不上传了,大家自己找下.最好是找到比例的,这样效果比较好. <body> <div id="father"> <div id="container"> <img src="img/400_1.jpg" style="display: block;"&

随机推荐