jQuery中过滤的div并隐藏他们基于自定义数据属性标签 [英] filtering divs in jQuery and hiding them based on a custom data attribute tag
问题描述
我几个小时到构建一个简单的排序搜索结果的在线商家网站。它的工作方式是,一个HTML模板是获取搜索页面,而搜索是用Ajax进行。 JSON数据被检索,然后被创建的div元素。我已经完成了排序
,每个
和方向
各种各样的,但现在我卡上的过滤
排序,我真的不知道从哪里开始,甚至在这最后一个。
最后排序函数需要遍历每个div,检查1所选择的属性或属性为0,则隐藏
类需要一个0。切换的DIV。
我的问题是:
- 如何访问里面当前选中的div
每()
- 如何检查datatarget等于0。
隐藏它,如果它是0,或 - 如何继续
的下一次迭代每()
如果事实并非如此。
的我想要达到一个简短的伪code:
$('div.item')。每个(函数(){
datartarget =(datatarget == 0)? currentdiv.hide():datatarget;
});
这里是我的全的jQuery
code:
$(函数(){
VAR last_selector = NULL;
last_selector = $('过滤器,的.sort,.per,.direction')。点击(函数(){
VAR列表CLNAME = this.className;
变种方向= $('#方向> dd.active>一种')。ATTR('数据目标');
$('子导航。'+列表CLNAME +'')(dd.active')removeClass移除。(激活)找到。;
$(本).parent()addClass(激活)。
VAR datatarget = $(本).attr(数据目标);
如果(列表CLNAME =='排序')
{
$('div.item')tsort的({顺序:方向,ATTR:datatarget +' - 数据'});
last_selector = datatarget;
}
如果(列表CLNAME =='过滤器')
{
last_selector =(last_selector == NULL)? last_selector:$('#排序dd.active>一种')ATTR('数据目标');
$('div.item')。每个(函数(){ //不知道从哪里开始) - :
})
}
如果(列表CLNAME =='每次')
{
last_selector =(last_selector == NULL)? last_selector:$('#排序dd.active>一种')ATTR('数据目标');
。VAR ITEM_COUNT = $('div.item')的长度;
如果(ITEM_COUNT> datatarget)
{
而(ITEM_COUNT> datatarget){
$('div.item:最后的孩子)toggleClass(隐藏)。
。ITEM_COUNT = $('div.item')的长度;
}
}
如果(ITEM_COUNT< datatarget)
{
$('div.item.hide')toggleClass(隐藏)。
而(ITEM_COUNT> datatarget){
$('div.item:最后的孩子)toggleClass(隐藏)。
。ITEM_COUNT = $('div.item')的长度;
}
}
}
如果(列表CLNAME =='方向')
{
方向= $(本).attr(数据目标);
datatarget =(last_selector == NULL)? last_selector:'价格';
$('div.item')tsort的({顺序:方向,ATTR:datatarget +' - 数据'});
}
返回last_selector;
});
});
和HTML
下拉选择申报单(提供了 datatarget
的点击功能):
<一个数据下拉=方向级=按钮,下拉菜单>方向订单和LT; / A>
< DL ID =方向数据下拉列表,内容类=分导航方向F-下拉内容>
< DT><强>方向:LT; / STRONG>< / DT>
< DD类=主动><一类=方向数据目标=降序>羽绒及LT; / A>< / DD>
< DD><一类=方向数据目标=ASC>最多< / A>< / DD>
< / DL>&下;一个数据下拉=滤波器的类=按钮下拉过滤器过滤结果片剂; / A>
< DL ID =过滤器的数据下拉列表,内容类=分导航滤波器F-下拉内容>
< DT><强大的过滤器过滤结果:筛; / STRONG>< / DT>
< DD类=主动><一类=过滤器的数据目标=新>最新< / A>< / DD>
< DD><一类=过滤器的数据目标=endsoon>不久&LT结束; / A>< / DD>
< DD><一类=过滤器的数据目标=储备>没有储备与LT; / A>< / DD>
< DD><一类=过滤器的数据目标=buyitnow>立即购买< / A>< / DD>
< DD><一类=过滤器的数据目标=所有>所有< / A>< / DD>
< / DL><一个数据下拉=排序由级=按钮,下拉菜单>排序< / A>
< DL ID =排序由数据下拉列表,内容类=子导航排序F-下拉内容>
< DT><强>分类:< / STRONG>< / DT>
< DD类=主动><一类=之类的数据目标=结束>结束时间< / A>< / DD>
< DD><一类=之类的数据目标=价>价格< / A>< / DD>
< DD><一类=之类的数据目标=卖方>卖家信誉< / A>< / DD>
< / DL><一个数据下拉=效果的每个级=按钮,下拉菜单>每页搜索结果< / A>
< DL ID =结果,每个数据下拉列表,内容类=&GT每架F-下拉内容分导航;
< DT><强>每页:LT; / STRONG>< / DT>
&所述峰; dd类=活性>&下;每个数据目标=100&GT一类=; 100℃; / A>&下; / DD>
< DD><一类=每个数据目标=75> 75℃; / A>< / DD>
&所述峰; dd>&下;类别=每个数据目标=50→50&下; / A>&下; / DD>
< DD><一类=每个数据目标=25> 25℃; / A>< / DD>
< / DL>
由于barmar的帮助下,我回答我自己的问题。
我很困惑,因为我并没有意识到,这个
将反弹里面的每个()
。
下完成改变当前过滤器,首先取消隐藏任何隐藏的元素,然后将新的过滤器的我的目标。
如果(列表CLNAME =='过滤器')
{
$('div.item.hide')toggleClass(隐藏)。
last_selector =(last_selector == NULL)? last_selector:$('#排序dd.active>一种')ATTR('数据目标');
$('div.item')。每个(函数(){
($(本).attr(datatarget +' - 数据')== 0)? $(本).hide():假的;
});
}
当然,这只能满足基本的功能。我还是要修改它保持每页规则的结果。
I'm several hours into building a simple sortable search results for an online merchant site. The way it works, is that a html template is fetched of the search page, while the search is carried out with ajax. the json data is retrieved, and the div elements are then created. I have already completed the sort
,per
, and direction
sorts, but now i'm stuck on the filter
sort and i really have no idea where to even begin on this last one.
the last sort function needs to iterate over each div, checking the selected attribute for a 1 or a 0. if the attribute is 0, the hide
class needs to be toggled for the div.
My question is:
- how to access current selected div inside of
each()
- how to check if the datatarget is equal to 0. hide it if it is 0, or
- how to continue to next iteration of
each()
if it is not.
a brief pseudocode of what i'm trying to achieve:
$('div.item').each(function(){
datartarget = (datatarget == 0) ? currentdiv.hide() : datatarget;
});
Here's my full jQuery
code:
$(function(){
var last_selector = null;
last_selector = $('.filter , .sort, .per, .direction').click(function(){
var clname = this.className;
var direction = $('#direction > dd.active > a').attr('data-target');
$('.sub-nav.'+clname+'').find('dd.active').removeClass('active');
$(this).parent().addClass('active');
var datatarget = $(this).attr('data-target');
if(clname == 'sort')
{
$('div.item').tsort({order:direction,attr: datatarget+'-data'});
last_selector = datatarget;
}
if(clname == 'filter')
{
last_selector = (last_selector == null) ? last_selector : $('#sort dd.active > a').attr('data-target');
$('div.item').each(function(){
//have no idea where to start )-:
})
}
if(clname == 'per')
{
last_selector = (last_selector == null) ? last_selector : $('#sort dd.active > a').attr('data-target');
var item_count = $('div.item').length;
if(item_count > datatarget)
{
while (item_count > datatarget) {
$('div.item:last-child').toggleClass('hide');
item_count = $('div.item').length;
}
}
if(item_count < datatarget)
{
$('div.item.hide').toggleClass('hide');
while (item_count > datatarget) {
$('div.item:last-child').toggleClass('hide');
item_count = $('div.item').length;
}
}
}
if(clname == 'direction')
{
direction = $(this).attr('data-target');
datatarget = (last_selector == null) ? last_selector : 'price';
$('div.item').tsort({order:direction,attr: datatarget+'-data'});
}
return last_selector;
});
});
and the html
the dropdown selection divs(provides the datatarget
for the click functions):
<a data-dropdown="direction" class="button dropdown">Direction Order</a>
<dl id="direction" data-dropdown-content class="sub-nav direction f-dropdown content">
<dt><strong>Direction:</strong></dt>
<dd class="active"><a class="direction" data-target="desc">Down</a></dd>
<dd><a class="direction" data-target="asc">Up</a></dd>
</dl>
<a data-dropdown="filter-by" class="button dropdown">Filter Results</a>
<dl id="filter-by" data-dropdown-content class="sub-nav filter f-dropdown content">
<dt><strong>Filter Results:</strong></dt>
<dd class="active"><a class="filter" data-target="new">Newest</a></dd>
<dd><a class="filter" data-target="endsoon">Ending Soon</a></dd>
<dd><a class="filter" data-target="reserve">No Reserve</a></dd>
<dd><a class="filter" data-target="buyitnow">Buy It Now</a></dd>
<dd><a class="filter" data-target="all">All</a></dd>
</dl>
<a data-dropdown="sort-by" class="button dropdown">Sort Results</a>
<dl id="sort-by" data-dropdown-content class="sub-nav sort f-dropdown content">
<dt><strong>Sort By:</strong></dt>
<dd class="active"><a class="sort" data-target="end">End Time</a></dd>
<dd><a class="sort" data-target="price">Price</a></dd>
<dd><a class="sort" data-target="seller">Seller Reputation</a></dd>
</dl>
<a data-dropdown="results-per" class="button dropdown">Results Per Page</a>
<dl id="results-per" data-dropdown-content class="sub-nav per f-dropdown content">
<dt><strong>Per Page:</strong></dt>
<dd class="active"><a class="per" data-target="100">100</a></dd>
<dd><a class="per" data-target="75">75</a></dd>
<dd><a class="per" data-target="50">50</a></dd>
<dd><a class="per" data-target="25">25</a></dd>
</dl>
Thanks to the help of barmar, i answered my own question.
i was confused because i didn't realize that this
would be rebound inside of each()
.
the following accomplishes my goal, of changing the current filter, by first unhiding any hidden elements, then applying the new filter.
if(clname == 'filter')
{
$('div.item.hide').toggleClass('hide');
last_selector = (last_selector == null) ? last_selector : $('#sort dd.active > a').attr('data-target');
$('div.item').each(function(){
($(this).attr(datatarget+'-data') == 0) ? $(this).hide() : false;
});
}
Of course, this only addresses the basic functionality. i still have to modify it to maintain the results per page rules.
这篇关于jQuery中过滤的div并隐藏他们基于自定义数据属性标签的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!