2017-10-20 5 views
0

特定の量の列を作成し、各列に四角形を追加する目的でこのループを実行しようとしています。目標は1つのループでこれをすべて実行することでしたが、ループは1回、正常に実行されて終了しました。creatDocumentFragmentの入れ子になったforループがなぜ外側のforループを1回だけ実行するのですか?

function gridBuilder(columns,rows) { 
    var toAdd = document.createDocumentFragment(); 
    for (i = 1; i <= columns; i++) { 
    var column = document.createElement('div'); 
    column.id = 'card-column-'+i; 
    for (i = 1; i <= rows; i++) { 
     var row = document.createElement('div'); 
     row.id = 'card-'+i; 
     row.className = 'card'; 
     column.appendChild(row); 
    } 
    column.className = 'card-column'; 
    toAdd.appendChild(column); 
    } 

    document.getElementById('card-container').appendChild(toAdd); 
} 

HTML/CSSが不足していると理解しています。 gridBuilder(5,4);を実行すると、以下のように、4つの正方形で1つの列しか作成されないのはなぜですか?

<div id="card-container"> 

      <div id="card-column-1" class="card-column"> 
       <div id="card-1" class="card"></div> 
       <div id="card-2" class="card"></div> 
       <div id="card-3" class="card"></div> 
       <div id="card-4" class="card"></div> 
    </div> 
</div> 

注:クロームコンソールエラーを与えません。私はhereからほとんどを得ました。何らかの理由でこれのようなネストされたforループを実行することはできませんか?

+0

このコードにプランナーを作成できますか? – VicJordan

+0

私はプランカが何であるか分かりませんが、私はただそれを理解しました...他のnoobsが見ることができるように答えを投稿します。 –

答えて

1

フラグメントを使用せずに、それを#card-containerに追加するだけで済みます。

また、をforループに追加して、global variablesを回避する必要があります。

あなたが言ったように、両方のループで同じ変数を使用することはできません。あなた自身を見つける素晴らしい仕事!

function gridBuilder(columns, rows) { 
    container = document.getElementById('card-container'); 
    for (var i = 1; i <= columns; i++) { 
    var column = document.createElement('div'); 
    column.id = 'card-column-' + i; 
    for (var j = 1; j <= rows; j++) { 
     var row = document.createElement('div'); 
     row.id = 'card-' + j; 
     row.className = 'card'; 
     column.appendChild(row); 
    } 
    column.className = 'card-column'; 
    container.appendChild(column); 
    } 
} 
+0

なぜフラグメントの使用を避けたいのですか?私は、このタイプの操作にフラグメントを使用する方がパフォーマンスが良いことを理解していた(おそらく誤った) ありがとうございます! –

+0

@MattWeber私はそれが "複数の場所に**の要素のセットを挿入するために使われるとき"だと思います。 [ソース](https://stackoverflow.com/questions/14203196/does-using-a-document-fragment-really-improve-performance) [このパフォーマンステスト](https://jsperf.com/fragment-vs-just-append)をご覧ください。 –

+0

@MattWeberあなたが正しいと思います!コンピュータの感じ方によっては、他の時間よりも速い場合もあります。 –

1

ネストされたforループを実行するときは、両方のループパラメータで同じ変数を使用することはできません。この場合、私はiを2回使用しました。私はjを使用するために2番目のループを変更し、今は動作します...他の人のためにこれをここに残します。

function gridBuilder(columns,rows) { 
    var toAdd = document.createDocumentFragment(); 
    for (i = 1; i <= columns; i++) { 
    var column = document.createElement('div'); 
    column.id = 'card-column-'+i; 
    for (j = 1; j <= rows; j++) { 
     var row = document.createElement('div'); 
     row.id = 'card-'+j; 
     row.className = 'card'; 
     column.appendChild(row); 
    } 
    column.className = 'card-column'; 
    toAdd.appendChild(column); 
    } 
関連する問題