2017-08-08 8 views
-2
function clearAllButton(){ 
    clearAll(); 
    printId(); 
    if(markEdit){ 
     markEditRow.classList.toggle("blue"); 
     markEditRow=undefined; 
     markEdit=false; 
    } 
    var fields1 = document.getElementsByClassName("red"); 
    Array.prototype.forEach.call(fields1,function(e){ 
     console.log(fields1, fields1.length); 
     e.classList.toggle("red"); 
     var id = e.getElementsByTagName('td')[0].innerHTML; 
     itemOperations.markRecord(id); 

    }); 
    printTotalRecords(); 
} 

これは私のコードで、 "fields1"変数に複数のフィールドがありますが、ループは最初のアイテムでのみ実行されています。各エレメントに対して毎回関数を実行する必要があります。私に助けてくださいJavaScriptのみを使用してください。私の変数にもっと長いHTMLコレクションがあるのに、forEachループが1つの値しか取っていないのはなぜですか?

Hereは完全なコードです。しかし、あなたが私だけにこの機能と唯一の行を見なければならないと信じて、あなたは私よりもよく知っている必要が残り、私はこれに新しいです。

+0

、原因を見つけるのですか非常に困難です。私は上記から最小限の作業スニペットを作成し、それは正常に動作します –

+0

このリンクを見てくださいhttps://stackoverflow.com/a/40571691/2003642 –

+0

あなたは 'this'によって要素にアクセスしなければなりません –

答えて

1

問題はgetElementsByClassNameがライブコレクションを返します。したがって、クラスを切り替えて要素を選択すると、コレクションが変更されます。代わりに、反復中に突然変異を避けるためにquerySelectorAllを使用することができます。別の関数のコードなし

var red = document.getElementsByClassName('red'); 
 

 
// logs 2 times 
 
[].forEach.call(red, function(field) { 
 
    field.classList.toggle('red') // this line "skips" next field 
 
    console.log(field.value) 
 
}) 
 

 

 
var blue = document.querySelectorAll('.blue'); 
 

 
// logs 4 times 
 
[].forEach.call(blue, function(field) { 
 
    field.classList.toggle('blue') 
 
    console.log(field.value) 
 
})
<input class="red" value="red1"> 
 
<input class="red" value="red2"> 
 
<input class="red" value="red3"> 
 
<input class="red" value="red4"> 
 
<input class="blue" value="blue1"> 
 
<input class="blue" value="blue2"> 
 
<input class="blue" value="blue3"> 
 
<input class="blue" value="blue4">

+0

'red'と' blue'が要素を保持している場合、このスニペットの 'field'は何ですか? – k256755

+0

@ k256755 'field'は実際には入力フィールドである要素の名前です。あなたはそれをあなたが望むものに改名することができます。私は 'フィールド'の名前が好きです。 –

+0

いいえ、私は 'getElementsByClassName'を使用すると、それはまだ同じですが、私は' querySelectorAll'を使用すると、それは動作します...ありがとうバディ。 :) @ yury-tarabanko – k256755

関連する問題