Как заставить элемент tbody в пустую таблицу для браузеров не IE
У меня довольно сложная реализация старой инфраструктуры UltraWebGrid. Который я пытаюсь заставить совместимость браузера, хотя они просто говорят мне, чтобы обновить. Моя сетка не отображает строки для определенной сетки для браузеров не IE. Я проследил ошибку до некоторого встроенного JavaScript, который я добавлю ниже. Я думаю, что могу заставить грид работать, добавив элемент tbody в html-таблицу grid, прежде чем он попытается отобразить динамически добавленные строки. Моя логика натолкнуться на эту идею ниже. Как бы я поступил так?
Согласно этому вопросу, только IE автоматически добавляет элемент tbody в пустую таблицу. Другим браузерам требуется хотя бы одна строка для существования элемента tbody. Ошибка javascript, которая, по-видимому, препятствует визуализации этой сетки, заключается в невозможности получить элемент tbody основной таблицы сетки. Это должно быть исправлено путем принудительного использования элемента tbody в таблице с помощью javascript, если браузер отличается от IE.
По-видимому, в старой инфраструктуре инфраструктуры, встроенной в javascript, этот элемент tbody будет находиться в пустой сетке. Из-за этого моя страница не может загрузить строки сетки в браузерах, отличных от IE, потому что javascript вызывает элемент, который не существует.
Взлом JavaScript
(это разрывается на последней строке для браузеров не IE. Я предполагаю, потому что нет элемента tbody)
var strTransform = this.applyXslToNode(this.Node);
if (strTransform)
{
var anId = (this.AddNewRow ? this.AddNewRow.Id : null);
this.Grid._innerObj.innerHTML = "<table style=\"table-layout:fixed;\">" + strTransform + "</table>";
var tbl = this.Element.parentNode;
igtbl_replaceChild(tbl, this.Grid._innerObj.firstChild.firstChild, this.Element);
igtbl_fixDOEXml();
var _b = this.Band;
var headerDiv = igtbl_getElementById(this.Grid.Id + "_hdiv");
var footerDiv = igtbl_getElementById(this.Grid.Id + "_fdiv");
if (this.AddNewRow)
{
if (_b.Index > 0 || _b.AddNewRowView == 1 && !headerDiv || _b.AddNewRowView == 2 && !footerDiv)
{
var anr = this.AddNewRow.Element;
anr.parentNode.removeChild(anr);
if (_b.AddNewRowView == 1 && tbl.tBodies[0].rows.length > 0)
tbl.tBodies[0].insertBefore(anr, tbl.tBodies[0].rows[0]);
else
tbl.tBodies[0].appendChild(anr);
}
this.AddNewRow.Element = igtbl_getElementById(anId);
this.AddNewRow.Element.Object = this.AddNewRow;
}
this.Element = tbl.tBodies[0];
this.Element.Object = this;
1 ответ
Я бы порекомендовал добавить tbody, когда вы устанавливаете innerHTML вверху. Проверьте, содержит ли strTransform элемент tbody, и если нет, добавьте его самостоятельно. Что-то вроде:
var tadd1 = '';
var tadd2 = '';
if (!(/\<tbody\>/.test(strTransform))) {
tadd1 = '<tbody>';
tadd2 = '</tbody>';
}
this.Grid._innerObj.innerHTML =
"<table style=\"table-layout:fixed;\">" + tadd1 + strTransform + tadd2 + "</table>";