The .detach() method removes matched elements from the DOM while keeping jQuery data and event handlers intact. This tutorial covers syntax and optional selector filter (since 1.4), comparisons with .remove(), .empty(), and .appendTo(), the official toggle demo, and five practical try-it examples.
01
.detach()
Remove & keep
02
Events
Preserved
03
.data()
Preserved
04
Selector
Filter removal
05
vs .remove()
Permanent
06
Since 1.4
Core API
Fundamentals
Introduction
Dynamic pages often need to reshuffle the DOM — hide a widget during a layout change, stash a tab panel, or batch updates without destroying user interactions. When removal is temporary, jQuery provides .detach().
Available since jQuery 1.4, .detach() works like .remove() at the DOM level: matched elements disappear from the document tree. The critical difference is what jQuery keeps in memory — event handlers bound with .on() and values stored with .data() survive detachment so you can reinsert nodes later.
Store the jQuery object returned by .detach(), then call .appendTo() or .prependTo() when you need the elements back. Use .remove() instead when nodes should be discarded permanently. Browse the jQuery DOM hub for related manipulation methods.
Concept
Understanding the .detach() Method
.detach([selector]) removes matched elements from the DOM and returns the same jQuery collection. The nodes are no longer rendered, but jQuery’s internal references, bound events, and data cache remain attached to those DOM nodes in memory.
Pass an optional selector to filter which elements in the collection are detached. With no argument, every matched element is removed from the document. The return value is always the jQuery object (for chaining or storing), never a raw count or boolean.
💡
Beginner Tip
var stash = $("p").detach() removes all paragraphs from the page but keeps their click handlers. Later, stash.appendTo("body") puts them back exactly as they were — the official jQuery demo toggles detach and reinsert with a button.
Foundation
📝 Syntax
jQuery .detach() supports two forms:
Detach all matched elements — since 1.4
jQuery
.detach()
Removes every matched element from the DOM.
Returns the jQuery object with data and events preserved.
Detach with selector filter — since 1.4
jQuery
.detach( selector )
selector — a string filter; only elements in the collection that also match are detached.
Useful when a parent collection contains mixed children you want to stash selectively.
Return value
Always the jQuery object containing the detached elements.
Chain .appendTo(), .prependTo(), or store in a variable for later.
Official toggle pattern
The jQuery API documentation demo detaches paragraphs on button click and reinserts them on the next click:
jQuery
$( "p" ).click(function() {
$( this ).toggleClass( "off" );
});
var p;
$( "button" ).click(function() {
if ( p ) {
p.appendTo( "body" );
p = null;
} else {
p = $( "p" ).detach();
}
});
Cheat Sheet
⚡ Quick Reference
Goal
Code
Detach all matched nodes
var stash = $("#panel").detach()
Detach with selector filter
$("#list li").detach(".inactive")
Reinsert detached nodes
stash.appendTo("#container")
Prepend instead of append
stash.prependTo("body")
Permanent removal
$("#temp").remove()
Clear children only
$("#container").empty()
Compare
📋 .detach() vs .remove() vs .empty() vs .appendTo()
Four related DOM APIs — pick the right removal or reinsertion strategy.
.detach()
keep data
Remove elements from DOM; preserve jQuery data and events for reinsertion
.remove()
discard
Remove elements and clean up jQuery associations permanently
.empty()
children
Remove all child nodes inside the matched element; parent stays in DOM
.appendTo()
reinsert
Move matched elements into a target container — pair with .detach()
Hands-On
Examples Gallery
Examples 1–5 follow the official jQuery API documentation and common production patterns. Use DevTools or the Try-it links to run each snippet in the browser.
📚 Getting Started
Official jQuery demo and selector-filter patterns.
Example 1 — Official Demo: Toggle Detach and Reinsert
Paragraphs toggle an off class on click. A button detaches all paragraphs from the DOM or reinserts them with .appendTo() — click handlers survive both operations.
jQuery
$( "p" ).click(function() {
$( this ).toggleClass( "off" );
});
var p;
$( "button" ).click(function() {
if ( p ) {
p.appendTo( "body" );
p = null;
} else {
p = $( "p" ).detach();
}
});
Click paragraph → toggles "off" class
Click button → paragraphs vanish from DOM (detached)
Click button again → paragraphs reappear; click still works
.detach() returns the same jQuery collection for reinsertion
How It Works
The variable p holds the detached jQuery object. First button click calls $( "p" ).detach(); the second calls p.appendTo( "body" ). Event handlers bound before detachment remain active after reinsertion.
Example 2 — Detach With Selector Filter
Remove only list items marked inactive while leaving active items in the DOM.
Active items remain in #todo-list
.inactive items removed and appended to #archive
Selector filters the collection before detaching
How It Works
The optional selector argument limits detachment to elements in the jQuery set that also match .inactive. The returned collection contains only the detached nodes, ready to move elsewhere.
📈 Practical Patterns
Event preservation, data comparison, and tab-panel reinsertion.
Example 3 — Event Handlers Survive Detach
Bind a click handler, detach the button, reinsert it — the handler still fires.
Button moved from original location to #panel
Click still logs "Clicked after detach!"
Handlers bound with .on() persist through detach
How It Works
.detach() removes the node from the document but does not unbind jQuery event listeners. After .appendTo(), the element behaves exactly as before detachment. With .remove(), those handlers would be destroyed.
Example 4 — .data() Preserved vs .remove()
Compare jQuery data survival after detach versus permanent removal.
jQuery
$( "#box-a" ).data( "score", 42 );
var detached = $( "#box-a" ).detach();
console.log( detached.data( "score" ) ); // 42
$( "#box-b" ).data( "score", 42 );
$( "#box-b" ).remove();
// $.data on #box-b is gone — element discarded
detached.data("score") → 42 (data intact)
After .remove(), jQuery data cache for #box-b is cleaned up
Use detach when widget state must survive temporary removal
How It Works
jQuery stores arbitrary data in an internal cache keyed to DOM nodes. .detach() leaves that cache intact; .remove() triggers cleanup. This is why complex widgets with stored state should use detach, not remove, when temporarily hidden.
Example 5 — Tab Panel Detach and Reinsert
Stash the active tab panel off-DOM while switching tabs, then reinsert without rebuilding markup or rebinding events.
jQuery
var activePanel = null;
$( ".tab-btn" ).on( "click", function() {
var target = $( this ).data( "tab" );
if ( activePanel ) {
activePanel.detach();
}
activePanel = $( "#" + target );
activePanel.appendTo( "#tab-content" );
$( ".tab-btn" ).removeClass( "active" );
$( this ).addClass( "active" );
});
Switch tab → previous panel detached (not destroyed)
New panel appended to #tab-content
Form inputs and handlers inside panel preserved
Classic pattern for single-container tab UIs
How It Works
Each panel stays in memory with its events and .data() intact. Detaching the outgoing panel before appending the incoming one avoids duplicate IDs in the DOM and skips expensive re-initialization on every tab switch.
Applications
🚀 Common Use Cases
Tab interfaces — detach inactive panels, append the active one to a shared container.
Layout reflow — stash widgets during responsive breakpoint changes without losing state.
Modal staging — detach dialog content when closed, reinsert when reopened with handlers intact.
Sortable lists — detach dragged items, append to new parent on drop.
Batch DOM updates — detach a subtree, modify off-DOM, reinsert once to reduce reflows.
Archive inactive rows — .detach(".done") moves completed items to a hidden archive node.
🧠 How .detach() Removes and Preserves State
1
Match DOM elements
jQuery collection points at live nodes in the document tree.
Select
2
Optional selector filter
If provided, only matching elements in the set are detached.
Filter
3
Remove from document
Nodes are disconnected from their parent; not rendered on screen.
DOM
4
📦
Return jQuery object
Same collection with data and events intact — ready for .appendTo().
Important
📝 Notes
Available since jQuery 1.4 — optional selector filter included from the start.
Functionally identical to .remove() at the DOM level; differs only in jQuery cleanup behavior.
Event handlers bound with .on() and data stored with .data() are preserved.
Detached elements are not visible but remain in memory until garbage-collected or reinserted.
Store the returned jQuery object — re-querying by ID after detach may fail if the node is not in the document.
Use .remove() when you will never need the nodes or their jQuery state again.
.empty() clears children inside a parent; .detach() removes the matched elements themselves.
Compatibility
Browser Support
.detach() has been part of jQuery since 1.4+. It relies on standard DOM removeChild operations under the hood. Works in all browsers supported by your jQuery build — IE6+ through modern evergreen browsers in legacy jQuery versions, and all current browsers in jQuery 3.x and 4.x.
✓ jQuery 1.4+
jQuery .detach()
Universal DOM removal API that preserves jQuery state across jQuery 1.x, 2.x, 3.x, and 4.x. No browser-specific polyfills required — jQuery normalizes parent-child removal. Pair with .appendTo() for cross-browser reinsertion.
100%With jQuery loaded
Google ChromeAll versions · Desktop & Mobile
Full support
Mozilla FirefoxAll versions · Desktop & Mobile
Full support
Apple SafariAll versions · macOS & iOS
Full support
Microsoft EdgeAll versions · Chromium & Legacy
Full support
Internet ExplorerIE 6+ · Legacy environments
Full support
OperaAll modern versions
Full support
.detach()Universal
Bottom line: Default choice for temporary DOM removal when events and data must survive.
Wrap Up
Conclusion
The jQuery .detach() method removes matched elements from the document while preserving jQuery data and event handlers. Store the returned jQuery object and reinsert with .appendTo() or .prependTo() when you need the nodes back — exactly as the official toggle demo demonstrates.
Choose .remove() for permanent deletion and .empty() when you only need to clear child nodes. Next up: clearing container contents with .empty().
Use .detach() when you plan to reinsert elements later
Store the returned jQuery object in a variable for reinsertion
Pair detach with .appendTo() for tab and widget patterns
Use the selector argument to detach specific children from a collection
Prefer detach over remove when widgets have bound events or .data()
❌ Don’t
Use .detach() when nodes should be permanently destroyed
Forget to hold the returned jQuery object before the nodes leave the DOM
Confuse .detach() with .empty() (children vs self)
Assume detached nodes are garbage-collected immediately
Re-query detached elements by selector instead of using the stored collection
Summary
Key Takeaways
Knowledge Unlocked
Five things to remember about .detach()
The remove-but-remember API — stash nodes, keep state.
5
Core concepts
DOM01
Remove
Off document
Detach
on02
Events
Preserved
Handlers
data03
.data()
Kept alive
Cache
→04
Reinsert
.appendTo()
Restore
≠05
vs remove
Permanent
Compare
❓ Frequently Asked Questions
.detach() removes matched elements from the DOM and returns the same jQuery collection. Unlike .remove(), it preserves jQuery data and event handlers bound with .on() so you can reinsert the nodes later with .appendTo() or .prependTo(). Available since jQuery 1.4.
Both remove elements from the document tree. .detach() keeps jQuery's internal data cache and event handlers on the nodes. .remove() deletes the elements and cleans up jQuery associations — handlers and .data() are lost. Use detach for temporary removal; use remove when nodes will never be needed again.
No. Handlers attached with .on() remain on detached elements. When you reinsert them with .appendTo(), clicks and other events still fire — the official jQuery detach demo toggles paragraphs off the page and back while click handlers keep working.
Yes. Pass an optional selector: .detach('.inactive') removes only elements in the collection that also match the selector. With no argument, .detach() removes every matched element from the DOM.
Store the jQuery object returned by .detach(): var stash = $('#panel').detach(); later call stash.appendTo('#container') or stash.prependTo('body'). The returned collection is the same jQuery object with all data and events intact.
Yes. .detach() removes the matched elements themselves from the DOM. .empty() removes all child nodes inside the matched element but keeps the parent element in place. Use empty to clear contents; use detach to stash whole nodes for later.
Did you know?
Before .detach() arrived in jQuery 1.4, developers cloned nodes or manually moved elements to a hidden container to preserve events during temporary removal. .detach() made that pattern a one-liner — and unlike cloning, it moves the original DOM nodes so element identity, form input values, and jQuery’s internal cache all stay attached to the same objects.