690
 

Проблемы с созданием таблиц в Internet Explorer

Сегодня я хочу обратить ваше внимание на один довольно интересный (если с ним не сталкиваться :) ) баг, с которым мне довелось повстречаться. Мне нужно было создать таблицу в которую я добавлял строки при помощи innerHTML. Код для добавления строк был приблизительно следующим.

function insertData( name, value ){
	var table = document.getElementById('dataTable');
	table.innerHTML += '<tr><td>'+name+'</td><td>'+value+'</td></tr>';
}

Все работало отлично везде, кроме IE. После долгих поисков я все-таки обнаружил причину. Дело в том, что innerHTML нельзя использовать для добавления содержимого в тэги table, thead, tfoot, tr, которые в Internet Explorer доступны только для чтения (больше об этом можно узнать здесь). Поэтому эти элементы нужно создавать при помощи стандартных методов DOM. Однако и здесь хитро подложены грабли. Оказывается, что при создании таблицы в IE, элемент tbody является обязательным, т.е. структура таблицы должна иметь следующий вид table > tbody > tr > td. Например, следующий код будет работать везде, кроме Internet Explorer:

function createTable(){
	var body = document.getElementsByTagName('body')[0];
	var table = document.createElement('table');
	table.setAttribute('border','2');
	var tr = document.createElement('tr');
	var td = document.createElement('td');
	td.setAttribute('id','myCell');
	td.appendChild(document.createTextNode('Это таблица'));

	tr.appendChild(td);
	table.appendChild(tr);
	body.appendChild(table);
}

В IE таблица будет создана и добавлена в документ (это видно в IE Developer Toolbar), но отображаться она не будет! Теперь, если добавить в таблицу элемент tbody, то проблемы исчезнут:

function createTable(){
	var body = document.getElementsByTagName('body')[0];
	var table = document.createElement('table');
	table.setAttribute('border','2');
	var tbody = document.createElement('tbody');
	var tr = document.createElement('tr');
	var td = document.createElement('td');
	td.setAttribute('id','myCell');
	td.appendChild(document.createTextNode('Это таблица'));

	tr.appendChild(td);
	tbody.appendChild(tr);
	table.appendChild(tbody);
	body.appendChild(table);
}

Не правда ли, жесткий баг? И уж очень он смахивает на peekaboo баг, при котором элементы в IE точно так же не отображаются на странице.

И напоследок, интересная ссылка на сайт с описанием четырех багов innerHTML – Web bug track.
До встречи!

Добавить в закладки:
Maklay.com - Большой каталог товаров для спорта и активного отдыха

Комментарии на “Проблемы с созданием таблиц в Internet Explorer”

  1. Если лень заморачиваться, то я в своё время делал так:
    oTbl.outerHTML=oTbl.outerHTML.replace(”", “aaa”);

  2. В предыдущем посте ТЭГИ съелись,
    читать так:
    oTbl.outerHTML=oTbl.outerHTML.replace(”</TABLE>”, “<TR><TD>aaa</TD></TR></TABLE>”);

  3. @ahot
    Спасибо большое за совет. Интересное и простое решение, не встречал такого раньше.

  4. Мой Вам респект и уважение!

    Бился над проблемой самостоятельно несколько дней. Разложил модель тестовой страницы IE по костям до самого нельзя с написанием всевозможных тестов. Осталось только ручками BP(x)в SoftIce цапать.

    Но никак не мог предположить, что для динамического формирования модели табличного документа в IE существует обязательная теговая зависимость table-tbody-tr-td. Слов нет… Это просто бредовая реализация. И сколько же в IE ещё дерьма ???

    P.S. Хорошо, что вовремя притормозил и решил глянуть, что об этом люди думают.

  5. @Algen
    Всегда пожалуйста.
    Я с этим целые сутки бился, благо знание английского и гугл выручили. Рад что кому-то это также полезно как и мне.

  6. Волшебник 12 января 2009 в 17:30

    Похоже что скоро Explorer вообще исчезнет со всех компов из-за огромного списка недостатков, та и кокуренты давят по чуть.

  7. Вот, статья – http://abloga.net.ru/?p=42. Там подробно расписано как добавлять строки. Работает в IE, FireFox и Opera

  8. Лучше бы дом поучили.
    Куча методов по работе с таблицами. ТАм есть такие методы как insertRow и insertCell, а также другие методы по работе с таблицами… Работают визде и более логичны с точки зрения модели. Просто IE тормоз… Кстати заметил, что эксплорер в отлии от мозилы при вызове insertRow вставляет его в tbody, т.е. куда это нужно. А мозила вставляется сразу за последним tr, а значит если tr был в thead, он туда и зхапихает. А вообще пор отходить от кустарных методов позапрошлого века.

  9. Дмитрий, а вы случайно не знаете, как с глюком с thead бороться? В этом смысле ослик отрабатывает нормально — может вставлять строки и в thead, и просто в таблицу. А вот опера, если был создан thead продолжает запихивать строки именно туда. Не нашел, как от этого избавиться.

  10. сам же и отвечу. Сначала программно нужно заполнять таблицу, а уже потом — thead. тогда и в опере, и в осле все нормально работает.

  11. Дмитрий 14 мая 2009 в 10:24

    Когда у меня такое возникло, то таблица у меня со статическими заголовками, только заполнение было динамическим. Сначала, Я решил, что сделаю статический tbody с одним невидимым tr, который просто не будет обрабатываться, но в конечном итоге решил, что это не правильно. И просто всем tr в thead присвоил класс head и просто их не обрабатываю. В конечном итоге стало не принципиально где находятся tr, просто не обрабатываются строки с class=”head”.

Оставить комментарий

JSToolbox создан на основе WordPress