我需要你的帮助。
如何在现有代码中添加构建功能,这样我就可以使用输入框在ul列表中进行搜索,并自动突出显示每个匹配项,如搜索(查找类型)样式?
我是jQuery友好的:)
对于小提琴手来说,这里有一个小提琴:http://jsfiddle.net/83sPQ/1/
这是标记:
<!DOCTYPE html>
<html>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<style type="text/css">
* {
font-family: Segoe UI;
font-size: 9pt;
}
#refdocs {
border: 0;
width: 100%;
height: auto;
padding-left: 2px;
}
#refdocs_main {
border: 1px solid rgb(170,170,170);
width: 179px;
overflow: hidden;
margin-top: 1px;
}
#refdocs_input{
border-bottom: 1px solid rgb(170,170,170);
height: 20px;
}
#refdocs_wrapper{
height: 100px;
overflow-y: scroll;
overflow-x: hidden;
}
#refdocs_list {
width: 100%;
}
#refdocs_list ul {
margin: 0;
padding: 0px;
list-style-type: none;
}
#refdocs_list li {
cursor: default;
padding: 2px;
}
.selected {
background: rgb(228,228,228);
}
</style>
<script type="text/javascript">
window.onload = function() {
$('#refdocs_list ul li').click(function () {
$('#refdocs_list ul li').removeClass('selected');
$(this).addClass('selected');
document.getElementById('refdocs').value = $(this).text()
});
}
</script>
</head>
<body>
<div id="refdocs_main">
<div id="refdocs_input"><input type="text" id="refdocs"></div>
<div id="refdocs_wrapper">
<div id="refdocs_list">
<ul>
<li>9094203</li>
<li>9279863</li>
<li>9023698</li>
<li>8993127</li>
<li>9037891</li>
<li>(red)</li>
<li>tiger</li>
<li>The lion</li>
<li>Ted</li>
</ul>
</div>
</div>
</div>
</body>
</html>
答案 0 :(得分:2)
$('#refdocs').on('keyup change', function () {
var search = $(this).val();
$('#refdocs_list li').each(function () {
var val = $(this).text();
$(this).toggle( !! val.match(search)).html(
val.replace(search, function(match) {
return '<mark>'+match+'</mark>'}, 'gi')
);
});
});
每当用户输入时,li都会根据它们是否与正则表达式匹配而动态隐藏或显示。他们的文本也使用搜索文本作为正则表达式突出显示,以匹配标记标记。
http://jsfiddle.net/acbabis/4cfQ8/
编辑:根据请求,这是一个更强大的解决方案:
$('#refdocs').on('keyup change', function () {
var search = $(this).val();
var searchLen = search.length;
// Case-insensitive search with regex characters escaped
// For case-sensitive, no regex is needed. Use indexOf() instead of search().
// Attr: http://stackoverflow.com/a/3561711/2993478
var regex = new RegExp(
search.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'), 'i');
$('#refdocs_list li').each(function () {
var li = $(this);
var val = li.text();
if (searchLen === 0) {
li.show().text(val); // Remove inner markup
return;
}
var index;
var isMatch = false;
li.html('');
while ((index = val.search(regex)) != -1) {
isMatch = true;
if (index !== 0) {
var nonMatch = val.substring(0, index);
li.append($('<span>').text(nonMatch));
}
var match = val.substring(index, index + searchLen);
val = val.substring(index + searchLen);
li.append($('<mark>').text(match));
}
if (val.length) {
li.append($('<span>').text(val));
}
li.toggle(isMatch); // Optional. Hide non-matches
});
});
此代码依赖于jQuery text()函数对HTML转义字符的能力。
答案 1 :(得分:1)
这应该是一个合理的解决方案:
$('#refdocs').keyup(function (event) {
var text = $(this).val();
$('#refdocs_list ul li').each(function () {
var elem = $(this);
elem.removeClass('selected');
if (elem.html().indexOf(text) != -1) {
elem.addClass('selected');
}
});
});
JSFiddle: http://jsfiddle.net/83sPQ/4/