搜索中断可折叠 DIV
Search breaks collapsible DIV
所以我有一个正在构建的当前 HTML 页面,其中包含 "experts" 的列表以及他们的专业类别和位置。
Here 是相关的 JSFiddle。
正如您在下面看到的,这是我的 HTML,后面是我用于搜索功能的 jQuery。
jQuery(document).ready(function($) {
$('.ui-content div').each(function() {
$(this).attr('data-search-term', $(this).text().toLowerCase());
});
$('.live-search-box').on('keyup', function() {
var searchTerm = $(this).val().toLowerCase();
$('.ui-content div').each(function() {
if ($(this).filter('[data-search-term *= ' + searchTerm + ']').length > 0 || searchTerm.length < 1) {
$(this).show();
} else {
$(this).hide();
}
});
});
<body>
<div>
<input type="text" class="live-search-box" placeholder="Search Here" />
</div>
<div>
<div role="main" class="ui-content">
<div data-role="collapsible" data-collapsed="true" data-theme="a" data-content-theme="a">
<h3>Category</h3>
<p>Defenition</p>
<div data-role="collapsible" data-theme="a" data-content-theme="a">
<h3>Sub-category</h3>
<div data-role="collapsible" data-theme="a" data-content-theme="a">
<h3>Location</h3>
<p>Point of Contact</p>
</div>
<!-- /section 1A -->
</div>
<!-- /section 1 -->
</div>
<div data-role="collapsible" data-collapsed="true" data-theme="a" data-content-theme="a">
<h3>Category2</h3>
<p>Defenition2</p>
<div data-role="collapsible" data-theme="a" data-content-theme="a">
<h3>Sub-Category</h3>
<div data-role="collapsible" data-theme="a" data-content-theme="a">
<h3>Location</h3>
<p>Point of Contact2</p>
</div>
</div>
</div>
</div>
</div>
我让搜索正常工作,唯一的问题是当我使用或清除搜索时,它会破坏我 HTML 中的可折叠
部分。
任何有关如何在搜索期间和搜索后将其折叠的帮助将不胜感激。
谢谢!
如果您直接更改 css,而不是调用 show() 和 hide(),它似乎可以按照您想要的方式工作。我猜 show() 做了一些递归的事情..
if ($(this).filter('[data-search-term *= ' + searchTerm + ']').length > 0 || searchTerm.length < 1) {
$(this).css({visibility:"visible"});
} else {
$(this).css({visibility:"hidden"});
}
问题是您使用 .hide()
在 CSS 中设置了 display: none
。但是在清除搜索字段后,您永远不会重置它。您应该添加额外的检查以重新显示隐藏的元素。
if (!searchTerm || searchTerm=='') {
$(this).show();
}
如果你把它放在你的 .each()
循环中,你应该在这方面做得很好。
但另一个问题是解决搜索字段为空时出现的控制台错误。我修改了您的 if
检查以查看 searchTerm
是否存在。
if (searchTerm && $(this).filter('[data-search-term *= ' + searchTerm + ']').length > 0 || searchTerm.length < 1)
https://jsfiddle.net/dgaz8n5k/5/
更新
我误读了你的问题,无法理解你真正在问什么。有几件事需要处理(从我的角度来看)。但是要解决您的问题,请使用以下代码
$('.ui-content > div').each(function () {
if (searchTerm && $(this).filter('[data-search-term *= ' + searchTerm + ']').length > 0 || searchTerm.length < 1) {
$(this).show();
} else {
$(this).hide();
}
});
问题出在您的 select 或 $('.ui-content div')
上。您正在遍历 .ui-content
的每个子 div
。然后,当 .show()
被调用时,您将每个设置为 display:block
,强制它们不再折叠。我不太确定为什么它会破坏切换。但我敢肯定这是因为子样式已被覆盖。
所以解决方案是 select 只是 .ui-content
的直系后代 child selector: >
。
我仍在 if
块中对 searchTerm
使用检查。
更新 2
更新后的 fiddle 反映了我之前的更新:https://jsfiddle.net/dgaz8n5k/17/
所以我有一个正在构建的当前 HTML 页面,其中包含 "experts" 的列表以及他们的专业类别和位置。
Here 是相关的 JSFiddle。
正如您在下面看到的,这是我的 HTML,后面是我用于搜索功能的 jQuery。
jQuery(document).ready(function($) {
$('.ui-content div').each(function() {
$(this).attr('data-search-term', $(this).text().toLowerCase());
});
$('.live-search-box').on('keyup', function() {
var searchTerm = $(this).val().toLowerCase();
$('.ui-content div').each(function() {
if ($(this).filter('[data-search-term *= ' + searchTerm + ']').length > 0 || searchTerm.length < 1) {
$(this).show();
} else {
$(this).hide();
}
});
});
<body>
<div>
<input type="text" class="live-search-box" placeholder="Search Here" />
</div>
<div>
<div role="main" class="ui-content">
<div data-role="collapsible" data-collapsed="true" data-theme="a" data-content-theme="a">
<h3>Category</h3>
<p>Defenition</p>
<div data-role="collapsible" data-theme="a" data-content-theme="a">
<h3>Sub-category</h3>
<div data-role="collapsible" data-theme="a" data-content-theme="a">
<h3>Location</h3>
<p>Point of Contact</p>
</div>
<!-- /section 1A -->
</div>
<!-- /section 1 -->
</div>
<div data-role="collapsible" data-collapsed="true" data-theme="a" data-content-theme="a">
<h3>Category2</h3>
<p>Defenition2</p>
<div data-role="collapsible" data-theme="a" data-content-theme="a">
<h3>Sub-Category</h3>
<div data-role="collapsible" data-theme="a" data-content-theme="a">
<h3>Location</h3>
<p>Point of Contact2</p>
</div>
</div>
</div>
</div>
</div>
我让搜索正常工作,唯一的问题是当我使用或清除搜索时,它会破坏我 HTML 中的可折叠
部分。
任何有关如何在搜索期间和搜索后将其折叠的帮助将不胜感激。
谢谢!
如果您直接更改 css,而不是调用 show() 和 hide(),它似乎可以按照您想要的方式工作。我猜 show() 做了一些递归的事情..
if ($(this).filter('[data-search-term *= ' + searchTerm + ']').length > 0 || searchTerm.length < 1) {
$(this).css({visibility:"visible"});
} else {
$(this).css({visibility:"hidden"});
}
问题是您使用 .hide()
在 CSS 中设置了 display: none
。但是在清除搜索字段后,您永远不会重置它。您应该添加额外的检查以重新显示隐藏的元素。
if (!searchTerm || searchTerm=='') {
$(this).show();
}
如果你把它放在你的 .each()
循环中,你应该在这方面做得很好。
但另一个问题是解决搜索字段为空时出现的控制台错误。我修改了您的 if
检查以查看 searchTerm
是否存在。
if (searchTerm && $(this).filter('[data-search-term *= ' + searchTerm + ']').length > 0 || searchTerm.length < 1)
https://jsfiddle.net/dgaz8n5k/5/
更新
我误读了你的问题,无法理解你真正在问什么。有几件事需要处理(从我的角度来看)。但是要解决您的问题,请使用以下代码
$('.ui-content > div').each(function () {
if (searchTerm && $(this).filter('[data-search-term *= ' + searchTerm + ']').length > 0 || searchTerm.length < 1) {
$(this).show();
} else {
$(this).hide();
}
});
问题出在您的 select 或 $('.ui-content div')
上。您正在遍历 .ui-content
的每个子 div
。然后,当 .show()
被调用时,您将每个设置为 display:block
,强制它们不再折叠。我不太确定为什么它会破坏切换。但我敢肯定这是因为子样式已被覆盖。
所以解决方案是 select 只是 .ui-content
的直系后代 child selector: >
。
我仍在 if
块中对 searchTerm
使用检查。
更新 2
更新后的 fiddle 反映了我之前的更新:https://jsfiddle.net/dgaz8n5k/17/