0

結果セット内の他の要素の親であるすべての要素を除外する方法が必要でした。私はプラグインを書いてみました:

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 は、結果内の少なくとも 1 つの他の要素 (両方のテキストエリア) の親であるため、これは誤りです。したがって、期待される結果は次のようになります。

[textarea, textarea]

ここで何が問題なのですか?

4

3 に答える 3

1

あなたの方法は問題ないようですが、あなたの例はおそらく間違っています。あなたが言った -

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

(間違った)結果が得られます:

[body.contact-page, textarea, textarea]

セレクターにテキストエリアがない場合、どうしてテキストエリアを取得するのですか?また、この方法の使用には注意してください。覚えて -

jQuery('div、input')。distinctDescendants(); 一部の入力は検討中のdivの内部にあり、一部は外部にあることを意味します。結果は予測不可能ではありませんが、推測するのは明らかに困難です。したがって、ほとんどの場合、クラス名またはIDを持つセレクターを使用してみてください。

フィードバックをお聞かせください...機能は問題ないと思います。

于 2012-04-14T10:50:20.423 に答える
1

なぜ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;
};
于 2012-04-14T10:06:22.143 に答える
0

これがあなたが期待していることだと思います

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

アップデート

だからあなたはこのようなものが欲しい

var elems = 'textarea';

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

これは

[textarea, textarea]
于 2012-04-14T10:22:34.497 に答える