2016-05-12 11 views
0

firstChildオブジェクトが次のコードでundefinedを返すのはなぜですか?私はを省略すると、child = child.nextSibling;Javascript:firstChildオブジェクトは未定義を返します

あなたが何か間違ったことをやっているので、次の行で、私はnextSibling

divs = $('.post') 
    for(ind in divs){ 
    div = divs[ind]; 
    var child = div.firstChild; 
    child = child.nextSibling; //omitting this causes undefined 
    alert (child.innerHTML); 
    } 

がHTML

..... 
     <div class="post"> 
       <h4> 
        HEADER 
       </h4> 
       <div class="content"> 
        <p> 
         text goes here 
        </p> 
       </div> 
     </div> 
    ...... 
+0

を。 $ .each()または少なくとも.lengthベースのforループを使用してください。 – dandavis

+0

あなたが実際に 'div'がループの内側にあるものログインしましたか?あなたは既にjQueryの、なぜあなたはちょうど '.children()'と '.next()'のような、そのメソッドを使用していない使用しているので、あなたはjQueryの – epascarello

+0

とin'ため '使用することを学んだ場所がわかりませんか? $ - - 0.02 ... – Barmar

答えて

0

呼び出した場合、それが正常に動作します:jQueryのコレクションを反復処理するためにfor(key in jQueryObject) {を使用します。 ループは、コレクション内の選択された要素を反復処理するだけではありません。すべてのオブジェクトプロパティを反復処理します。すなわち、divs[ind]は、DOM要素だけでなく、jQueryのメソッドまたはプロパティの1つになります。

jQueryオブジェクトは配列のようなオブジェクトなので、選択された要素を参照する数値プロパティを持っています。しかし、他のプロパティとメソッドでは、ループは単に失敗します。 indが0であり、それがセットの最初の選択された要素を指し、最初の反復では

:あなただけの1 .postの要素を持っていると仮定すると

第2回の反復において、indlengthです。 divs[ind]は、DOM要素ではなく、コレクションのlengthを返します。これは他のjQueryのプロパティとメソッドにも当てはまり、他の継承されたプロパティです。

また、オブジェクトのプロパティの順序が定義されていないため、異なるブラウザで異なる結果が得られることがあります。


jQueryコレクションを反復するには、 .eachメソッドを使用します。

0

<div class="post"><h4>タグの間にHTMLドキュメントの空白があります。 firstChildプロパティのdivにアクセスすると、この空白を含むテキストノードが返されます。テキストノードにはinnerHTMLというプロパティがないため、結果はundefinedになります。

テキストノードのnextSiblingプロパティにアクセスすると、空白文字の後のノード、<h4>要素が返されます。

要素(テキストノードをスキップする)である最初の子に直接アクセスするには、firstChildの代わりにfirstElementChildプロパティを使用できます。

コード内のforループにも問題があります。これは、インデックスだけでなく、JQueryコレクションのすべてのプロパティを繰り返し処理します。代わりに、JQueryの.each()メソッドを使用する必要があります。

.each()firstElementChildを使用してdiv要素を反復:

var divs = $('.post'); 
divs.each(function() { 
    var div = this;  
    var child = div.firstElementChild; 
    alert(child.innerHTML); 
}); 

:first-childセレクタで最初の子要素を選択するためにはJQueryを使用して:あなたはjQueryのコレクションを反復処理する方法はありません

$('.post>:first-child').each(function() { 
    alert(this.innerHTML); 
}); 
+0

は.children [0]' '.firstElementChild'より広いcompatのために'検討するかもしれませんブラウザの互換性情報と[MDN](https://developer.mozilla.org/docs/Web/API/ParentNode/firstElementChild)上の古いブラウザをサポートするためのポリフィルです。注また 'children'がIEでコメントノードを返す<9 – dandavis

+0

は、あなたがそこIE <9をサポートするために持っている場合firstElementChild'はだけは本当に問題である 'との互換性を@dandavis –

+0

私はIE8を考えていたが、jQueryの権利があれば、それはすべてのすべてで、なぜ使用のDOMメソッドの質問を頼むことを... – dandavis

関連する問題