jQuery – sortinger les DIV par className

J’ai une liste de DIV, comme ceci:

4
3
5
1
2

et je veux les sortinger, en utilisant jQuery

Côté serveur, je peux définir l’ordre souhaité et l’inclure dans les noms de classe:

catX- 4.2

Je veux pouvoir appeler soit le premier ordre (dans mon exemple, cette DIV sera en 4ème position), soit le deuxième ordre (ce sera en 2ème position): cela explique le “4.2”

Donc, si j’appelle OrderDIV(1) j’aurai ceci:

 1 2 3 4 5 

et si j’appelle OrderDIV(2) j’aurai ceci:

 5 4 3 2 1 

(J’aurai besoin d’append d’autres commandes, comme par exemple: catX-4.2.5.6.2)

Merci beaucoup pour votre aide!

Vous avez modifié les exigences à mi-parcours … comme un vrai client. Version mise à jour avec quelques commentaires attachés. Juste pour confirmer, il y a deux variables “configurables” à l’avant.

classPrefix: le “préfixe” unique de la classe utilisée pour déterminer l’ordre de sorting (“cat” dans ce cas) listElementSelector: le sélecteur jQuery utilisé pour obtenir la liste à sortinger.

 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 ) { // -- Ssortingp 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 ensortinges, and "append" them to the list container // (this moves them to the 'back' of the list) $.each(listitems, function(idx, itm) { list.append(itm); }); } 

jQuery résume la méthode Array.prototype.sort() afin que vous puissiez l’utiliser sur des ensembles 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); 

Démo : http://jsfiddle.et/Ls2kd/9/

Pour plus de simplicité, j’ai commandé les nœuds

par leur contenu. Si vous devez utiliser l’ ID cela ne devrait pas poser de problème. Accédez simplement à a.id et supprimez la partie dont vous avez besoin pour la comparaison (regex par exemple).

Une autre chose à mentionner, InternetExplorer n’est pas au courant de .textContent et devrait donc être a.textContent || a.text a.textContent || a.text .

 jQuery.fn.sortElements = (function(){ var sort = [].sort; return function(comparator, getSortable) { getSortable = getSortable || function(){return this;}; var placements = this.map(function(){ var sortElement = getSortable.call(this), parentNode = sortElement.parentNode, // Since the element itself will change position, we have // to have some way of storing its original position in // the DOM. The easiest way is to have a 'flag' node: nextSibling = parentNode.insertBefore( document.createTextNode(''), sortElement.nextSibling ); return function() { if (parentNode === this) { throw new Error( "You can't sort elements if any one is a descendant of another." ); } // Insert before flag: parentNode.insertBefore(this, nextSibling); // Remove flag: parentNode.removeChild(nextSibling); }; }); return sort.call(this, comparator).each(function(i){ placements[i].call(getSortable.call(this)); }); }; })(); 

Utilisez ces critères de sorting pour vos besoins:

 function sortCriteria(k) { var regex = /\b\d+/g; return function(a, b){ return parseInt(a.id.match(regex)[k]) > parseInt(b.id.match(regex)[k]) ? 1 : -1; } } $("#list >").sortElements(sortCriteria(0));