Javascript 对于非IE浏览器,如何强制tbody元素进入空表

Javascript 对于非IE浏览器,如何强制tbody元素进入空表,javascript,dom,cross-browser,Javascript,Dom,Cross Browser,我有一个非常复杂的老infragistics UltraWebGrid的实现。尽管他们只是告诉我要升级,但我还是在努力提高浏览器的兼容性。“我的网格”没有为非IE浏览器的特定网格渲染行。我已经将错误追溯到一些内置javascript,我将在下面添加这些javascript。我想我可以在网格试图呈现动态添加的行之前,通过向网格html表添加一个tbody元素来强制网格工作。下面是我理解这个想法的逻辑。我该怎么做呢 根据,只有IE会自动将tbody元素添加到空表中。其他浏览器要求至少有一行tbody

我有一个非常复杂的老infragistics UltraWebGrid的实现。尽管他们只是告诉我要升级,但我还是在努力提高浏览器的兼容性。“我的网格”没有为非IE浏览器的特定网格渲染行。我已经将错误追溯到一些内置javascript,我将在下面添加这些javascript。我想我可以在网格试图呈现动态添加的行之前,通过向网格html表添加一个tbody元素来强制网格工作。下面是我理解这个想法的逻辑。我该怎么做呢

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

旧infragistics网格的内置javascript似乎假设这个tbody元素将在一个空网格中。因此,我的页面无法在非IE浏览器中加载网格的行,因为javascript正在调用一个不存在的元素

破坏javascript:

(对于非IE浏览器,这在最后一行断开。我假设是因为没有tbody元素)

var strTransform=this.applyXslToNode(this.Node);
if(标准转换)
{
var anId=(this.AddNewRow?this.AddNewRow.Id:null);
此.Grid._innerObj.innerHTML=“+strTransform+”;
var tbl=this.Element.parentNode;
igtbl_replaceChild(tbl,this.Grid.\u innerObj.firstChild.firstChild,this.Element);
igtbl_fixDOEXml();
var _b=该.Band;
var headerDiv=igtbl_getElementById(this.Grid.Id+“_hdiv”);
var footerDiv=igtbl_getElementById(this.Grid.Id+“_fdiv”);
if(this.AddNewRow)
{
如果(_b.Index>0 | | | u b.AddNewRowView==1&&!headerDiv | | | u 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]。行[0]);
其他的
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>";
var tadd1='';
var tadd2='';
如果(!(/\/.test(strTransform))){
tadd1='';
tadd2='';
}
此.Grid.\u innerObj.innerHTML=
“+tadd1+strTransform+tadd2+”;

您是否尝试将开头更改为此.Grid。\u innerObj.innerHTML=“+strTransform+”“?看起来这似乎是最好的选择。所以我应该能够覆盖这个编译好的javascript?它完全不受第三方控制。是的,设置innerHTML会在您的网页中创建HTML。如果strTransform已经包含tbody,您可以跳过添加一个,如果没有,您可以通过更改strTransform.I添加一个我对javascript很在行,但以前从未做过类似的事情。compiles js看起来像是在向对象类型添加一系列函数作为一种api。格式为~~~var igtbl_ptsBand=[“functionname1”,function(){…},“functionname2”,function(){…},…等等。我应该如何重写此代码?我应该提出一个新问题吗?对于这一部分,我会提出一个新问题,是的。这看起来肯定是我问题的答案…我只需要知道如何重写/替换此代码。我知道这是可能的,我只是没有这样做,或者知道如何重写。@jumpdart,我将检查您关于重写的问题。(为了回答这一部分,我们需要更多关于对象是如何构造的以及您可以访问哪些内容的信息)。
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>";