3

私はこのhtml構造を持っています:

<body>
  <a>
    <b>
      <c>
        <d>
        </d>
      </c>
    </b>
  </a>
</body>

<d>この要素を最初のノードとして使用します。

質問 :

 var s= $("d").parentsUntil("body").andSelf().map(function(){
    return this.tagName;
  }).get();

それは下から上に始まり、s配列が のように見えることを意味しますd,c,b,a

しかし、どうやら次のように見えます:["A", "B", "C", "D"]

何故ですか ?

ジャスビン

4

2 に答える 2

3

.andSelf()jQuery に配列の順序を変更させます。

あなたが試すことができます :

 var s= $("d").parentsUntil("body").map(function(){
    return this.tagName;
  }).get();

このコードの出力は次のようになります["C", "B","A" ]

于 2013-02-25T08:25:55.797 に答える
1

addBack's(エイリアスである)コードを見るとandSelf、次のことがわかります。

add: function( selector, context ) {
    var set = typeof selector === "string" ?
            jQuery( selector, context ) :
            jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),
        all = jQuery.merge( this.get(), set );

    return this.pushStack( jQuery.unique(all) );
},

addBack: function( selector ) {
    return this.add( selector == null ?
        this.prevObject : this.prevObject.filter(selector)
    );
}

だからあなたはそれが呼び出すのを見るunique

さらに見ると、

jQuery.unique = Sizzle.uniqueSort;

Sizzle.uniqueSort = function( results ) {
    var elem,
        duplicates = [],
        i = 1,
        j = 0;

    // Unless we *know* we can detect duplicates, assume their presence
    hasDuplicate = !support.detectDuplicates;
    results.sort( sortOrder );

    if ( hasDuplicate ) {
        for ( ; (elem = results[i]); i++ ) {
            if ( elem === results[ i - 1 ] ) {
                j = duplicates.push( i );
            }
        }
        while ( j-- ) {
            results.splice( duplicates[ j ], 1 );
        }
    }

    return results;
};

したがって、addBack追加された要素がまだ内部にないことを確認するために、セットをソートします。

于 2013-02-25T08:33:17.450 に答える