J'ai un ensemble de trois éléments de liste que je voudrais afficher automatiquement de haut en bas lors du chargement de la page. Idéalement en utilisant jquery ou javascript.
<ul class="list">
<li id="alpha">32</li>
<li id="beta">170</li>
<li id="delta">28</li>
</ul>
Chaque élément de la liste a besoin de son propre ID car ils ont chacun des images d'arrière-plan individuelles. Les nombres doivent contenir des nœuds de texte pour qu'un utilisateur puisse les modifier.
Ce sera probablement le moyen le plus rapide de le faire, car il n'utilise pas jQuery:
function sortList(ul){
var new_ul = ul.cloneNode(false);
// Add all lis to an array
var lis = [];
for(var i = ul.childNodes.length; i--;){
if(ul.childNodes[i].nodeName === 'LI')
lis.Push(ul.childNodes[i]);
}
// Sort the lis in descending order
lis.sort(function(a, b){
return parseInt(b.childNodes[0].data , 10) -
parseInt(a.childNodes[0].data , 10);
});
// Add them into the ul in order
for(var i = 0; i < lis.length; i++)
new_ul.appendChild(lis[i]);
ul.parentNode.replaceChild(new_ul, ul);
}
Appelez la fonction comme:
sortList(document.getElementsByClassName('list')[0]);
Vous pouvez trier d'autres listes de la même manière, et si vous avez d'autres éléments sur la même page avec la classe list, vous devez donner un identifiant à votre ul et le transmettre en l'utilisant à la place.
Modifier
Puisque vous avez mentionné que vous voulez que cela se produise sur pageLoad, je suppose que vous voulez que cela se produise dès que possible après que ul est dans le DOM, ce qui signifie que vous devez ajouter la fonction sortList
en tête de votre page et utiliser immédiatement après votre liste comme ceci:
<head>
...
<script type="text/javascript">
function sortList(ul){
var new_ul = ul.cloneNode(false);
var lis = [];
for(var i = ul.childNodes.length; i--;){
if(ul.childNodes[i].nodeName === 'LI')
lis.Push(ul.childNodes[i]);
}
lis.sort(function(a, b){
return parseInt(b.childNodes[0].data , 10) - parseInt(a.childNodes[0].data , 10);
});
for(var i = 0; i < lis.length; i++)
new_ul.appendChild(lis[i]);
ul.parentNode.replaceChild(new_ul, ul);
}
</script>
</head>
<body>
...
<ul class="list">
<li id="alpha">32</li>
<li id="beta">170</li>
<li id="delta">28</li>
</ul>
<script type="text/javascript">
!function(){
var uls = document.getElementsByTagName('ul');
sortList( uls[uls.length - 1] );
}();
</script>
...
</body>
vous pouvez utiliser ce plugin jquery léger List.js cause
[~ # ~] html [~ # ~]
<div id="my-list">
<ul class="list">
<li>
<h3 class="name">Luke</h3>
</li>
<li>
<h3 class="name">John</h3>
</li>
</ul>
</div>
Javascript
var options = {
valueNames: ['name']
};
var myList = new List('my-list', options);
Vous pouvez essayer ceci
var ul = $(".list:first");
var arr = $.makeArray(ul.children("li"));
arr.sort(function(a, b) {
var textA = +$(a).text();
var textB = +$(b).text();
if (textA < textB) return -1;
if (textA > textB) return 1;
return 0;
});
ul.empty();
$.each(arr, function() {
ul.append(this);
});
Exemple en direct: http://jsfiddle.net/B7hdx/1
Ce code triera cette liste en supposant qu'il n'y a qu'un seul .list
article:
function sortList(selector) {
var parent$ = $(selector);
parent$.find("li").detach().sort(function(a, b) {
return(Number(a.innerHTML) - Number(b.innerHTML));
}).each(function(index, el) {
parent$.append(el);
});
}
sortList(".list");
Vous pouvez le voir fonctionner ici: http://jsfiddle.net/jfriend00/FjuMB/
Pour expliquer comment cela fonctionne:
<li>
objets enfants.<li>
objets enfants du DOM, mais conserve leurs donnéesLe résultat est qu'ils sont affichés dans l'ordre trié.
Modifier:
Cette version améliorée triera même plusieurs objets de liste à la fois:
function sortList(selector) {
$(selector).find("li").sort(function(a, b) {
return(Number(a.innerHTML) - Number(b.innerHTML));
}).each(function(index, el) {
$(el).parent().append(el);
});
}
sortList(".list");
Il y a aussi ce petit plugin jQuery . Ce qui rendrait votre tri rien de plus que:
$('.list>li').tsort({attr:'id'});
Version non jquery (Vanilla javascript)
Avantages: la liste est triée sur place, ce qui ne détruit pas les LI ni ne supprime les événements qui peuvent leur être associés. Il mélange simplement les choses
Ajout d'un identifiant à l'UL:
<ul id="myList" class="list">
<li id="alpha">32</li>
<li id="beta">170</li>
<li id="delta">28</li>
</ul>
et le javascript Vanilla (pas de jquery)
// Grab a reference to the UL
var container = document.getElementById("myList");
// Gather all the LI's from the container
var contents = container.querySelectorAll("li");
// The querySelector doesn't return a traditional array
// that we can sort, so we'll need to convert the contents
// to a normal array.
var list = [];
for(var i=0; i<contents.length; i++){
list.Push(contents[i]);
}
// Sort based on innerHTML (sorts "in place")
list.sort(function(a, b){
var aa = parseInt(a.innerHTML);
var bb = parseInt(b.innerHTML);
return aa < bb ? -1 : (aa > bb ? 1 : 0);
});
// We'll reverse the array because our shuffle runs backwards
list.reverse();
// Shuffle the order based on the order of our list array.
for(var i=0; i<list.length; i++){
console.log(list[i].innerHTML);
container.insertBefore(list[i], container.firstChild);
}
Et la preuve du violon: https://jsfiddle.net/L27gpnh6/1/
Une méthode pourrait être de trier un tablea (enfin, un objet jQuery) des éléments li
et remplacer le contenu (en utilisant html
= méthode) du ul
avec le tableau d'éléments triés:
$(".list").html($(".list li").sort(function(a, b) {
return parseInt($(b).text(), 10) - parseInt($(a).text(), 10);
}));
Voici un exemple de travail .
Quelque chose comme ça devrait aider:
var $parent = $(".list");
$(".list li").sort(function (a, b) {
return window.parseInt($(a).text(), 10) - window.parseInt($(b).text(), 10);
}).remove().each(function () {
$parent.append($(this));
});
utiliser jQuery pour obtenir de l'aide:
var sortFunction = function(a, b) {
return (+($(b).text())) - (+($(a).text()));
}
var lis = $('ul.list li');
lis = Array.prototype.sort.call(lis, sortFunction);
for (var i = 0; i < lis.length; i++) {
$('ul.list').append(lis[i]);
}
Vous pouvez utiliser cette méthode:
var mylist = $('ul');
var listitems = mylist.children('li').get();
listitems.sort(function(a, b) {
var compA = $(a).text().toUpperCase();
var compB = $(b).text().toUpperCase();
return (compA < compB) ? -1 : (compA > compB) ? 1 : 0;
})
$.each(listitems, function(idx, itm) { mylist.append(itm); });
Consultez l'article ici: http://www.onemoretake.com/2009/02/25/sorting-elements-with-jquery/
Edit: Il existe un plugin jquery très cool qui fait ça: http://tinysort.sjeiti.com/
Triez la collection jQuery comme un tableau habituel, puis ajoutez chaque élément dans le bon ordre.
$(".list li").sort(function(a, b) {
return parseInt($(b).text(), 10) - parseInt($(a).text(), 10);
}).appendTo('.list');