Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   как создать в цикле несколько дочерних элементов одного уровня? (https://javascript.ru/forum/misc/14360-kak-sozdat-v-cikle-neskolko-dochernikh-ehlementov-odnogo-urovnya.html)

DimonCry 12.01.2011 21:48

как создать в цикле несколько дочерних элементов одного уровня?
 
создана таблица, хочу с помощью функции создать несколько "детей" циклом for, но в результате создается только один..
в чем проблема цикла? как дочерние элементы создать циклом?
function createTr(){
var tr=document.createElement('tr');
for (var i=0; i<3; i++) //пускай например 3 элемента tr
document.getElementsByTagName('table')[0].appendChild(tr);
}

Amphiluke 12.01.2011 21:54

document.getElementsByTagName('table')[0].appendChild(tr.cloneNode(true));

DimonCry 12.01.2011 21:59

Amphiluke, т.е. получается сначала нужно создать объект, а потом в цикле сделать нужное количество клонов?

Amphiluke 12.01.2011 22:02

Нет, не обязательно так. Просто так короче получается. Вообще, читайте о «родных» методах объекта HTMLTableElement типа insertRow().

DimonCry 12.01.2011 22:13

Amphiluke, другими словами
var tr=document.createElement('tr');
- создает один экземпляр, который цикл не может вставить несколько раз?

Amphiluke 12.01.2011 22:21

Вы в цикле пытаетесь вставить в таблицу строку, которая в ней уже имеется. Метод appendChild выдирает элемент из текущего родителя (если есть) и вставляет в новый. У вас старым и новым родителем оказывается один и тот же объект таблицы.

monolithed 12.01.2011 22:21

Amphiluke, на всякий))
У элемента table есть дочерний элемент tbody, а также нет смысла каждый элемент добавлять через цикл (представьте, что их будет 100), для этого их нужно сначала создать, а потом уже добавить

Amphiluke 12.01.2011 22:31

Цитата:

Сообщение от monolithed
у элемента table есть дочерний элемент tbody

Так точно. Поэтому, в частности, я и рекомендую использовать метод insertRow(), хотя работает и простой appendChild в table.

Цитата:

Сообщение от monolithed
для этого их нужно сначала создать, а потом уже добавить

Ну да, тоже не поспоришь. Всякий раз при добавлении элемента в DOM происходят тяжелые для браузера процедуры reflow и repaint. Поэтому можно вставлять ноды во временный объект DocumentFragment, который затем разом вставить на страницу.

monolithed 12.01.2011 22:36

Цитата:

Сообщение от Amphiluke
Поэтому можно вставлять ноды во временный объект DocumentFragment, который затем разом вставить на страницу.

да, можно и даже желательно использовать documentFragment() или же его метод cloneNode(), но можно и даже так, как вариант (только тут есть нюансы новые элементы так скажем не совсем в DOM, т.е. единственным дочерним элементом тут будет tbody):
<script type="text/javascript">
window.onload = function(){
    var table = document.getElementsByTagName('tr')[0], tr = '<td style="border: 1px solid"/>', array = [], i = 0;
    while(++i<=4){
        array.push(tr+'td'+i);
    }
    table.innerHTML = array.join('');
};
</script>

<table><tr/></table>

DimonCry 12.01.2011 22:44

Спасибо всем, разобрался...

рони 13.01.2011 07:54

На всякий случай )))
Цитата:

Сообщение от monolithed
table.innerHTML

не сработает в Internet Explorer http://innerhtml.ru/

DimonCry,
Вставляемый элемент надо обьявлять внутри цикла.
<!DOCTYPE html>
<html>
<head>
  <title></title>
 <style type="text/css">
  td{
   height: 20px;
   width: 20px;
   background-color: #FFFF00;
 }
 </style>
</head>
<body>
<table border="1" bgcolor="#00FF00">
</table>
<script type="text/javascript">
function createTr(){
var f=document.createDocumentFragment();
for (var i=0; i<3; i++) {//пускай например 3 элемента tr
var tr=document.createElement('tr'),td=document.createElement('td');
tr.appendChild(td);
f.appendChild(tr)}
document.getElementsByTagName('table')[0].appendChild(f);
}
createTr()
</script>
</body>
</html>

monolithed 13.01.2011 10:46

рони, спасибо за совет, ну я же выше написал, что с innerHTML способ 'некорретен' и нужно делать делать с createDocumentFragment().


Часовой пояс GMT +3, время: 16:09.