使用extraParams传递附加的GET变量实现jQuery自动完成

28

我特别指的是Jörn Zaefferer的jQuery Autocomplete v1.1插件[来源:http://bassistance.de/jquery-plugins/jquery-plugin-autocomplete/],因为这个插件似乎有很多版本。

我试图在用户开始输入时向服务器传递其他参数,因为我有多个字段需要自动完成提供建议。

除了查询之外,我还想将输入名称属性发送到服务器,但我似乎无法在extraParams中使用$(this).attr('name')。

我的jQuery:

   $('.ajax-auto input').autocomplete('search.php', {
     extraParams: {
      search_type: function(){
       return $(this).attr('name');
      }
     }
   })
这是我的 HTML。
 <form method="post" action="#" id="update-form" autocomplete="off">
  <ol>
         <li class="ajax-auto">
             <label for="form-initials">Initials</label>
                <input type="text" id="form-initials" name="initials" />
            </li>
         <li class="ajax-auto">
             <label for="form-company">Company</label>
                <input type="text" id="form-company" name="company" />
            </li>
  </ol>
 </form>

有什么建议吗?

13个回答

47

我正在使用现在已成为jQuery UI一部分的自动完成函数。传递'extraParams'字段不起作用,但您可以直接将值附加到请求查询字符串中。

$(document).ready(function() {
    src = 'http://example.com/index.php';

    // Load the cities straight from the server, passing the country as an extra param
    $("#city_id").autocomplete({
        source: function(request, response) {
            $.ajax({
                url: src,
                dataType: "json",
                data: {
                    term : request.term,
                    country_id : $("#country_id").val()
                },
                success: function(data) {
                    response(data);
                }
            });
        },
        min_length: 3,
        delay: 300
    });
});

4
需要注意的是,这是使用内置于jQuery UI中的Autocomplete扩展程序的正确答案。对于新用户来说会感到困惑,因为有太多关于“Jörn Zaefferer”版本的博客和文章,而该版本是内置版本的前身。http://www.learningjquery.com/2010/06/autocomplete-migration-guide - atconway
当您有多个自动完成字段时,可以使用this.element来访问实际的字段。 - Elia Weiss

4

试试这个:

$('.ajax-auto input').setOptions({
  extraParams: {
    search_type: function(){
      return $(this).attr('name');
    }
  }
})

参见 此处


这对我有用。setOptions() 调用在 autocomplate() 调用之后。 - James Lawruk

2
我是一名有用的助手,可翻译您的文本。

我遇到了类似的问题...不知道下面的方法是否适用于您...

我尝试了:

 $("#awbCusName").autocomplete("getOracleCus.php?",{
  extraParams: {
  ZONE: function() { return $("#awbZone").val(); }, 
  SE: function() { return $("#awbSE").val(); }, 
  WSC: function() { return $("#awbWSC").val(); } 
 },
delay:200,
selectOnly:true,
cacheLength:0,
autoFill:true,
matchSubset:true,
minChars:1
});

CACHELENGTH:0解决了问题

谢谢


2
您可以像这样使用内置的 jQuery UI 自动完成功能:
          $(function() {
         $("#BurroughName").autocomplete({
                minLength: 0,
                source: function( request, response) {
                            $.ajax({
                                        url: "/JsonData/GetBurroughFromSearchTermJson",
                                        dataType: "json",
                                        data: {
                                                    term: request.term,
                                                    CityId: $("#CityId").val()
                                        },
                                        success: function( data ) {
                                                    response( data );
                                        }
                            });
                },                  
                select: function( event, ui) {
                    $("#BurroughId").val(ui.item.id);

                    if (ui.item.id != null) {
                         var cityId = $('#CityId').val();
                        $.getJSON("/AdSales/City.mvc/GetCityJSONListFromBrand", { burroughId: ui.item.id }, function(data) {
                             $("#CityId").fillSelect(data);
                             var foo = $("#CityId option[value=" + cityId + "]");
                             if(($("#CityId option[value=" + cityId + "]").length > 0) && cityId != "")
                             {
                                 $("#CityId").val(cityId);
                             }
                        });
                    }
                    $('#burroughSpinner').fadeOut('slow', function(){});
                }
         });
     });

这是他们的jsonp示例:http://jqueryui.com/demos/autocomplete/#remote-jsonp

1

虽然不是最理想的,但我已经对插件进行了一些修改/破解,使其能够为我所用。

简单来说,我修改了插件中的AJAX jQuery函数。

在第363行左右,您会看到:

        $.ajax({
            // try to leverage ajaxQueue plugin to abort previous requests
            mode: "abort",
            // limit abortion to this input
            port: "autocomplete" + input.name,
            dataType: options.dataType,
            url: options.url,
            data: $.extend({
                q: lastWord(term),
                search_type: $(input).attr('name'), // my mod to pickup multiple fields
                limit: options.max
            }, extraParams),
            success: function(data) {
                var parsed = options.parse && options.parse(data) || parse(data);
                cache.add(term, parsed);
                success(term, parsed);
            }
        });

我仍在寻找一个优雅的解决方案,所以请继续提出建议。


1
jQuery( "#jac" ).autocomplete({
    source: autocompleteURL,
    minLength: 2,
    search: function( event, ui ) { 

        // update source url by adding new GET params
        $(this).autocomplete( 'option', 'source', autocompleteURL + 'var1=aaa&var2=bbb' );
    }
})

使用jquery.ui.autocomplete 1.8.17对我有效。


1

使用JQuery 1.7中的自动完成...

使用aspx数据网格:我需要自动完成对任何选择的记录触发,但基于输入值不同的种子数据。我还需要获取数据网格上显示的记录的另外两个字段来获取自动完成的数据。我需要引用的字段都有自己的类名。

    $(".AutoSearch").autocomplete({
            DateTime: "",
            Maker: "",
            search: function (event, ui) {
                DateTime = $(this).parent().parent().parent().find(".DateTime").text();
                Maker = $(this).parent().parent().parent().find(".Maker").text();
            },
            source: function (request, response) {
                $.ajax({
                    type: "POST",
                    dataType: "json",
                    url: "AutoList.aspx/GetListOfAutos",
                    data: "{ " +
                        "'DateTime': '" + DateTime + "', " +
                        "'Maker': '" + Maker + "', " +
                        "'SearchSeed': '" + request.term + "', " +
                        "'NumberToRetrieve': '" + 100 + "'" +
                    " }",
                    contentType: "application/json; charset=utf-8",
                    success: function (data) {
                        response($.map(data.d, function (item) {
                            return {
                                label: item.Description,
                                value: item.Number
                            }
                        }));
                    },
            error: function (XMLHttpRequest, textStatus, errorThrown) {
                        alert("There was an error retrieving the Data.");
                    }
                });
            },
            change: function (event, ui) {
                $(this).parent().parent().parent().parent().parent().parent().css("background-color", "#EEC900");
                $(this).parent().parent().parent().parent().parent().parent().find(".chkReadyExport").find("input:checkbox").prop("checked", false);
            },
            select: function (event, ui) {
                this.value = ui.item.value;
                return false;
            },
            minlength: 6,
            open: function () {
                $(this).removeClass("ui-corner-all").addClass("ui-corner-top");
            },
            close: function () {
                $(this).removeClass("ui-corner-top").addClass("ui-corner-all");
            }
        });
    }

我添加了两个属性:DateTime和Maker,然后使用search(在自动完成之前触发):从当前行中获取所需的数据。这为我提供了一个很好的方式来将所有搜索和额外数据项目都放在一个地方。
.parent()、.parent()等是因为我有多行表格在gridview中显示我的数据,我需要遍历整个树,然后找到我要查找的文本框或标签,并更改具有更改数据的行的背景颜色。我还不熟练于使用jQuery查找元素,因此使用了parent.parent...等方法。

1
关于得票最多的答案,我认为只需将额外的请求值附加到源URL中,就可以使用更简单的语法。
$("#city_id").autocomplete({
    source: src+"?country_id="+$("#country_id").val().
    min_length: 3,
    delay: 300
});

与以下代码相同:

$("#city_id").autocomplete({
    source: function(request, response) {
        $.ajax({
            url: src,
            dataType: "json",
            data: {
                term : request.term,
                country_id : $("#country_id").val()
            },
            success: function(data) {
                response(data);
            }
        });
    },
    min_length: 3,
    delay: 300
});

假设src是一个url字符串。


1
@mpag,虽然它们看起来相同,但两者之间存在差异。后者每次动态发送搜索请求时都会从DOM加载country_id的值。但是您的方法使用静态参数值country_id构建静态路由。country_id的值将在DOM加载时设置为$("#country_id")的值,并且永远不会更改,尽管元素$("#country_id")可能会更改。 基本上,应优先使用原始和较长版本。 - Harsh Trivedi
当我尝试了两个版本时,这正是发生的事情。 - eaglei22

0

先使用 .each,然后您可以使用 $(this) 并将所需内容设置为变量。生成的变量可用于自动完成。

$(".autosuggest").each(function (index, object) {
    var autosuggestType = $(this).attr("autoSuggestType");
    $(this).autocomplete("url",
            {                    
                extraParams: {
                    autoSuggestType: autosuggestType
                },

0

试着用一下

$( "#ricerca" ).autocomplete({
                source: "response.php?param=param",
                minLength: 2
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接