| CARVIEW |
Select Language
HTTP/2 301
cache-status: "Netlify Edge"; fwd=miss
content-type: text/html
date: Sat, 27 Dec 2025 04:42:32 GMT
location: /examples/sortable/
server: Netlify
strict-transport-security: max-age=31536000
x-nf-request-id: 01KDF1V1MSJANGCCKVJ9GYR5FR
content-length: 98
HTTP/2 200
accept-ranges: bytes
age: 23058
cache-control: public,max-age=0,must-revalidate
cache-status: "Netlify Edge"; hit
content-encoding: gzip
content-type: text/html; charset=UTF-8
date: Sat, 27 Dec 2025 04:42:32 GMT
etag: "47b8bf320df4371f6bcb0de2836b9c0b-ssl-df"
server: Netlify
strict-transport-security: max-age=31536000
vary: Accept-Encoding
x-nf-request-id: 01KDF1V1WPF6HW1ZMRMGXNKB9T
content-length: 4121
</> htmx ~ Examples ~ Sortable
Sortable
In this example we show how to integrate the Sortable javascript library with htmx.
To begin we initialize the .sortable class with the Sortable javascript library:
htmx.onLoad(function(content) {
var sortables = content.querySelectorAll(".sortable");
for (var i = 0; i < sortables.length; i++) {
var sortable = sortables[i];
var sortableInstance = new Sortable(sortable, {
animation: 150,
ghostClass: 'blue-background-class',
// Make the `.htmx-indicator` unsortable
filter: ".htmx-indicator",
onMove: function (evt) {
return evt.related.className.indexOf('htmx-indicator') === -1;
},
// Disable sorting on the `end` event
onEnd: function (evt) {
this.option("disabled", true);
}
});
// Re-enable sorting on the `htmx:afterSwap` event
sortable.addEventListener("htmx:afterSwap", function() {
sortableInstance.option("disabled", false);
});
}
})
Next, we create a form that has some sortable divs within it, and we trigger an ajax request on the end event, fired
by Sortable.js:
<form class="sortable" hx-post="/items" hx-trigger="end">
<div class="htmx-indicator">Updating...</div>
<div><input type='hidden' name='item' value='1'/>Item 1</div>
<div><input type='hidden' name='item' value='2'/>Item 2</div>
<div><input type='hidden' name='item' value='3'/>Item 3</div>
<div><input type='hidden' name='item' value='4'/>Item 4</div>
<div><input type='hidden' name='item' value='5'/>Item 5</div>
</form>
Note that each div has a hidden input inside of it that specifies the item id for that row.
When the list is reordered via the Sortable.js drag-and-drop, the end event will be fired. htmx will then post
the item ids in the new order to /items, to be persisted by the server.
That’s it!
Server Requests ↑ Show