这里是如何做到这一点。我用这个SO question 作为参考。
我测试了这段代码,它适用于您的示例:
$(document).ready(function() {
var categories = new Array();
var content = new Array();
//Get Divs
$('#input > [category]').each(function(i) {
//Add to local array
categories[i] = $(this).attr('category');
content[i] = $(this).html();
});
$('#input').empty();
//Sort Divs
var category_sort_order = ['any', 'product', 'download'];
for(i = 0; i < category_sort_order.length; i++) {
//Grab all divs in this category and add them back to the form
for(j = 0; j < categories.length; j++) {
if(categories[j] == category_sort_order[i]) {
$('#input').append('<div category="' +
category_sort_order[i] + '">'
+ content[j] + '</div>');
}
};
}
});
工作原理
首先,此代码需要 JQuery 库。如果你目前没有使用它,我强烈推荐它。
代码首先获取包含类别属性的输入 div 的所有子 div。然后它将它们的 html 内容和它们的类别保存到两个单独的数组中(但在同一位置。
接下来清除输入div下的所有div。
最后,它会按照您在数组中指定的顺序遍历您的类别,并以正确的顺序附加匹配的子 div。
For 循环部分
@eyelidlessness 很好地解释了 for 循环,但我也会尝试一下。在这段代码的上下文中。
第一行:
for(i = 0; i < category_sort_order.length; i++) {
表示后面的代码(大括号 { code } 内的所有内容)将重复多次。尽管格式看起来很古老(而且有点过时),但它说:
- 创建一个名为 i 的数字变量并将其设置为零
- 如果该变量小于 category_sort_order 数组中的项目数,则执行括号中的内容
- 括号结束后,将变量 i 加一(i++ 表示加一)
- 然后它重复第二步和第三步,直到 i 最终大于该数组中的类别数。
A.K.A 括号中的内容将为每个类别运行一次。
继续... 对于每个类别,都会调用另一个循环。这个:
for(j = 0; j < categories.length; j++) {
遍历我们刚刚从屏幕上删除的 div 的所有类别。
在这个循环中,if 语句检查屏幕上的任何 div 是否与当前类别匹配。如果是,他们正在追加,如果不是,则循环继续搜索,直到遍历每个 div。