Side navigation
#12009 closed bug (fixed)
Opened July 03, 2012 08:28PM UTC
Closed October 30, 2012 05:36PM UTC
jQueryObject.find(element) corrupts the stack
Reported by: | Olson.dev@Gmail.com | Owned by: | mikesherov |
---|---|---|---|
Priority: | low | Milestone: | 1.9 |
Component: | traversing | Version: | 1.7.2 |
Keywords: | Cc: | ||
Blocked by: | Blocking: |
Description
Version: 1.7.2
Browser: Chrome 21 dev, Firefox 14
OS: Windows 7 64-bit
Step-by-step: http://jsfiddle.net/usY7W/
Expectation: I should be able to chain $(blah).find(element).andSelf().filter(element)
and effectively check if blah
or its descendants contain element
.
Actually happens: $(blah).find(element).andSelf().filter(element).length is always 1 because .find(element)
corrupts the stack and .andSelf().filter(element)
is always a jQuery object only wrapping element
Attachments (0)
Change History (11)
Changed July 03, 2012 08:38PM UTC by comment:1
Changed July 12, 2012 01:39AM UTC by comment:2
resolution: | → invalid |
---|---|
status: | new → closed |
The "problem line" boils down to this:
$(this).find(e.target).andSelf().filter(e.target)
That will either be 0 or 1 elements. Since the event has bubbled to this
it would seem like event.target
**must** be either this
or one of its descendants so the result will always be e.target
. So I have no idea what you're trying to do here, or what "corrupts the stack" means. Please ask for help on the forum.
Changed July 12, 2012 02:55AM UTC by comment:3
Don't confuse yourself; this has nothing to do with the bubbling. See the jsFiddle below with an even simpler example (sorry for not reducing it even further in the first place).
The problem is the implementation of jQuery.fn.find
, particularly this section:
if (typeof selector !== "string") { return jQuery(selector).filter(function () { for (i = 0, l = self.length; i < l; i++) { if (jQuery.contains(self[i], this)) { return true; } } }); }
Internally jQuery keeps a context stack. Every traversal should push the previous context on the stack. That's what makes jQuery.fn.andSelf()
work.
Because $(this).find(someElement) hits that block of code above, the stack becomes corrupted. That is, it effectively starts all over.
Thus, the next operation, .andSelf()
is going to make return a jQuery object only wrapping someElement
. Then when .filter(someElement)
gets executed, it's obviously always going to return a jQuery object with a length of 1.
Here's a simpler demonstration of the problem: http://jsfiddle.net/295X6/
It all has to do with WHAT you pass into jQuery.fn.find()
.
Changed July 12, 2012 03:04AM UTC by comment:4
http://jsfiddle.net/295X6/1/ made the output more intuitive...
Changed July 12, 2012 03:17AM UTC by comment:5
resolution: | invalid |
---|---|
status: | closed → reopened |
Okay, that example makes a lot more sense.
Changed July 12, 2012 03:17AM UTC by comment:6
status: | reopened → open |
---|
Changed July 12, 2012 03:18AM UTC by comment:7
component: | unfiled → traversing |
---|
Changed September 11, 2012 02:08AM UTC by comment:8
milestone: | None → 1.8.2 |
---|---|
owner: | → mikesherov |
priority: | undecided → low |
status: | open → assigned |
Changed September 11, 2012 02:09AM UTC by comment:9
Changed September 17, 2012 04:07PM UTC by comment:10
milestone: | 1.8.2 → 1.9 |
---|
Changed October 30, 2012 05:36PM UTC by comment:11
resolution: | → fixed |
---|---|
status: | assigned → closed |
Fix #12009. $().find( DOMElement ) should pushStack properly. Close gh-927.
Changeset: e8f91514a6f353e85d8117998087903dc7331210
I fixed some logic and removed redundant CSS. http://jsfiddle.net/usY7W/3/