2011-07-01 25 views
2

我想使用下面的代碼來動態添加結束標記,然後打開,以便我每三個單元格創建一個新行。幾乎工作,DOM檢查器顯示一個TR節點,問題是,發生了什麼tr tr沒有關閉tr標記。我是Jquery的新手,有什麼我做錯了這個代碼?我可以使用Jquery在動態表內插入一個關閉</tr>標籤和一個開頭<tr>標籤嗎?

  <script src="http://ajax.aspnetcdn.com/ajax/jquery/jquery-1.5.1.min.js" type="text/javascript"></script> 
     <script type="text/javascript"> 
     $(document).ready(function(){ 
     $('td:nth-child(3n)').after('</tr><tr>'); 
     }); 
     </script> 

     <table id="mytable" width="266" border="1" cellspacing="10" cellpadding="10"> 
     <tbody> 
      <tr> 
     <?php 
     function somelongassfunction(){ 
      return 'Hello'; 
      } 
     function have_products($a){ 
      return $a<=20; 
      } 
     $x=0; 
     while (have_products($x)) { 
      echo '<td>' . somelongassfunction() . '</td>'; 
      $x++; 
     //------------------------------------- 
     /*if (fmod($x,3) == 0) { 
         echo '</tr><tr>'; 
         continue; 
         }*/ 
     //--------------------------------------      
     if ($x==20){ 
      break; 
      } 
     } 
     ?> 
     </tr> 
     </tbody> 
     </table>  
+2

純粹的PHP解決方案不工作? – Michael

回答

3

您不能在DOM選擇上工作,就像它是HTML文檔一樣。 DOM文檔是節點的層次結構,而不是標籤的層次結構。瀏覽器將HTML中的標記解析成到DOM文檔中。您不能添加一點HTML,然後期望它被解析回DOM結構。

相反,你需要做jQuery中的包裝。這是一個可行的方法 - 它可能不是最有效的。

$('td').each(function(idx) { 
    if (idx % 3) { 
     return; 
    } else { 
     $(this).nextAll(':lt(2)').andSelf().wrapAll('<tr/>'); 
    } 
}).parent().unwrap(); 

jsFiddle

2

另一種方法是detach所有td元素,然後使用splice它們分成3個一組:

var td = $('tr td').detach(); 
$('tr').remove(); 
while(td.length>0){ 
$(td.splice(0,3)).wrapAll('<tr />').parent().appendTo('tbody'); 
} 

例如:http://jsfiddle.net/niklasvh/C6unV/

+0

+1是的,將它們分開是一個很好的解決方案。 – lonesomeday

0

正如lonesomeday所述,你不能像一點HTML一樣對待DOM。此外,TR closing tags are optional因此,當您插入一些打開TR的標記時,瀏覽器將關閉它。你不需要結束標籤。

相關問題