Можно ли использовать JQuery для вставки закрывающего тега </ tr> и тэга открытия <tr> внутри динамической таблицы?

Я пытаюсь использовать приведенный ниже код для динамического добавления закрывающего тега с последующим открытием, чтобы я создавал новую строку каждые три ячейки. Почти работает, DOM-инспектор показывает TR-узел, проблема в том, что что-то происходит tr не закрывает тег tr. Я новичок в JQuery, есть ли что-то, что я делаю неправильно с этим кодом?

<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> 

Вы не можете работать с выбором 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

Другой подход состоит в том, чтобы detach все элементы td , а затем разбить их на группы по 3 с помощью splice :

 var td = $('tr td').detach(); $('tr').remove(); while(td.length>0){ $(td.splice(0,3)).wrapAll('<tr />').parent().appendTo('tbody'); } в 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/

Как сказал lonesomeday, вы не можете рассматривать DOM как немного HTML. Кроме того, теги закрытия TR являются необязательными, поэтому, когда вы вставляете какую-либо разметку с открытием TR, браузер закрывает ее. Вам не нужен закрывающий тег.