.find() gets the descendants of each element in the current set, filtered by a selector, jQuery object, or DOM element. It searches the whole subtree — not just one level. Selector form since jQuery 1.0; element/jQuery argument since 1.6.
Remember
$("li.item-ii").find("li") → nested li only (not item-ii)
$("p").find("span") → spans inside paragraphs
$("div").find("*") → all element descendants
.find() → any depth down
.children() → direct children only
.filter() → narrow current set (no drill-down)
// context shorthand (official):
$("li.item-ii").find("li") === $("li", "li.item-ii")
Start from a parent set, then search inside for matching descendants.
Select the container(s): $("li.item-ii"), $("#card"), and so on.
Call .find(selector) — the selector is required.
Remember: the starting element is never included.
Use "*" when you need every descendant element.
Piece
Required?
Role
Starting set
Yes
Roots whose subtrees are searched
Selector / element / jQuery
Yes
Filter for matching descendants
Depth
—
All levels (unlike .children())
Pseudocode
Pseudocode
roots = current jQuery set
result = empty
for each root in roots:
for each descendant of root (any depth):
if descendant matches selector:
keep descendant
return jQuery(result) // new set; roots not included
Reference
Cheat Sheet
Keep these facts handy while searching descendants.
Topic
Detail
Syntax
.find(selector | element | jQuery)
Direction
Down the tree (all depths)
Includes self?
No — descendants only
vs .children()
Any depth vs one level
vs .filter()
Drill in vs narrow current set
All descendants
.find("*")
Since
1.0 (selector); 1.6 (element/jQuery)
Try it
Live Preview
Run finds on the official-style nested list starting at item II.
Start: li.item-ii. .find("li") matches A, B, 1, 2, 3, C — not II itself.
I
II
A
B
1
2
3
C
III
Result
$("li.item-ii").find("li")
matched: 6
text: A, B, 1, 2, 3, C
/* descendants only — II excluded */
Code
jQuery Examples
Short, copy-ready snippets. Open a browser console with jQuery loaded, or use Try It Yourself for a live editor.
Example 1 — Official Nested List: .find("li")
Find every nested list item under item II (jQuery API example).
Required argument. Official docs: pass "*" for all descendants.
Every element tag. Headings, paragraphs, spans, and so on.
Not the root.#card itself is excluded.
Text nodes skipped."*" matches elements only.
Edge Cases & Pitfalls
Check these before relying on .find() in real projects.
self
Starting element excluded
Even if the root matches the selector, it is not returned — only descendants are.
required
Selector is required
Unlike some tree methods, omit the argument and .find() will not work. Use "*" for everything.
depth
Not the same as .children()
Need only direct children? Use .children() — .find() can over-match deep nodes.
scope
Selector parts must lie inside
Official docs: all parts of the selector must match inside the element on which .find() is called.
Compatibility
Browser Support
.find() is a core jQuery traversing method — selector form since 1.0, element/jQuery argument since 1.6. It works wherever jQuery runs.
✓ jQuery 1.0+ · Core API
jQuery .find()
Works in all browsers with jQuery. Prefer a tight root set, then find — same idea as context selectors.
100%jQuery environments
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
.find()Core method
Bottom line: Safe to use for descendant searches; pass "*" when you need every element under a root.
Analysis
Performance Notes
Approach
Cost
Best for
$("#id").find("sel")
Small scoped search
Typical UI work
$("div").find("sel")
Many roots × subtrees
Avoid on huge pages
$("#id").children("sel")
One level only
When depth is not needed
Start from the smallest reliable root (often an id), then .find(). Prefer .children() when you only need the next level.
Remember
Key Takeaways
Role: search all descendants under the current set.
Not self: the starting element is never included.
vs children: any depth vs one level — see .children().
Required arg: use .find("*") for every element descendant.
One line:.find() means “search inside, any depth” — the root itself stays out of the result.
Frequently Asked Questions
.find() searches through all descendants of each element in the current jQuery set and returns a new jQuery object of matching nodes. Available since 1.0 (selector); element/jQuery argument since 1.6.
.children() travels only one level down (direct children). .find() searches every depth — grandchildren and deeper. Official docs: they are similar except for how far down they go.
.find() drills into descendants and can return nodes that were not in the original set. .filter() only narrows the current set — it never adds deeper nodes.
Yes. Unlike many traversing methods, .find() requires an argument. Pass "*" to get every descendant element at any depth.
No. Only descendants are candidates. $("li.item-ii").find("li") does not include item II itself — only nested li elements inside it.
Yes for the common case. Official docs: $("li.item-ii").find("li") is equivalent to $("li", "li.item-ii").