我有一个列表,我需要根据类名进行排序。
活跃的应该在顶部,没有类的应该在中间,而sm类应该在底部。
此外,该清单还应依赖于alfabetical。
得到这个结果的最佳观察点是什么?
<ul class="options without-border expandable2">
<li>
<label><input type="checkbox" class="filteroption" value="Acer" name="merk"> ACER</label>
</li>
<li>
<label><input type="checkbox" class="filteroption" value="Alcatel" name="merk"> ALCATEL</label>
</li>
<li class="active">
<label><input type="checkbox" class="filteroption" value="Apple" name="merk"> APPLE</label>
</li>
<li>
<label><input type="checkbox" class="filteroption" value="Blackberry" name="merk"> BLACKBERRY</label>
</li>
<li>
<label><input type="checkbox" class="filteroption" value="HTC" name="merk"> HTC</label>
</li>
<li class="active">
<label><input type="checkbox" class="filteroption" value="Huawei" name="merk"> HUAWEI</label>
</li>
<li>
<label><input type="checkbox" class="filteroption" value="LG" name="merk"> LG</label>
</li>
<li>
<label><input type="checkbox" class="filteroption" value="Nokia" name="merk"> NOKIA</label>
</li>
<li style="display: none;">
<label><input type="checkbox" class="filteroption" value="Samsung" name="merk"> SAMSUNG</label>
</li>
<li style="display: none;">
<label><input type="checkbox" class="filteroption" value="Sony" name="merk"> SONY</label>
</li>
<li class="sm sm-show" style="display: block;"><a class="showmore" href="#">Alles bekijken</a></li>
<li class="sm sm-hide" style="display: none;"><a class="showmore" href="#">minder</a></li>
</ul>
答案 0 :(得分:2)
$('.options').each(function () {
$('.active', this).prependTo(this);
$('.sm', this).appendTo(this);
});
答案 1 :(得分:1)
看起来您实际上不需要移动.sm
元素 - 如果您选择正确的方法来修改列表,它们将始终保持在同一位置:
$('.options').prepend(function() {
var elements = [].slice.call(this.querySelectorAll('li:not(.sm)'), 0);
elements.sort(function(a, b) {
return (a.className.indexOf('active') === -1) - (b.className.indexOf('active') === -1)
|| a.querySelector('input').value.localeCompare(b.querySelector('input').value)
});
return elements;
});
答案 2 :(得分:1)
我不确定您是如何处理.sm项目的,但这会让您完成大部分的排序。
var $options = $('.options'),
items = $options.find('li').get();
items.sort(function(first, second) {
var $first = $(first),
$second = $(second);
if ($first.hasClass('active') && !$second.hasClass('active')) {
// Filter .active above everything
return -1;
} else if($first.hasClass('sm') && !$second.hasClass('sm')) {
// Filter sm below everything
return 1;
}
// At this point we know that they have the same class so compare the text
return $first.find('label').text() < $second.find('label').text() ? -1 : 1;
});
// Reorder the dom
$options.html(items);