reorder list elements - jQuery?

JavascriptJquery

Javascript Problem Overview


Is it possible to reorder <li> elements with JavaScript or pure jQuery. So if I have a silly list like the following:

<ul>
    <li>Foo</li>
    <li>Bar</li>
    <li>Cheese</li>
</ul>

How would I move the list elements around? Like put the list element with Cheese before the list element with Foo or move Foo to after Bar.

Is it possible? If so, how?

Javascript Solutions


Solution 1 - Javascript

var ul = $("ul");
var li = ul.children("li");

li.detach().sort();
ul.append(li);

This is a simple example where <li> nodes are sorted by in some default order. I'm calling detach to avoid removing any data/events associated with the li nodes.

You can pass a function to sort, and use a custom comparator to do the sorting as well.

li.detach().sort(function(a, b) {
   // use whatever comparison you want between DOM nodes a and b
});

Solution 2 - Javascript

If someone is looking to reorder elements by moving them up/down some list one step at a time...

//element to move
var $el = $(selector);

//move element down one step
if ($el.not(':last-child'))
    $el.next().after($el);

//move element up one step
if ($el.not(':first-child'))
    $el.prev().before($el);

//move element to top
$el.parent().prepend($el);

//move element to end
$el.parent().append($el);

Solution 3 - Javascript

One of my favorite things about jQuery is how easy it is to write tiny little add-ons so quickly.

Here, we've created a small add-on which takes an array of selectors, and uses it to order the children of the target elements.

// Create the add-on

$.fn.orderChildren = function(order) {
	this.each(function() {
		var el = $(this);
		for(var i = order.length - 1; i >= 0; i--) {
			el.prepend(el.children(order[i]));
		}
	});
	return this;
};


// Call the add-on

$(".user").orderChildren([
	".phone",
	".email",
	".website",
	".name",
	".address"
]);

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<ul class="user">
	<li class="name">Sandy</li>
	<li class="phone">(234) 567-7890</li>
	<li class="address">123 Hello World Street</li>
	<li class="email">[email protected]</li>
	<li class="website">https://google.com</li>
</ul>
<ul class="user">
	<li class="name">Jon</li>
	<li class="phone">(574) 555-8777</li>
	<li class="address">123 Foobar Street</li>
	<li class="email">[email protected]</li>
	<li class="website">https://apple.com</li>
</ul>
<ul class="user">
	<li class="name">Sarah</li>
	<li class="phone">(432) 555-5477</li>
	<li class="address">123 Javascript Street</li>
	<li class="email">[email protected]</li>
	<li class="website">https://microsoft.com</li>
</ul>

The function loops backwards through the array and uses .prepend so that any unselected elements are pushed to the end.

Solution 4 - Javascript

Here is a jQuery plugin to aid with this functionality: http://tinysort.sjeiti.com/

Solution 5 - Javascript

something like this?

var li = $('ul li').map(function(){
              return this;
         })​.get();
$('ul').html(li.sort());

demo

I was somewhat lost you may be wanting something like this...

$('ul#list li:first').appendTo('ul#list'); // make the first to be last...
$('ul#list li:first').after('ul#list li:eq(1)'); // make first as 2nd...
$('ul#list li:contains(Foo)').appendTo('ul#list'); // make the li that has Foo to be last...

more of it here1 and here2

Solution 6 - Javascript

Have a look at jquery ui sortable

http://jqueryui.com/demos/sortable/

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionAlexView Question on Stackoverflow
Solution 1 - JavascriptAnuragView Answer on Stackoverflow
Solution 2 - JavascriptalexgView Answer on Stackoverflow
Solution 3 - JavascriptSandy GiffordView Answer on Stackoverflow
Solution 4 - JavascriptdennismonsewiczView Answer on Stackoverflow
Solution 5 - JavascriptReigelView Answer on Stackoverflow
Solution 6 - JavascriptKarl JohanView Answer on Stackoverflow