Javascript innerHTML无法处理IE7上的表行元素?

Javascript innerHTML无法处理IE7上的表行元素?,javascript,html-table,Javascript,Html Table,请检查此示例: 我使用innerHTML设置表行内容,包括单元格内容,在Firefox和Chrome上运行良好。然而,它在IE7和IE9兼容模式上都有一个bug。表格HTML结果为: <TABLE id=table1> <TBODY> <TR> <TD> Test </TD> </TR> <TR> ABC </TD> </TR> <

请检查此示例:

我使用innerHTML设置表行内容,包括单元格内容,在Firefox和Chrome上运行良好。然而,它在IE7和IE9兼容模式上都有一个bug。表格HTML结果为:

<TABLE id=table1>
 <TBODY>
  <TR>
   <TD>
    Test
   </TD>
  </TR>
  <TR>
   ABC
   </TD>
  </TR>
 </TBODY>
</TABLE>
请注意第二排,它有一个错误。我不明白为什么innerHTML会导致IE7出现这个错误。如何纠正这个问题

我还有一个问题:如果我不在表元素中使用tbody标记,如下所示:

var html = "<table id='table1'><tr><td>Test</td></tr></table>";
浏览器仍呈现此标记


请帮我回答上面两个问题

Internet Explorer在向表中添加HTML时存在臭名昭著的问题。最好的解决方案是使用一个第三方库,它可以规范跨浏览器的行为,例如,但还有其他浏览器

jQuery示例:

// invokes a function when document is ready
// dollar symbol is "jQuery" alias inside function
jQuery(function($) {
    // select the table body and append a new row
    $('#table1 tbody').append('<tr><td>ABC</td></tr>');
});
还有,第二行缺少起始标记


您的第二个问题:不需要tbody,我相信如果您有一个thead和一个tfoot,XHTML就需要它。

您不能使用innerHTML属性在IE中编写表的一部分,您必须使用DOM方法。innerHTML可用于编写整个表或单元格的内容

MSDN上有一个示例:

还有一个关于MDN的示例:

在其他地方发布的代码中,最好在此处发布:

// create table
var html = "<table id='table1'><tbody><tr><td>Test</td></tr></tbody></table>";
document.getElementById('div1').innerHTML = html;
上述方法在所有浏览器中都能正常工作

tr.innerHTML = s;
Ooops只能分配给单元格td或th的innerHTML,而不能分配给表的任何其他部分

tr.innerHTML = '<td>' + 'ABC' + '</td>';
您可以使用该属性来简化:

var tbody = document.getElementById('table1').tBodies[0];
tbody.appendChild(tr);
如果您没有弄乱tr的innerHTML,这将很好地工作

请注意,您还可以执行以下操作:

var tbody = document.getElementById('table1').tBodies[0];
var row = tbody.insertRow(-1);
var cell = row.insertCell(-1);
cell.innerHTML = 'whatever';

你完成了。您还可以克隆整行,然后使用innerHTML修改单元格内容。

您的代码没有意义。var s=tr.innerHTML;tr.innerHTML=s。将内部html设置为某物,将tr设置为自身,然后在一个固定字符串中销毁所有这些内容?我给出了这个上下文,以便您很容易看到这个问题。首先,tr.innerHTML是有效的HTML->I将其分配给变量“s”。在我将's'重新分配给tr.innerHTML之后,没有任何更改。显然,tr.innerHTML有一些变化。我不知道为什么。请检查:你可以在任何浏览器上运行它。tbody标签总是在table元素中创建的,这很正常。有关更多信息,请参阅。我只是在谈论源HTML。请注意,表中的tbody元素是必需的,但是标记是可选的。是的。混淆的关键在于浏览器会修复您的怪癖并为您插入标记,这就是为什么源HTML可能不同于有效的HTML。
var tbody = document.getElementById('table1').tBodies[0];
tbody.appendChild(tr);
var tbody = document.getElementById('table1').tBodies[0];
var row = tbody.insertRow(-1);
var cell = row.insertCell(-1);
cell.innerHTML = 'whatever';