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
<[email protected]> 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 <[email protected]> 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
>> <[email protected]> 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 <[email protected]> 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
>>>> <[email protected]> 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 [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/jquery-dev?hl=en
-~----------~----~----~----~------~----~------~--~---