Aquí se muestra cómo hacerlo. Utilicé este SO question como referencia.
He probado el código y funciona correctamente para su ejemplo:
$(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>');
}
};
}
});
Cómo funciona
En primer lugar, este código requiere la biblioteca jQuery. Si no lo está usando actualmente, lo recomiendo encarecidamente.
El código comienza por obtener todos los divs secundarios del div de entrada que contienen un atributo de categoría. A continuación, se ahorra su contenido html y su categoría de dos matrices independientes (pero en el mismo lugar.
A continuación se borra todos los divs bajo el div de entrada.
Por último, se pasa a través de sus categorías en el orden se especifica en la matriz y anexa los divs juego de niños en el orden correcto.
la sección de bucle para
@eyelidlessness hace un buen trabajo de explicar para los lazos, pero también va a tomar un golpe en en el contexto de este código.
La primera línea:
for(i = 0; i < category_sort_order.length; i++) {
significa que el código que sigue (todo dentro de los corchetes {code}) se repite un número de veces.Aunque el formato parece arcaica (y sorta es) que dice:
- crear una variable de número llamado i y la pusieron igual a cero
- Si esa variable es menor que el número de elementos de la matriz category_sort_order, a continuación, ¿Qué hay en los corchetes
- Cuando los corchetes terminan, agregue uno a la variable i (i ++ significa agregar uno)
- Luego repite los pasos dos y tres hasta que finalmente sea más grande que el número de categorías en esa matriz.
A.K.A lo que esté entre paréntesis se ejecutará una vez para cada categoría.
Pasando a ... para cada categoría, se invoca otro ciclo. Este:
for(j = 0; j < categories.length; j++) {
recorre todas las categorías de los divs que acabamos de eliminar de la pantalla.
Dentro de este ciclo, la instrucción if comprueba si alguno de los divs de la pantalla coincide con la categoría actual. Si es así, se agregan, si no, el ciclo continúa buscando hasta que pasa por cada div.
Esto es realmente elegante Russ. Buen trabajo. –