2016-06-14 8 views
0

私はプレーンジェーンJavaScriptとJqueryを混在させてテーブルを動的に作成しています。私はforループを使ってAjax呼び出しから返されたデータを反復処理しますが、新しい行は作成されません。だから、私は警告を使ってhtmlを出力します。テーブル要素がかなり混在していることがわかります。tbodyを明示的に作成していなくても、表示されているtbodyも表示されます。javascript createElement table不要なtbodyを追加する

「完了」に、私はテーブルを作成するAjaxコード:

function performSearch(){ 
    var q = $("input[name='search']").val(); 
    var url = "performsearch.php"; 
    $.ajax({ 
     url: url, 
     method: "post", 
     data: { 'q' : q }, 
     dataType: "json" 
    }).done(function(data) { 
     /* the table creating part of the code - something wrong in here */ 
     var output = $("#output"); 
     var table = document.createElement("table"); 
     var tr = document.createElement("tr"); 
     var td = document.createElement("td"); 
     var button = document.createElement("button"); 
     output.append($(table)); 
     $(table).append($(tr)); 
     $(tr).append($(td).attr("colspan","100%")); 
     $(td).append($(button).attr("type","button").on("click",function() { 
       exportOutput(data); 
      }).html("Export")); 

     $(table).append("<tr>\n"); // I'm clearly adding a tr tag, but it doesn't show up 
     $(table).append(" <th>id</th>\n"); 
     $(table).append(" <th>processed thru</th>\n"); 
     $(table).append("</tr>"); //ending the tr tag 

     for(i=0;i<data.length;i++){ //let's say only one record is returned 
      $(table).append("<tr>\n"); //clearly adding a tr tag, but it's not showing up 
      $(table).append(" <td>"+data[i]['id']+"</td>\n"); 
      $(table).append(" <td>"+data[i]['processed_thru']+"</td>\n"); 
      $(table).append("</tr>\n"); 
     } 
    }). 
    fail(function(jqXHR, textStatus) { 
     alert("Request failed: " + jqXHR + ", " + textStatus); 
    }); 
} 

ここでは、生産のHTMLです:

<table> 
    <tbody> <!-- look at tbody tag, where'd it come from? --> 
    <tr><td colspan="100%"><button type="button">Export</button></td></tr> 
    <tr></tr> <!-- look at this extra tr tag, where'd it come from? --> 
    <tr></tr>\n\ <!-- look at this extra tr tag, where'd it come from? --> 
    </tbody>\n\ <!-- I didn't add this --> 
    <th>id</th> <!-- th tag not wrapped in a tr tag --> 
    <th>processed thru</th> 
    <th>status</th> 
    <td>1568</td> <!-- td tags not wrapped in row tag --> 
    <td>06/03/2016</td> 
    <td>ACTIVE</td> <!-- no tr tag following the end of the td tags --> 
</table> 
+2

コードの一部が要素を正しく作成し、一部が正しく作成されません。途中でHTMLを使用するように切り替えるが、間違っている。 DOMは文字列ではありません。 –

+1

@squintああ、あなたが何を言っているのか分かります。修正して報告します。 – TARKUS

+3

ブラウザで '

'をレンダリングすると、デフォルトでブラウザにはデフォルトで ''が追加されます。 「」のない「
」は無効です。 – zer00ne

答えて

0

私がダウンして、コードをコメントを取って、削るにそれらを使用iframeスタイルを定義するために使用される1つの文字列だけで、コンテンツを作成するすべてのDOMメソッドを使用することになります。結果として多くのコード行がトリミングされました。

function performSearch(){ 
    var q = $("input[name='search']").val(); 
    var url = "performsearch.php"; 
    $.ajax({ 
     url: url, 
     method: "post", 
     data: { 'q' : q }, 
     dataType: "json" 
    }).done(function(data) { 
     $("#output").html(''); 
     var output = $("#output"); 
     var table = document.createElement("table"); 
     var tr = document.createElement("tr"); 
     var td = document.createElement("td"); 
     var button = document.createElement("button"); 
     var row = table.insertRow(0); 
     var cell1 = row.insertCell(0); 
     $(cell1).attr("colspan","100%"); 
     $(cell1).append($(button).attr("type","button").attr("name","export").on("click",function() { 
       exportOutput(data); 
      }).html("Export")); 
     var row2 = table.insertRow(1); 
     var headerString = "id,processed_thru,document_number_j,status,case_number,name_of_court,file_date,date_of_entry,expiration_date,amount_due,interest_rate,plaintiff,defendant,mailed"; 
     var headerArray = headerString.split(","); 
     for(i=0;i<headerArray.length;i++){ 
      row2.insertCell(i).outerHTML = "<th>"+headerArray[i]+"</th>"; 
     } 

     for(i=0;i<data.length;i++){ 
      var dataRow = table.insertRow(i + 2); 
      for(ii=headerArray.length - 1;ii>-1;ii--){ 
       dataRow.insertCell(i).outerHTML = "<td>"+data[i][headerArray[ii]]+"</td>"; 
      } 
     } 

     var inlineStyle = document.createElement("style"); 
     inlineStyle.innerHTML = "#iframe{ display:none; width:10px;height:10px;border:#f00 1px solid; }\n"; 
     var iframe = document.createElement("iframe"); 
     iframe.setAttribute("id","iframe"); 

     //finally, stitch all the pieces together inside of the output div: 
     output.append(inlineStyle); 
     output.append(iframe); 
     output.append(table); 

    }). 
    fail(function(jqXHR, textStatus) { 
     alert("Request failed: " + jqXHR + ", " + textStatus); 
    }); 
} 
+2

プログラミングスタイルのカクテルをミックスする際の練習であれば面白いです。 FYI:Table DOMには、 'table.insertRow'、' table.createTHead'、 'row.insertCell'のようないくつかの具体的なメソッドがあります。 –

+0

@AlexKudryashev私は提案を探検します。私を信じて、私はむしろこのカクテルを混ぜていないだろう。もともとは、連結された文字列を使用してテーブル全体を構築しましたが、文字列内で作成されたボタンを使用して、返されたデータオブジェクトを別の関数に渡そうとするときに問題が発生しました。最後に、DOMメソッドを使用してボタンとその親td、tr、およびtableを作成しなければなりませんでした。しかし、私はテーブルの残りの部分、特にFORループの行をDOMメソッドを使って書くことに失敗したので、新しいテーブルを文字列として書くことに頼った。それは簡単で簡単でした。 – TARKUS

+0

プログラミングで "カクテル"(主に)解答で削除。ありがとう! – TARKUS

関連する問題