Ok, I just landed a fix for this. .closest() should now work as
expected (in SVN rev 6080).
http://dev.jquery.com/changeset/6080

--John



On Sat, Jan 10, 2009 at 1:08 PM, John Resig <jere...@gmail.com> wrote:
> To explain what's happening here: .is()/.closest()/.filter() all
> behave very similarly.
>
> Let's assume that there's a page with two buttons on it.
>
> $("button:first")[0] // buttonA
> $("button:last")[0] // buttonB
>
> $("button").filter(":first")[0] // buttonA
> $("button").filter(":last")[0] // buttonB
>
> $("button").filter("button:first")[0] // buttonA
> $("button").filter("button:last")[0] // buttonB
>
> $("button:first").filter(":first")[0] // buttonA
> $("button:last").filter(":first")[0] // buttonB
>
> $("button:eq(0)").filter(":gt(0)") // Nothing found
> $("button:gt(0)").filter(":eq(0)")[0] // buttonB
>
> .is() and .closest() works identically to .filter().
>
> So what's happening to make .live() act weird? The difference is
> between how .find("button:first") and .filter("button:first") work.
> Since with .live() we are taking a set of elements (in this case -
> only a single element - event.target) and filtering against it. This
> weirds out the positional selectors (:first, :last, etc.) since we're
> now operating relative to that single element - not the document.
>
> $(event.target)[0] // buttonA
> $(event.target).filter(":first")[0] // buttonA
>
> // New way
> $(event.target).closest("button:first")[0] // buttonA
>
> // Old way
> $("button:first").index( event.target ) // 0
>
> I suspect that .closest() will need to be tweaked to see if it has one
> of these positional selectors and then act like a normal selector -
> which will end up being quite slower.
>
> If there's one thing that I've learned when doing the selector engine
> rewrite it's that these positional selectors, while a huge usability
> boost to users, weren't meant to be implemented in CSS selector
> engines as we know it.
>
> --John
>
>
>
> On Sat, Jan 10, 2009 at 12:36 PM, Karl Swedberg <k...@englishrules.com> wrote:
>> On Dec 30, 2008, at 3:51 PM, John Resig wrote:
>>
>> One thing i'd love to see is full selector support in $.live. since
>>
>> both $.delegate and $.listen are limited to basic selectors, leaving
>>
>> the user to filter the target inside the callback for more complicated
>>
>> things like :eq, :not, :text...etc.
>>
>> .live has full selector support.
>>
>> Hi John,
>> Since .live uses .is internally (with the .closest method), it only has
>> supprot for those selectors that .is supports, right?
>> So, $('li:eq(0)') would bind to all li elements, but $('li:eq(1)') would
>> bind to none. Such is the quirkiness of .is and "simple selectors."
>> For example (in Firebug):
>>>>> $('button:eq(2)').is('button:eq(2)')
>> false
>>>>> $('button:eq(2)').is('button:eq(0)')
>> true
>> I'm not sure how full selector support can be achieved with .live, or even
>> if it should at this point, but the documentation, at least, should be
>> clear.
>> Thoughts?
>> --Karl
>> ____________
>> Karl Swedberg
>> www.englishrules.com
>> www.learningjquery.com
>>
>>
>> >>
>>
>

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"jQuery Development" group.
To post to this group, send email to jquery-dev@googlegroups.com
To unsubscribe from this group, send email to 
jquery-dev+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/jquery-dev?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to