使用 jQuery 搜索 html(自动完成)
我有一堆隐藏的 div,里面有一个表。用户需要在第一个单元格中搜索名称(可以包含空格),然后返回 div ID。
我研究了 jQueryUI 自动完成插件,但在让它处理多个值时遇到问题。插件 docs 和 演示。
我使用“自定义数据和显示”示例作为预定义数据数组的基础,但我想避免它并简单地使用选择器。
搜索框
<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();
}
});
属性“label”是包含填充下拉结果 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 数组吗?
I have a bunch of hidden divs with a single table inside them. Users need to search for a name (can contain spaces) within the first th cell, and then return the div ID.
I looked into the jQueryUI autocomplete plugin, but having problems getting it to work with multiple values. Plugin docs and demos.
I use "Custom data and display" example as base with a predefined data array, but I'd like to avoid it and simply use selector.
Search box
<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();
}
});
Property "label" is the expected name to contain values to fill the dropdown result UL. Changing it requires overwriting the default _renderItem method, like this
$('#search_name').autocomplete({
stuff
})
.data("autocomplete")._renderItem = function(ul, item) {
return $("<li></li>")
.data("item.autocomplete", item)
.append("<a>" + item.name + "</a>")
.appendTo(ul);
};
But it seems flawed.
Can I make a selector (or callback function) to avoid having to make the nameAC array ?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
Kim,我认为你的做法非常可靠。如果您想要由函数生成源,我建议您更轻松地解析数据,即在每个 div 的名称周围放置一个 span 标签。
话虽这么说,这是一种处理现有数据的方法。它可能并不完美,因此我的建议:
显然,如果您的用户名是这样的:
John Doe
,那么标签会更容易:$(this).find('span.name').text()
您可以在此处查看此操作的简单版本:http://jsfiddle.net/ryleyb/MYCbX/
编辑:我应该提到,这是从自动完成中调用的,如下所示:
Kim, I think the way you are doing it is pretty solid. If you want to have the source generated by a function, I suggest you make it easier to parse your data, i.e. by putting a span tag around the name in each div.
That being said, here's one way to do it with your data as it is now. It's probably not perfect, thus my suggestion:
Obviously, if your username was something like this:
<span class="name">John Doe</span>
, then the label would be easier:$(this).find('span.name').text()
You can see a simple version of this in action here: http://jsfiddle.net/ryleyb/MYCbX/
EDIT: I should have mentioned, this is called from the autocomplete like this: