我有一个DIV列表,像这样:
<div id="list">
<div class="cat1-4.2"><div>4</div></div>
<div class="cat3-3.3"><div>3</div></div>
<div class="cat2-5.1"><div>5</div></div>
<div class="cat3-1.5"><div>1</div></div>
<div class="cat3-2.4"><div>2</div></div>
</div>
Run Code Online (Sandbox Code Playgroud)
我想用jQuery对它们进行排序
在服务器端,我可以定义所需的订单,并在类名中包含此订单:
catX- 4.2
我想能够调用第一个订单(在我的例子中,这个DIV将在第4个位置),或者第二个订单(它将在第2个位置):这解释了"4.2"
所以,如果我打电话,OrderDIV(1)我会有这个:
1
2
3
4
5
Run Code Online (Sandbox Code Playgroud)
如果我打电话,OrderDIV(2)我会这样:
5
4
3
2
1
Run Code Online (Sandbox Code Playgroud)
(我需要添加更多订单,例如:catX-4.2.5.6.2)
非常感谢您的帮助!
jQuery抽象Array.prototype.sort()方法,以便您可以在包装集上使用它:
var OrderDIV = function(asc) {
$('div#list').children().detach().sort(function(a,b) {
return asc ? (+a.textContent) - (+b.textContent) : (+b.textContent) - (+a.textContent);
}).appendTo(document.body);
}
OrderDIV(0);
Run Code Online (Sandbox Code Playgroud)
演示:http://jsfiddle.et/Ls2kd/9/
为简单起见,我<div>按其内容对节点进行了排序.如果你需要使用ID它应该不是一个问题.只需访问a.id并去掉比较所需的部分(例如regex).
另外要提一下,InternetExplorer并不知道.textContent它应该是什么a.textContent || a.text.
你在中途改变了要求......就像真正的客户一样.更新版本附带一些注释.只是为了确认,前面有两个"可配置"变量.
classPrefix:用于确定排序顺序的类的"前缀"(本例中为"cat")listElementSelector:用于获取要排序的列表的jQuery选择器.
function OrderDIV(position)
{
var classPrefix = 'cat';
var listElementSelector = '#list';
// -- Decrement the position to make it 0 based
position--;
// -- Parses the "position" section from the given classes, and
// then the position at the specific index requested.
var parsePosition = function(classes, pos) {
// -- Split the "classes" into an array.
var classList = classes.split(' ');
// -- Determine which of the "classes" starts with the prefix we want.
for( var i in classList )
{
if( classList[i].substr(0, classPrefix.length) == classPrefix )
{
// -- Strip out the positions section, and split it.
var positions = classList[i].split('-')[1].split('.');
// -- return the one position we want
return positions[pos];
}
}
// -- In the event that we don't find the class we're looking for ...
return -1;
}
// -- Compares div A to div B, and returns an indicator of the order
var funcSort = function(a, b) {
// -- Use "parsePosition" to determine the sortable criteria from the classes.
var compA = parsePosition($(a).attr('class'), position);
var compB = parsePosition($(b).attr('class'), position);
return (compA < compB) ? -1 : (compA > compB) ? 1 : 0;
};
// -- Select the list element.
var list = $(listElementSelector);
// -- Select the list items, and return them as an array.
var listitems = list.children('div').get();
// -- Sort the array using the "funcSort".
listitems.sort(funcSort);
// -- Go through each of the array entries, and "append" them to the list container
// (this moves them to the 'back' of the list)
$.each(listitems, function(idx, itm) { list.append(itm); });
}
Run Code Online (Sandbox Code Playgroud)