【问题标题】:Limit the result in jQuery Autocomplete在 jQuery 自动完成中限制结果
【发布时间】:2011-05-03 13:57:12
【问题描述】:

如何对 jQuery 自动完成的结果设置限制?

这是我的代码:

        $.ajax({
            url: "/cache/search/SearchModels.xml",
            dataType: "xml",
            success: function(xmlResponse) {
                var data = $("SearchModel", xmlResponse).map(function() {
                    return {
                        value: $("Name", this).text() + ", " + $("Description", this).text(),
                        id: $("No", this).text(),
                        name: $("Name", this).text(),
                        url: $("URL", this).text()
                    };
                }).get();
                $("#txtTopSearch").autocomplete({
                    source: data,
                    minLength: 2,
                    select: function(event, ui) {
                        BlockUI();
                        if (typeof (ui.item.url) != 'undefined') {
                            window.location = ui.item.url;
                        }
                        else {
                            alert('Page not found!');
                            $.unblockUI();
                        }
                    },
                    search: function(event, ui) {
                        $('#txtTopSearch').addClass('searchInProgress');
                    },
                    close: function(event, ui) {
                        $('#txtTopSearch').removeClass('searchInProgress');
                    }
                }).data("autocomplete")._renderItem = function(ul, item) {
                    return $("<li></li>")
                    .data("item.autocomplete", item)
                    .append("<a><span style='font-size:.9em; font-weight:bold;'>" + item.id + "</span><br /><span style='font-size:.8em;'>" + item.name + "</span></a>")
                    .appendTo(ul);
                };
            },
            error: function(xhr, textStatus, errorThrown) {
                alert('Error: ' + xhr.statusText);
            }
        });

此代码返回查询中的所有结果,但我想将其限制为仅显示 10 个结果。在旧的自动完成版本中有一个选项,但现在已弃用。

XML 示例:

<?xml version="1.0"?>
<ArrayOfSearchModel xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <SearchModel>
    <No>1</No>
    <Name>My product</Name>
    <Description>My description</Description>
    <Tags>blue;brown;</Tags>
    <URL>/Products/1</URL>
  </SearchModel>
</ArrayOfSearchModel>

【问题讨论】:

    标签: jquery autocomplete


    【解决方案1】:

    最终更新
    在了解了我之前的答案后,我限制了整个 xml 结果集,而不是自动完成的结果

    由于您已经覆盖了默认的_renderItem 方法,您可以覆盖默认的_renderMenu

    $.ui.autocomplete.prototype._renderMenu = function( ul, items ) {
       var self = this;
       $.each( items, function( index, item ) {
          if (index < 10) // here we define how many results to show
             {self._renderItem( ul, item );}
          });
    }
    

    答案是从这个jQueryUI: how can I custom-format the Autocomplete plug-in results?修改的,所以感谢@cheeso..


    原答案

    在你success回调中使用$("SearchModel:lt(10)", xmlResponse).map(...

    :lt(10) 获取索引小于 10 的元素。因此将返回最多 10 个结果..

    当然,数字 10 可以是你想要的任何东西

    查看:lt() 选择器http://api.jquery.com/lt-selector/

    更新

    虽然我不明白为什么第一个答案不起作用,因为SearchModel 是一个标签,我们针对它.. 我们可以在 map 方法中移动过滤..

    success: function(xmlResponse) {
                    var data = $("SearchModel", xmlResponse).map(function(index) {
                        if (index<10)
                          {
                            return {
                                value: $("Name", this).text() + ", " + $("Description", this).text(),
                                id: $("No", this).text(),
                                name: $("Name", this).text(),
                                url: $("URL", this).text()
                                   };
                          }
                          else
                          { return null; }
                    }).get();
    

    documentation of map()

    【讨论】:

    • 有希望的建议,但没有奏效。看起来SearchModel 不是常规选择器。
    • @Martin,我认为它是 xml 中使用的标签。你能从 XML 文件中发布一些内容吗?我将使用map 方法发布替代解决方案
    • 谢谢,我已经用一个节点的例子更新了我的问题。
    • 谢谢,但这实际上会限制 XML 数据源,只返回 XML 文件中的前 10 个结果。这甚至在您开始搜索之前。 xml文件需要完整加载。
    • @martin .. 我现在看到了曙光 .. 我的两个案例(第一个案例在这方面也适用)适用于初始数据,而不是之后的结果自动完成过滤......看起来更多......
    【解决方案2】:

    为什么不限制查询从 xml 源返回的数据?

    编辑:

    您必须记住,自动完成功能本质上是使用正则表达式来匹配数据源中的项目。拥有大型数据源是不好的,因为它必须解析大量数据才能找到正确的项目。

    【讨论】:

    • 当然,我很想这样做,但是怎么做呢?我在 jQuery .map().get() 中寻找限制选项,但没有找到,我有点卡住了。
    • 减小 xml 文件的大小。如果您对显示文件中匹配的所有结果不感兴趣,请减小文件的大小(其中的内容数量)。
    • 很公平,但是没有其他方法可以在不更改 XML 文件的情况下做到这一点吗?
    • @Martin,Achilles 是正确的,为什么要返回 100 个 xml 条目,只显示 10 个。在 xml 生成端(mysql/sql/etc)限制为 10 个是有意义的跨度>
    • 嗯,我从集成缓慢的 ERP 系统中得到结果。因此,我没有直接在 ERP 系统中搜索,而是每天制作一次缓存 XML 文件。此 cahce 文件包括 ERP 系统中的所有产品。而且在这个文件里搜索很快,但是直接在ERP系统里搜索很慢。
    【解决方案3】:

    这是我根据对自动完成 API 文档的一些阅读所做的

    $input.autocomplete({
      source: function( request, response ) {
        $.getJSON('search.php', request, function( data, status, xhr ) {
          // return a max of 10 results.
          response( data.slice(0, 9) );
        });
      }
    })
    

    遵循这种模式可以省去在渲染层中做任何时髦的事情。

    【讨论】:

    • 在服务器端限制结果集的大小不是更有意义吗?例如,在 SQL 查询中使用 LIMIT 子句?
    • 那会更好,但我无法访问那组代码。
    【解决方案4】:

    限制结果的最快方法是在“开放”活动期间进行。 我们可以删除jquery ui动态创建的部分内容,减少children元素数组。

    这个解决方案为我解决了同样的问题:

    var maxResults = 10;
    $input.autocomplete({
        source: somefile.json,
        open: function(event,ui){
              $(this).data("uiAutocomplete").menu.element.children().slice(maxResults).remove();
             }
    })
    

    【讨论】:

      【解决方案5】:

      您可以为“打开”事件添加一个处理程序:

          open:function(event,ui){ 
          var maxListLength=10;
          var ul = jQuery( "#txtTopSearch" ).autocomplete("widget")[0];
          while(ul.childNodes.length > maxListLength)
                ul.removeChild(ul.childNodes[ul.childNodes.length-1]);
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-28
        • 1970-01-01
        • 2017-10-19
        • 1970-01-01
        • 2018-07-24
        • 2012-07-16
        • 2014-03-03
        相关资源
        最近更新 更多