【问题标题】:innerHTML not working on table row element on IE7?innerHTML 不适用于 IE7 上的表格行元素?
【发布时间】:2012-09-27 03:22:21
【问题描述】:

请查看此示例:http://jsfiddle.net/lulu2792/a9LZd/

我使用 innerHTML 来设置表格行内容(包括单元格内容),我在 Firefox 和 Chrome 上运行良好。但是,它在 IE7 上有一个错误(也在 IE9 兼容模式下)。表格 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>";

浏览器仍会呈现此标签。

请帮我回答以上两个问题。

【问题讨论】:

  • 您的代码没有意义。 var s = tr.innerHTML; tr.innerHTML = s。将内部 html 设置为某些内容,将 tr 设置为自身,然后销毁所有内容以及固定字符串中的内容?
  • 我给出这个上下文是为了让你很容易看到这个问题。首先, tr.innerHTML 是有效的 HTML -> 我将它分配给变量 's'。在我将 's' 重新分配给 tr.innerHTML 而没有任何更改之后。显然,tr.innerHTML 发生了变化。我不知道为什么。

标签: javascript html-table


【解决方案1】:

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

MSDN上有一个例子:Building Tables Dynamically

MDN上也有一个例子:Using the DOM Table Interface

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

// create table
var html = "<table id='table1'><tbody><tr><td>Test</td></tr></tbody></table>";
document.getElementById('div1').innerHTML = html;

这很好用,因为它会创建一个完整的表格。

// append a row into table
var tr = document.createElement('tr');
var td = document.createElement('td');
td.innerHTML = 'ABC';
tr.appendChild(td);
var s = tr.innerHTML;

以上在所有浏览器中都可以正常工作。

tr.innerHTML = s;

糟糕,只能分配给单元格(td 或 th)的 innerHTML,不能分配给表格的任何其他部分。

tr.innerHTML = '<td>' + 'ABC' + '</td>';

还是一样。

var tbody = document.getElementById('table1').getElementsByTagName('tbody')[0];

您可以使用tBodies 属性来简化:

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 修改单元格内容。

【讨论】:

    【解决方案2】:

    Internet Explorer 在将 HTML 附加到表格时存在臭名昭著的问题。最好的解决方案是使用第三方库来规范跨浏览器的行为(例如jQuery,但还有其他的)。

    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>');
    });
    

    另外,第二行缺少 &lt;td&gt; 开始标记。

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

    【讨论】:

    • 请检查这个:jsfiddle.net/lulu2792/qYFTy您尝试在任何浏览器上运行它。 tbody 标签总是在表格元素内创建。
    • 这很正常。请参阅this answer 了解更多信息。我只是在谈论源 HTML。
    • 请注意,tbody 元素在表格中是必需的,但标签是可选的。
    • 是的。混乱的症结在于浏览器会修复你的“怪癖”并为你插入标签,这就是为什么源 HTML 可能与有效 HTML 不同的原因。
    猜你喜欢
    • 2015-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-22
    • 1970-01-01
    • 1970-01-01
    • 2013-08-05
    相关资源
    最近更新 更多