对于非IE浏览器,如何将tbody元素强制放入空表中



我有一个相当复杂的旧基础结构UltraWebGrid的实现。尽管他们只是告诉我要升级,但我正试图将其强加于浏览器兼容性。我的网格不会为非IE浏览器的某个网格呈现行。我已经将错误追溯到一些内置的javascript,我将在下面添加这些javascript。我想我可以在网格试图呈现动态添加的行之前,通过向网格html表添加一个tbody元素来强制网格工作。我理解这个想法的逻辑如下。我该怎么做?

根据这个SO问题,只有IE会自动将tbody元素广告到空表中。其他浏览器要求tbody元素至少存在一行。似乎阻止该网格渲染的javascript错误是无法获取主网格表的tbody元素。如果浏览器不是IE,则可以通过javascript在表中强制使用tbody元素来解决此问题。

旧的infrastics网格的内置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;

我建议在顶部设置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>";

最新更新