【问题标题】:Search html with jQuery (autocomplete)使用 jQuery 搜索 html(自动完成)
【发布时间】:2010-11-04 14:55:55
【问题描述】:

我有一堆隐藏的 div,里面有一个表。用户需要在第一个单元格中搜索名称(可以包含空格),然后返回 div ID。
我查看了 jQueryUI 自动完成插件,但在使用多个值时遇到了问题。插件docsdemos
我使用“自定义数据和显示”示例作为预定义数据数组的基础,但我想避免它并简单地使用选择器。

搜索框

<label for="search_name">Find name</label>
<input type="text" name="search_name" value="" id="search_name">
<span style="display:none;" id="search_result"></span>

Divs

<div id="name_101284"><table>
  <tr><th colspan="5">John Doe (<a href="http://link">text</a>) - snip</th></tr>
  <tr><th>C1</th><th>C2</th><th>C3</th><th>C4</th><th>C5</th></tr>
  <tr><td>snip
</table></div>

JS

  var nameAC = [
   {label:"John Doe",id:"101284"},
   {label:"Johnny",id:"152345"},
   {label:"Jim Nelson",id:"77344"},
   {label:"Jimmy",id:"87457"},
   {label:"Maria",id:"100934"},
   {label:"Maria Nelson",id:"94734"},
   {label:"Jane Doe",id:"86247"},
   {label:"Janet",id:"106588"}
  ];
  $('#search_name').autocomplete({
    minLength: 1,
    delay: 300,
    source: nameAC,
    focus: function(event, ui) {
      $('#search_name').val(ui.item.label);
      return false;
    },
    select: function(event, ui) {
      $('#search_result').text(ui.item.id);
      $('#search_result').show();
    }
  });

属性“标签”是包含填充下拉结果 UL 的值的预期名称。改变它需要覆盖默认的 _renderItem 方法,像这样

$('#search_name').autocomplete({
 stuff
})
.data("autocomplete")._renderItem = function(ul, item) {
  return $("<li></li>")
  .data("item.autocomplete", item)
  .append("<a>" + item.name + "</a>")
  .appendTo(ul);
};

但它似乎有缺陷。

我可以制作一个选择器(或回调函数)来避免制作 nameAC 数组吗?

【问题讨论】:

  • 到底发生了什么,您在寻找什么?我正在重读您的帖子,但似乎找不到问题:/

标签: jquery jquery-ui autocomplete jquery-autocomplete jquery-ui-autocomplete


【解决方案1】:

Kim,我认为你的做法非常可靠。如果你想让一个函数生成源,我建议你更容易解析你的数据,即在每个 div 的名称周围放置一个 span 标签。

话虽如此,这里有一种方法可以像现在一样使用您的数据。它可能并不完美,因此我的建议是:

function makeArray() {
    var results = [];
    $("div[id^='name_']").each(function() {
        results.push({
            'label': $(this).find('th:first').text().replace(/(.*) \(.*/, '$1'),
            'id': this.id.replace(/name_(\d+)/, '$1')
        });
    });
    return results;
}

显然,如果您的用户名是这样的:&lt;span class="name"&gt;John Doe&lt;/span&gt;,那么标签会更简单:$(this).find('span.name').text()

你可以在这里看到一个简单的版本:http://jsfiddle.net/ryleyb/MYCbX/

编辑:我应该提到,这是从自动完成中调用的,如下所示:

$('#search_name').autocomplete({
    source: makeArray() // <-- note the brackets, function is being **called** 
});

【讨论】:

  • 完美。删除了函数部分,使数组全局化(无需多次从呈现的 HTML 中获取信息)并让 jquery 在文档准备好时填充数组。我以前使用服务器来生成数组,但这要好得多。按预期工作。
  • 一个耻辱的自动完成需要 jQuery.UI (19kb)。非常欢迎对轻量级插件提出建议。输入字段下方的下拉建议框是必需的,但样式可以是最少的(我已经从 jQuery.UI 中删除了部分)
  • @Kim - 因为 makeArray 函数返回一个数组,所以它只被调用一次......如果它返回一个 function,它将被一遍又一遍地调用
猜你喜欢
  • 2012-01-14
  • 2013-08-20
  • 1970-01-01
  • 2013-06-21
  • 1970-01-01
  • 2015-08-18
  • 2015-08-02
  • 2019-05-05
  • 1970-01-01
相关资源
最近更新 更多