2017-11-10 7 views
0

テキストと入力を含む単純なテーブルがあります。私はドロップダウンから値を選択することによって、テーブル内の入力がいくつあるかを動的に判断しようとしています。これは初めてうまく動作しますが、値を変更しようとすると一部の行だけが削除されます。ここで私のコードですが、私はインプットをインデックスに置き換えて、何が起こっているのかをより簡単に見ています。ここで JavaScriptを使用してテーブルから行を削除するのに問題がある

は、6つの要素が、それはまだすべてがどこに行く

6 selectedここ

があるテーブルにあったすべての行を示し、正常に見える選ばれpage load

後出力、ページの負荷であります間違っていますが、配列の長さは11として出力されますが、コンソールには8行しか出力されず、古い行の半分がテーブルに残っています。

final

すべてのヘルプは非常に高く評価されるだろう、私は完全にこの動作により困惑しています。編集:私は、HTMLを追加し、JSのビットを削除した、私は正直なところ私は問題が何であるか分からないために除外すべきことはわからない..

要望どおり、フォームが投稿される前に問題が発生するため、PHPが必要と考えています。見ていただきありがとうございます。

<!DOCTYPE html> 

<html> 
    <head> 
     <meta charset="UTF-8"> 
     <title></title> 
    </head> 
    <body> 

     <h1>Create Questions</h1> 
     <form name="create" action="process.php" method="POST"> 

      <table id = "inputTable"> 
       <tr><td>ID: </td><td><input id="field" name="id" type="text" /></td></tr> 
       <tr><td>Text: </td><td><input id="field" name="txt" type="text" /></td></tr> 

       <tr><td>#of choices: </td><td><select id="numberOfChoices" name="numberOfChoices"> 

         <option value="3">3</option> 
         <option value="4">4</option> 
         <option value="5">5</option> 
         <option value="6">6</option> 

        </select></td></tr> 
       <tr><td>Answer: </td><td><input id="field" name="id" type="text" /></td></tr> 
       <tr><td>Points: </td><td><input id="field" name="id" type="number" /></td></tr> 
      </table> 
      <button type="submit">Submit</button> 
     </form> 

     <script> 

      window.onload = function() { 

    document.querySelector("#numberOfChoices").addEventListener("change", addFields); 

     }; 


     function addFields() { 

      var letters = ["a", "b", "c", "d", "e", "f"]; 
      var choices = document.querySelector("#numberOfChoices"); 
      var choicesValue = choices.value; 

      var tab = document.querySelector("#inputTable"); 

      var rows = tab.rows; 
      console.log(rows.length); 

      for (var j = 0; j < rows.length; j++) { 

       var row = rows[j]; 

       console.log(row.cells[0].innerHTML); 

       for (var k = 0; k < letters.length; k++) { 
        var letter = letters[k]; 


        if (row.cells[0].innerHTML === letter) 
        { 
         tab.deleteRow(j); 
         break; 
        } 

       } 

      } 


      for (var i = 0; i < choicesValue; i++) { 

       var row = tab.insertRow(3 + i); 
       var cell1 = row.insertCell(0); 
       var cell2 = row.insertCell(1); 


       cell1.innerHTML = letters[i]; 
       //cell2.innerHTML = "<input id=\"field\" name=\"id\" type=\"text\" />" 
       cell2.innerHTML = i; 

      } 


     } 

    </script> 

</body> 

+0

あなたが行動をデバッグするためのスニペットを使用してくださいことはできますか? –

+1

私はお詫びします、私はあなたの意味ではっきりしていません。より少ないコードを見たいと思っていますか、あるいは私が特定のテクニックを使用することを提案していますか?私はまだ非常に多くのことを学んでおり、あなたが何を意味するのかは分かりません。 – Protium

+0

マークアップとコードの完全ではあるが最小限の例をここに指定する必要があります。 [mcve] – Rob

答えて

1

あなたには、いくつかの行を削除すると、テーブルの内容が変更されています。したがって、 "a"行を削除すると、表の長さが1減らされ、次の行は "b"ではなく "c"になります。そして、 "b"は出力に残ります。新しい "a"、 "b"、 "c"がテーブルに追加された後に表示されます。 "d"の場合も同様です( "c"を削除するとテーブルの長さが1減らされ、 "f"が削除されるため)。

ソリューションは、行が削除された後だけ反復変数をデクリメントすることです:

for (var j = 0; j < rows.length; j++) { 
     row = rows[j]; 
     console.log(row.cells[0].innerHTML); 
     for (var k = 0; k < letters.length; k++) { 
      var letter = letters[k]; 
      if (row.cells[0].innerHTML === letter) 
      { 
       tab.deleteRow(j); 
       j--; 
       break; 
      } 
     } 
    } 

また、私はあなたのためPlunkerを準備:https://plnkr.co/edit/L7ieHFLGob6ikL5YJsaD?p=preview

+0

ありがとうございます!それは一度あなたがそれを言うと完璧な意味がありますが、私はそれの周りに私の頭を得ることができませんでした。あなたのソリューションは完全に機能しました。宜しくお願いします。 – Protium

+0

@Protiumあなたは大歓迎です!次回に問題をデモするためにPlunkerを使用すると、デモでより簡単に手助けすることができます。 – dhilt

+0

私は絶対にそれを行います、ありがとうございました。 – Protium

関連する問題