3

私がこのようなHTMLマークアップを持っていると仮定しましょう:

<body>
  <div id="content">
    <div id="sidebar">
    </div>
    <div id="main">
        <p class="foo">text</p>
        <p class="bar">more <span>text</span></p>
    </div>
  </div>
</body>

さらに、DOM要素の配列でそれらのいくつかを選択したと仮定しましょう。

var allElements = jQuery('div,p').get();
// result: [div#content, div#sidebar, div#main, p.foo, p.bar]

ここで、結果に子を持つすべての要素を結果セットから効率的に削除したいと思います。言い換えれば、最も深いレベルだけが残るはずです。したがって、望ましい結果は次のようになります。

var deepestElements = doSomethingWith(allElements);
// desired result: [div#sidebar, p.foo, p.bar]

これどうやってするの?

ちなみに、「最も深い要素」は、私がやろうとしていることに対して間違った用語のようです。もっと良い名前はありますか?

4

3 に答える 3

4

.filterを使用.children().lengthして、フィルターで除外してみてください。下記参照、

var deepestElements = jQuery('div,p').filter(function () {  
                         return ($(this).children().length == 0);
                       });
于 2012-04-10T19:00:40.623 に答える
1

SKSが提案したように、これを使用してください

jQuery('div,p').filter(function(){
    if($(this).children('div, p').length==0) 
        return true;
    })

ここでの唯一の変更は、子ではdivとpの子ノードのみを検索することです...この場合はspanのような他のノードをスキップします...

これで問題が解決することを願っています...

アップデート

あなたが期待しているようにこれが役立つことを願っています

var types_to_check = 'div,p';
jQuery(types_to_check).filter(function(){
    if($(this).children(types_to_check).length==0) 
        return true;
    })

これはうまくいきませんか?

于 2012-04-10T19:52:15.963 に答える
0

実用的な解決策を見つけました(JQueryの個別の子孫(結果セット内のすべての親を除外します))。

cfedermannへのコードクレジット:

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-14T12:48:36.787 に答える