【问题标题】:Adding content to a table row (<TR>) with javascript?使用 javascript 向表格行 (<TR>) 添加内容?
【发布时间】:2011-06-14 23:10:15
【问题描述】:

我有一张如下表:

<table>
 <tr>
   <td>col 1</td><td>col2</td>
 </tr>
 <tr id="insert">
   <td>field</td><td>Field 2</td>
 </tr>
 <tr>
   <td>another field</td><td>one more field</td>
 </tr>
</table>

现在的问题是我需要在中间行之后动态插入新行(id = insert)。我有一个自定义的 javascript 函数,可以通过对下一个元素使用 insertBefore 调用来插入元素。

使用以下 javascript 成功创建新行:

var new_row = document.createElement('tr');
new_row.innerHTML="<td>test</td>";
insertAfter(document.getElementById("insert"), new_row);

但是,新行拒绝接受任何使用 innerHTML 的简单 html 格式。新行的最终输出类似于:

<tr>test</tr>

你看它不想输出我指定的。实际的脚本要复杂得多,因此不幸的是,使用 appendChild 或类似函数手动添加每个脚本会非常耗时,而且可能相当耗费资源。无论如何我可以在这个表格行中添加一个“html块”并在这个块中定义表格列吗?

我很困惑,非常感谢任何帮助。

【问题讨论】:

    标签: javascript html dom dynamic


    【解决方案1】:

    您可以使用原生的insertCell() 方法插入单元格。

    试试这个:

    示例: http://jsfiddle.net/VzTJa/

    var new_row = document.createElement('tr');
    new_row.insertCell(0).innerHTML = "test";
    new_row.insertCell(1).innerHTML = "test2";
    

    或者您也可以在不使用insertAfter() 函数的情况下使用insertRow() 来完成它。

    示例: http://jsfiddle.net/VzTJa/1/

    var insert = document.getElementById("insert");
    var new_row = insert.parentNode.insertRow( insert.rowIndex + 1 );
    new_row.insertCell(0).innerHTML = "test";
    new_row.insertCell(1).innerHTML = "test2";
    

    试试这个解决方法:

    示例: http://jsfiddle.net/VzTJa/2/

    var temp = '<table><tbody><tr>';
    var close_temp = '</tr></tbody></table>';
    var temp_div = document.createElement('div');
    
    
    var html_to_insert = '<td>tester</td><td>tester</td>';
    
    temp_div.innerHTML = temp + html_to_insert + close_temp;
    insertAfter(document.getElementById("insert"), temp_div.firstChild.firstChild.firstChild);
    
    temp_div.removeChild(temp_div.firstChild);
    

    基本上创建一对表示表格的开始和结束标签的字符串。您将它与您的内容连接起来,并将其设置为临时divinnerHTMl,然后获取您想要的行,然后执行.appendChild()

    可能有更好的方法,或者您可能会找到改进方法。

    我在this article 中看到一个显然在 IE 上工作并部分负责解析器的人提供的解决方案后想出了这个。

    【讨论】:

    • 你说得对,我可能可以独立添加每个单元格,但正如我所提到的,实际的 HTML 要复杂得多,如果我可以一次性添加它会容易得多。需要插入的 HTML 实际上是由 PHP 脚本返回的,所以我也需要对其进行编辑以分别返回每个单元格,这是另一个令人头疼的原因。
    • @Michael:我明白了。如果我没记错的话,innerHTMLtable 元素上存在一些问题(在某些浏览器中)。我不记得解决方法是什么,但我会看看能不能找到它。
    • @Michael:我想我有一个解决方法。我会在一分钟内添加它。我还将发布一篇来自 MS 的人的文章,他显然在 IE 中实现了innerHTML。有趣的阅​​读。该解决方案基于我对他的快速浏览。你可能更喜欢他的。
    • dw:感谢您的帮助!该解决方案有效!我想知道我自己怎么从来没想过。非常感谢您的辛勤工作,并认为值得一提的是,我还可以使用此逻辑添加更多表格行,在此之前,由于复杂性,我正在考虑忽略。再次感谢!
    • document.createElement('tr') vs insertRow 插入1000行哪个更好
    【解决方案2】:

    如果您可以使用 jQuery,请尝试其中的 append 方法。 jQuery append reference

    如果您确实发现性能是一个问题,您可能会通过构建要在 javascript 中添加的动态 DOM 来找到改进之前将其附加到实际的 HTML DOM 元素中可见的。这将使您的重绘次数降至最低。

    【讨论】:

    • jQuery 是一个选项,但是,这是我正在使用的一次性脚本,所以我真的很想用原生 javascript 来完成它,而不是为一个简单的任务导入一个库。如果没有其他方法,我会试一试。
    • 这段代码应该适合你:document.getElementById("insert").parentNode.insertBefore(new_row, document.getElementById("insert").nextSibling); 它可能看起来很奇怪,但试一试,我想你很快就会感到惊讶。
    猜你喜欢
    • 2019-06-29
    • 2021-11-18
    • 2013-03-07
    • 2014-01-19
    • 2023-04-04
    • 1970-01-01
    • 2012-04-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多