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

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


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