JQuery不同的后代(过滤掉结果集中的所有父项)

我需要一个方法来过滤掉结果集中其他元素的父元素。 我试着写一个插件:

jQuery.fn.distinctDescendants = function() { var nodes = []; var result = this; jQuery(result).each(function() { var node = jQuery(this).get(0); if(jQuery(node).find(result).length == 0) { nodes.push(node); } }); return nodes; }; 

当我在此示例页面上运行以下命令时:

 jQuery('body, textarea').distinctDescendants(); 

我得到(错误的)结果:

 [body.contact-page, textarea, textarea] 

这是错误的,因为body是结果中至少一个其他元素的父(两个textareas)。 因此,预期结果将是:

 [textarea, textarea] 

这有什么不对?

你为什么不使用jQuery('body > input')呢?

您可以使用以下(详细)代码来实现您想要的; 它应该作为插件代码的替代品。

 jQuery.fn.distinctDescendants = function() { var nodes = []; var parents = []; // First, copy over all matched elements to nodes. jQuery(this).each(function(index, Element) { nodes.push(Element); }); // Then, for each of these nodes, check if it is parent to some element. for (var i=0; i 0)) { if (parents.indexOf(node_to_check) < 0) { parents.push(node_to_check); } } }); } // Finally, construct the result. var result = []; for (var i=0; i 

你的方法似乎没问题,但你的例子可能是错的。 你说 –

jQuery('body, input').distinctDescendants();

我得到(错误的)结果:

 [body.contact-page, textarea, textarea] 

如果选择器中没有那个,你怎么得到textarea? 使用这种方法也要小心。 记住 –

jQuery(’div,input’)。distinctDescendants(); 意味着一些输入在正在考虑的div内部,一些在外面。 虽然结果不可预测,但显然很难猜测。 所以大部分时间都尝试使用具有类名或id的选择器。

请告诉我们您的反馈……我觉得function还可以。

我认为这是你所期待的

 jQuery('body, input').filter(function(){if($(this).children().length >0) return false; else return true; }) 

或者可能更确切

 jQuery('body, input, textarea').filter(function(){if($(this).children().length >0) return false; else return true; }) 

这将只返回文本区域(如示例中所示)

 jQuery('body, textarea').filter(function(){if($(this).children().length >0) return false; else return true; }) 

UPDATE

所以你想要这样的东西

 var elems = 'textarea'; jQuery('body, '+ elems ) .filter(function(){ if($(this).find(elems ).length >0) return false; else return true; }) 

返回

 [textarea, textarea]