Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 20.07.2014, 00:50
Интересующийся
Отправить личное сообщение для Davert Tanz Посмотреть профиль Найти все сообщения от Davert Tanz
 
Регистрация: 20.01.2014
Сообщений: 13

Создание таблиц циклом
Имеется код, который высчитывает количество дней в месяце и создает таблицу с этим количеством колонок. Вопрос - почему на странице создается таблица не с одной строкой и кучей колонок, а для каждой колонки новый <tbody> и <tr> ? Получается что каждая колонка оборачивается в строку. Пожалуйста, подскажите как решить проблему.
var table = document.createElement('table');
table.innerHTML = '<tbody><tr>';
for (i = 1; i < lastDate; i++) {
	table.innerHTML += '<td></td>';
}
table.innerHTML += '</tr></tbody>';
Ответить с цитированием
  #2 (permalink)  
Старый 20.07.2014, 01:05
Аватар для bes
bes bes вне форума
Профессор
Отправить личное сообщение для bes Посмотреть профиль Найти все сообщения от bes
 
Регистрация: 22.03.2012
Сообщений: 3,744

сделай тестовый пример, кнопка запуска [html run]
UPD: хотя спи спокойно, браузер всё сделал за тебя

Последний раз редактировалось bes, 20.07.2014 в 01:19.
Ответить с цитированием
  #3 (permalink)  
Старый 20.07.2014, 01:33
Аватар для Vlasenko Fedor
Профессор
Отправить личное сообщение для Vlasenko Fedor Посмотреть профиль Найти все сообщения от Vlasenko Fedor
 
Регистрация: 13.03.2013
Сообщений: 1,572

var table = document.createElement('table');
var html = '<tbody><tr>';
for (i = 1; i < lastDate; i++) {
	html += '<td></td>';
}
table.innerHTML = html + '</tr></tbody>';

так уже получше должно быть
http://learn.javascript.ru/task/kalendar

Последний раз редактировалось Vlasenko Fedor, 20.07.2014 в 01:40.
Ответить с цитированием
  #4 (permalink)  
Старый 20.07.2014, 02:30
Профессор
Посмотреть профиль Найти все сообщения от newobject
 
Регистрация: 10.07.2014
Сообщений: 145

Poznakomlus,
Похоже вот так тоже сработает:
var table = document.createElement('table');
var html = '';
for (i = 1; i < lastDate; i++) {
    html += '<td></td>';
}
table.innerHTML = html

Именно в этом причина непонятки TC'a Я около часа голову ломал. Браузер, по-ходу, сам оборачивает td в tr и tbody. Медвежья услуга, мля.
Ответить с цитированием
  #5 (permalink)  
Старый 20.07.2014, 04:41
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,583

Потому что после вставки innerHTML браузер парсит результат,(потому как код, что логично, считается завершённым, откуда ему знать что Вася в следующей строчке или через десять колбэков снова использует innerHTML) и пытается из того говна что вы туда запихнули сотворить валидный dom.
Это не говоря о том что "foo += bar" - это на самом деле "foo = foo + bar", и, соответственно, каждый раз делая "el.innerHTML+=str" вы перезаписываете всё заново.
Это самые-самые базовые знания.
var table = document.createElement('table'); 
// Создаём таблицу, всё ок: <table></table>
console.log(1, table.outerHTML) // <table></table>

table.innerHTML = '<tbody><tr>';    
// Браузер видит: "<table>*!*<tbody><tr>*/!*</table>", думает "Хуйня какая-то, наверное надо закрыть теги..." и в итоге:
console.log(2, table.outerHTML) // <table><tbody><tr>*!*</tr></tbody>*/!*</table>

table.innerHTML += '<td></td>';     
// Браузер видит: "<table><tbody><tr></tr></tbody>*!*<td></td>*/!*</table>", думает "Что за гавно?! Наверное он имел ввиду" :
console.log(3, table.outerHTML) // <table><tbody><tr></tr></tbody>*!*<tbody><tr><td></td></tr></tbody>*/!*</table>

table.innerHTML += '</tr></tbody>'; 
// Браузер видит: "<table><tbody><tr></tr></tbody><tbody><tr><td></td></tr></tbody>*!*</tr></tbody>*/!*</table>", думает:
// "Ну пиздец, хз что он имел ввиду." и игнорирует:
console.log(4, table.outerHTML) // <table><tbody><tr></tr></tbody><tbody><tr><td></td></tr></tbody></table>


P.S. В ie<9 таблицам вообще нельзя innerHTML если что.
У вас есть целых два способа создавать таблицы по-человечески:
var table = document.createElement('table'),
    tr = table.appendChild(document.createElement('tbody'))
              .appendChild(document.createElement('tr'));
for (i = 1; i < lastDate; i++) {
    tr.appendChild(document.createElement('td'));
}
var table = document.createElement('table'),
    tr = table.insertRow();
for (i = 1; i < lastDate; i++) {
    tr.insertCell();
}
но нет же...
__________________
29375, 35

Последний раз редактировалось Aetae, 20.07.2014 в 09:38.
Ответить с цитированием
  #6 (permalink)  
Старый 20.07.2014, 09:10
Аватар для bes
bes bes вне форума
Профессор
Отправить личное сообщение для bes Посмотреть профиль Найти все сообщения от bes
 
Регистрация: 22.03.2012
Сообщений: 3,744

Сообщение от Aetae
У вас есть целых два способа создавать таблицы по-человечески:
есть ещё фрагменты, но вроде как польза от них стала не столь ощутимой
Цитата:
В современных браузерах, а также при вставке в узлы вне документа эффект от этой оптимизации меньше, вплоть до никакого.
Ответить с цитированием
  #7 (permalink)  
Старый 20.07.2014, 09:38
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,583

bes, где ты тут собрался применять фрагменты?
Они имеют смысл при вставке нескольких нод в живой dom(тот что уже есть на странице). Никакого смысла их использовать при генерации цельного элемента нет.
__________________
29375, 35
Ответить с цитированием
  #8 (permalink)  
Старый 20.07.2014, 09:56
Аватар для bes
bes bes вне форума
Профессор
Отправить личное сообщение для bes Посмотреть профиль Найти все сообщения от bes
 
Регистрация: 22.03.2012
Сообщений: 3,744

Сообщение от Aetae
bes, где ты тут собрался применять фрагменты?
Они имеют смысл при вставке нескольких нод в живой dom(тот что уже есть на странице). Никакого смысла их использовать при генерации цельного элемента нет.
особого смысла может и нет, хотя никто и не запрещает
в целом, завёл речь о фрагментах, так как давно не заглядывал в эту ветку учебника и удивился, что фрагменты уже стали не в моде
Ответить с цитированием
  #9 (permalink)  
Старый 20.07.2014, 10:39
Профессор
Посмотреть профиль Найти все сообщения от newobject
 
Регистрация: 10.07.2014
Сообщений: 145

Aetae,
function first(j){
var table = document.createElement('table')
var tr = table.appendChild(document.createElement('tbody')).appendChild(document.createElement('tr'));
for (var i = 1; i < j; i++) {
    tr.appendChild(document.createElement('td'));
}
table1=table
}

function second(j){
var table = document.createElement('table')
var tr = table.insertRow();
for (var i = 1; i < j; i++) {
    tr.insertCell();
}
table2=table
}

function third(j){
var table = document.createElement('table')
var str=""
for (var i = 1; i < j; i++) {
      str+="<td></td>"
}
table.innerHTML=str
table3=table
}


Прогнал по 10000 раз (j=10000)

Из этих 3-х вариантов 2-й -- самый плохой. Опера вообще не понимает insertRow, хром:

//first: 27.000ms
//second: 1557.000ms
//third: 19.000ms

опера:

//first: 84ms (83812µsec)
//third: 24ms (23876µsec)

FF вроде ровно, в IE не проверял (как поставить новый IE на XP, кстати?). В любом случае, third заруливает на всем.

Последний раз редактировалось newobject, 20.07.2014 в 11:40.
Ответить с цитированием
  #10 (permalink)  
Старый 20.07.2014, 10:47
Аватар для bes
bes bes вне форума
Профессор
Отправить личное сообщение для bes Посмотреть профиль Найти все сообщения от bes
 
Регистрация: 22.03.2012
Сообщений: 3,744

newobject, где тест, где кнопка запуска
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Книги по Ajax BaVa Учебные материалы 18 18.08.2013 14:05
Создание своей библиотеки. Создание двух одинаковых объектов. Как избежать? IDCh Javascript под браузер 2 31.10.2012 12:53
Создание скрипта "Итеррационные циклы" по формуле krasopetka Общие вопросы Javascript 0 17.11.2011 12:42
Помогите пожалуйста с циклом faforty Общие вопросы Javascript 2 26.06.2011 21:38
создание XHR оьектов циклом Jekel AJAX и COMET 5 25.03.2010 16:50