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

标签 javascript jquery plugins filter

needed a method过滤掉结果集中其他元素的父元素的所有元素。我尝试编写一个插件:

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;
};

当我在 this example page 上运行以下命令时:

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

我得到(错误的)结果:

[body.contact-page, textarea, textarea]

这是错误的,因为 body 是结果中至少一个其他元素(都是文本区域)的父元素。因此预期的结果是:

[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<nodes.length; i++) {
        var node_to_check = nodes[i];
        jQuery(this).each(function(index, Element) {

            // Skip self comparisons.
            if (Element == node_to_check) {
                return;
            }

            // Use .tagName to allow .find() to work properly.
            if((jQuery(node_to_check).find(Element.tagName).length > 0)) {
                if (parents.indexOf(node_to_check) < 0) {
                    parents.push(node_to_check);
                }
            }
        });
    }

    // Finally, construct the result.
    var result = [];
    for (var i=0; i<nodes.length; i++) {
        var node_to_check = nodes[i];
        if (parents.indexOf(node_to_check) < 0) {
            result.push(node_to_check);
        }
    }

    return result;
};

关于javascript - JQuery 不同的后代(过滤掉结果集中的所有父级),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10152627/

相关文章:

javascript - 复制参数对象的子集,不使用显式循环

javascript - JQuery 使用计时器在 for 循环中更改 CSS

email - 带有grails邮件插件的电子邮件发件人

javascript - jQuery Plugin to "Bold"Matched Letters(谷歌搜索引擎显示结果的方式)

javascript - 使用自定义 jQuery slider 和键盘键检测事件

javascript - Ext JsonStore 执行 POST,即使我将其设置为 GET

javascript - 将存储的数组对象显示在 Javascript 中列表到 HTML

javascript - 如何使用 jQuery 在客户端的 HTML 表中显示图像

javascript - 如何检测 JQuery 中的 url 变化?

eclipse - 如何确保从 eclipse 插件调用时加载外部 jar 的类?