2016-03-28 12 views
3

テーブルの行と列を逆転させるjavascript関数を作成しました。ここでは、コードは次のようになります。getElementsByTagName( "td")は、選択した行のすべてのtd子を返しません。

function rotate(){ 
      var table = document.getElementById("table"); 
      var newtable = document.createElement("table"); 

      var tablebody = table.getElementsByTagName("tbody")[0]; 
      var newtablebody = document.createElement("tbody"); 
      newtable.appendChild(newtablebody); 

      var rows = tablebody.getElementsByTagName("tr"); 

      var heads = tablebody.getElementsByTagName("th"); 

      var i; 
      for(i = 0; i < rows.length; i++) 
      { 
       var cells = rows[i].getElementsByTagName("td"); 
       var j; 
       for(j = 0; j < heads.length; j++) 
       { 
        if(newtablebody.getElementsByTagName("tr")[j] == undefined) 
        { 
         var newrow = document.createElement("tr"); 
         newtablebody.appendChild(newrow); 
        } 
        if(cells[j] == undefined) 
        { 
         var newcell = document.createElement("td"); 
         newtablebody.getElementsByTagName("tr")[j].appendChild(newcell); 
        } 
        else 
        { 
         var newcell = cells[j]; 
         var nbspan = cells[j].getAttribute("colspan"); 
         newcell.setAttribute("rowspan", nbspan); 
         newcell.setAttribute("colspan", 1); 
         newtablebody.getElementsByTagName("tr")[j].appendChild(newcell); 
        } 
       } 
      } 
      table.innerHTML = newtable.innerHTML; 
     }; 

問題は、私は現在の行のためのタグ名「TD」を持つすべての子を取得しようとしたとき、私は、コンソールログから見ることができるのに対し、私は、未定義の細胞の多くを得ることですこれらのセルが存在し、データを含んでいる(ログにinnerHTMLが表示されます)。

私は本当に失われていますので、どんな助けもありがとうございます。ありがとう!

+0

'table'、' tablebody'などがすべてnullでないことを確認しましたか? – birdoftheday

+2

ここにいくつかのHTMLを置くと、あなたのスクリプトをテストする方がはるかに簡単です。 – John

+0

はい、console.log(table.innerHTML)などで何度かチェックしたことがあります。 実際には、​​子供が検索されているので、nullではないことが分かっていますが、そうではないので、私は混乱しています。 –

答えて

2

既存のセルを新しいテーブル行に追加すると、暗黙のうちにが古いテーブル行からを削除します。セルは一度に1つのDOM内の1つの場所にしか存在できません。 getElementsByTagName()によって返されるノードリストはliveです。つまり、テーブル行からそのセルを削除すると、が即座にcellsアレイから削除されます。つまり、cells[j]にあるセルが突然消えてしまい、cells[j]は、(古い)テーブル行の次のセルになります。しかし、あなたのループは依然としてjをインクリメントするので、いつでもそのセルをスキップします。問題を乗り越えるために

一つの簡単な方法は、あなたがループを開始する前に、配列にノードリストをコピーすることです:

var cells = rows[i].getElementsByTagName("td"); 
    cells = [].map.call(cells, Object); 

は今、あなたはプレーンな配列を持っている、との要素が魔法のように消えることはありませんそれから。

+0

私はそれについてよく分かりませんでした。 –

関連する問題