我有一个非常复杂的旧的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;
答案 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>";