Как заставить элемент 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>";
Другие вопросы по тегам