Hmm, what about:

$(function() {
    var selection = $(".container");
    var target = $("a:first");
    while (target.parent().length && (target = target.parent()))
        if (selection.filter(function(){return this == target.get(0)}).length)
            break;
    $(target).css('background-color', 'red');
});

That avoids the initial parents() loop, and returns immediately
without needing to filter targetParents for every container.



On Fri, Feb 6, 2009 at 6:02 PM, Jörn Zaefferer
<joern.zaeffe...@googlemail.com> wrote:
>
> Thanks David, that got me thinking in the right direction, ending up
> with this: http://jsbin.com/oyiyu/edit
>
> $(function() {
>  var selection = $(".container");
>  var target = $("a:first");
>  var targetParents = target.parents();
>  var filtered = selection.filter(function() {
>    var container = this;
>    return targetParents.filter(function() { return this == container;
> }).length;
>  });
>  filtered.css("background-color", "red");
> });
>
> That selects the target's parents once, and filters them once for each
> container, which is quite acceptable. There probably still is some
> better way...
>
> Jörn
>
> On Fri, Feb 6, 2009 at 6:09 PM, David Zhou <da...@nodnod.net> wrote:
>>
>> What about something like (and this is very rough, but hopefully
>> conveys the general idea):
>>
>> jQuery.fn.hasDescendant = function(descendant) {
>>    jQuery.data(this.get(0), "has_d", "found");
>>    descendant = jQuery(descendant);
>>    while (descendant.parent().length) {
>>        if (jQuery.data(descendant.parent().get(0), "has_d") == "found") {
>>            jQuery.removeData(descendant.parent().get(0), "has_d");
>>            return true;
>>        } else
>>            descendant = descendant.parent();
>>    }
>>    jQuery.removeData(this.get(0), "has_d");
>>    return false;
>> }
>>
>> -- dz
>>
>>
>>
>> On Fri, Feb 6, 2009 at 10:43 AM, Jörn Zaefferer
>> <joern.zaeffe...@googlemail.com> wrote:
>>>
>>> Nope, that isn't it. My example is simplified, and the target comes an
>>> event triggered elsewhere. So target is just a reference to a DOM
>>> element, and can't be replaced with some selector.
>>>
>>> Jörn
>>>
>>> On Fri, Feb 6, 2009 at 3:46 PM, David Zhou <da...@nodnod.net> wrote:
>>>>
>>>> Isn't that basically:
>>>>
>>>> if ($('.container a:first').length)
>>>>    $('.container').css('background-color', 'red');
>>>>
>>>> Unless I misunderstand what you're asking for?
>>>>
>>>> -- dz
>>>>
>>>>
>>>>
>>>> On Fri, Feb 6, 2009 at 6:58 AM, Jörn Zaefferer
>>>> <joern.zaeffe...@googlemail.com> wrote:
>>>>>
>>>>> I'm trying to solve the follow selector problem: Assuming two
>>>>> container elements that both have arbitrary descendents. Given a
>>>>> jQuery object containing these containers and one descendent of any of
>>>>> these, whats the most effecient way to find the correct parent
>>>>> element? Neither parents() nor closest() helps, as there is no
>>>>> sufficient simple selector available.
>>>>> In other words, I want to filter a selection by a descendent.
>>>>>
>>>>> My naiive implementation goes through all descendents, which isn't
>>>>> really acceptable: http://jsbin.com/uhama/edit
>>>>>
>>>>> Ideas?
>>>>>
>>>>> Jörn
>>>>>
>>>>> >
>>>>>
>>>>
>>>> >
>>>>
>>>
>>> >
>>>
>>
>> >
>>
>
> >
>

--~--~---------~--~----~------------~-------~--~----~
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