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