在IE中无法在tbody上设置innerHTML

tes*_*ter 25 javascript internet-explorer

我有这样一张桌子:

<table>
<thead>
    <tr>
        <th colspan="1">a</th>
        <th colspan="3">b</th>
    </tr>
</thead>
<tbody id="replaceMe">
    <tr>
        <td>data 1</td>
        <td>data 2</td>
        <td>data 3</td>
        <td>data 4</td>
    </tr>
</tbody>
</table>
Run Code Online (Sandbox Code Playgroud)

一个方法在ajax请求后返回以下内容:

<tr>
    <td>data 1 new</td>
    <td>data 2 new</td>
    <td>data 3 new</td>
    <td>data 4 new</td>
</tr>
Run Code Online (Sandbox Code Playgroud)

我想改变innerHTML

document.getElementById('replaceMe').innerHTML = data.responseText;
Run Code Online (Sandbox Code Playgroud)

但是,似乎IE无法设置innerHTML <tbody>.任何人都可以帮我解决这个问题的简单方法吗?

Hem*_*ock 32

确实如此,tbody元素上的innerHTML在IE中是readOnly

该属性是读/写的除以下所有对象,它是只读的:COL,COLGROUP,FRAMESET,HEAD,HTML,STYLE,TABLE,TBODY,TFOOT,THEAD,TITLE,TR.

来源:http://msdn.microsoft.com/en-us/library/ms533897(VS.85).aspx

你可以做这样的事情来解决它:

function setTBodyInnerHTML(tbody, html) {
  var temp = tbody.ownerDocument.createElement('div');
  temp.innerHTML = '<table>' + html + '</table>';

  tbody.parentNode.replaceChild(temp.firstChild.firstChild, tbody);
}
Run Code Online (Sandbox Code Playgroud)

基本上它会创建一个临时节点,您可以注入一个完整的节点table.然后,它取代了tbodytbody从注入table.如果证明它很慢,你可以通过缓存temp而不是每次都创建它来加快速度.

  • 不太好:替换失去了所有原始属性,例如问题中的id ="replaceMe". (2认同)

Jua*_*des 6

创建一个临时节点来存储表,然后将它们复制到tbody

  var tempNode = document.createElement('div');
  tempNode.innerHTML = "<table>" + responseText+ "</table>";

  var tempTable = tempNode.firstChild;
  var tbody = // get a reference to the tbody
  for (var i=0, tr; tr = tempTable.rows[i]; i++) {
    tbody.appendChild(tr);
  } 
Run Code Online (Sandbox Code Playgroud)