如何将tbody元素强制为非IE浏览器的空表

时间:2012-11-30 16:00:16

标签: javascript dom cross-browser

我有一个非常复杂的旧的infragistics UltraWebGrid实现。我试图强制进入浏览器兼容性,即使他们只是告诉我升级。对于非IE浏览器,我的网格不会为特定网格渲染行。我已经将错误跟踪到一些内置的javascript中,我将在下面添加。我想我可以通过在它尝试渲染动态添加的行之前向网格html表添加一个tbody元素来强制网格工作。我接触这个想法的逻辑如下。我该怎么做呢?

根据This SO question,只有IE会自动将tbody元素广告到空表。其他浏览器至少需要一行才能存在tbody元素。似乎阻止此网格呈现的javascript错误是无法获取主网格表的tbody元素。如果浏览器不是IE,则可以通过javascript强制表中的tbody元素来修复此问题。

旧的infragistics网格内置的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 个答案:

答案 0 :(得分:1)

我建议在顶部设置innerHTML时添加tbody。检查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>";