Tampermonkey,Chrome如何自动插入行到table?
Tampermonkey, Chrome how to automatically insert rows into a table?
我试过用一种愚蠢的方法为新的 table 插入代码,但即使这样似乎也行不通。什么是正确的方法?
这是我尝试做的事情:
var table = document.getElementsByClassName("test")
[0].getElementsByClassName("tableclass");
for (var i = 0, l = table.length; i < l; i++) {
var content = table[i];
let s = content.innerHTML;
s = s.replace(/table/g, 'table border="1"');
s = s.replace(/tr>[\s\S]*?<tr>[\s\S]*?<td>3/g, 'tr>\r\n<tr>\r\n<td>3');
content.innerHTML = s;
}
还有一个fiddle:https://jsfiddle.net/d10tk7nr/1/
此外,我的愚蠢方法不包含整个 table 的原因是因为我最终要使用它的一些单元格将包含随机数据,我不知道如何跳过它.
我会使用 insertAdjacentHTML,像这样:
table[i].insertAdjacentHTML('beforeend', '<tr><td>5</td><td>6</td></tr>');
请看这个fiddle:https://jsfiddle.net/52axLsfn/4/
还演示了如何设置边框。请注意,此代码针对所有表,因此根据您的情况,您可能希望更加具体。
如果您想创建一个新的 HTML-Element,每个浏览器都能满足您的要求。
var tr = document.createElement('tr');
console.log(tr);
浏览器控制台将准确显示您创建的内容 - 一个新的 HTML 元素,该元素尚未成为 DOM 的一部分:
<tr></tr>
为 table 行创建一些内容也是如此:
var td1 = document.createElement('td'),
td2 = document.createElement('td');
td1.innerText = '5';
td2.innerText = '6';
console.log(td1, td2);
结果将是两个 td 元素:
<td>5</td> <td>6</td>
现在我们必须将这些部分粘合在一起。浏览器也会让你了解这一点:
tr.append(td1);
tr.append(td2);
console.log(tr);
结果是一个完整的 table 行:
<tr><td>5</td><td>6</td></tr>
我们所要做的就是将此行附加到您的 table:
var table = document.querySelector('.test table tbody');
table.append(tr);
您创建的元素现在是 DOM 的一部分 - 准确地说是 table 正文的子元素。
编辑
如果你想将新行插入到特定位置,你必须找到你应该在它旁边的元素并使用insertBefore。这会将最后一段代码更改为:
var targetTr = document.querySelector('.test table tr:nth-child(2)');
targetTr.parentNode.insertBefore(tr, targetTr);
如果您想选择在 javascript 中放置新行的位置,您可以使用子节点 属性:
console.log(table.childNodes);
我试过用一种愚蠢的方法为新的 table 插入代码,但即使这样似乎也行不通。什么是正确的方法? 这是我尝试做的事情:
var table = document.getElementsByClassName("test")
[0].getElementsByClassName("tableclass");
for (var i = 0, l = table.length; i < l; i++) {
var content = table[i];
let s = content.innerHTML;
s = s.replace(/table/g, 'table border="1"');
s = s.replace(/tr>[\s\S]*?<tr>[\s\S]*?<td>3/g, 'tr>\r\n<tr>\r\n<td>3');
content.innerHTML = s;
}
还有一个fiddle:https://jsfiddle.net/d10tk7nr/1/
此外,我的愚蠢方法不包含整个 table 的原因是因为我最终要使用它的一些单元格将包含随机数据,我不知道如何跳过它.
我会使用 insertAdjacentHTML,像这样:
table[i].insertAdjacentHTML('beforeend', '<tr><td>5</td><td>6</td></tr>');
请看这个fiddle:https://jsfiddle.net/52axLsfn/4/
还演示了如何设置边框。请注意,此代码针对所有表,因此根据您的情况,您可能希望更加具体。
如果您想创建一个新的 HTML-Element,每个浏览器都能满足您的要求。
var tr = document.createElement('tr');
console.log(tr);
浏览器控制台将准确显示您创建的内容 - 一个新的 HTML 元素,该元素尚未成为 DOM 的一部分:
<tr></tr>
为 table 行创建一些内容也是如此:
var td1 = document.createElement('td'),
td2 = document.createElement('td');
td1.innerText = '5';
td2.innerText = '6';
console.log(td1, td2);
结果将是两个 td 元素:
<td>5</td> <td>6</td>
现在我们必须将这些部分粘合在一起。浏览器也会让你了解这一点:
tr.append(td1);
tr.append(td2);
console.log(tr);
结果是一个完整的 table 行:
<tr><td>5</td><td>6</td></tr>
我们所要做的就是将此行附加到您的 table:
var table = document.querySelector('.test table tbody');
table.append(tr);
您创建的元素现在是 DOM 的一部分 - 准确地说是 table 正文的子元素。
编辑
如果你想将新行插入到特定位置,你必须找到你应该在它旁边的元素并使用insertBefore。这会将最后一段代码更改为:
var targetTr = document.querySelector('.test table tr:nth-child(2)');
targetTr.parentNode.insertBefore(tr, targetTr);
如果您想选择在 javascript 中放置新行的位置,您可以使用子节点 属性:
console.log(table.childNodes);