---
title: `r title`
author: "your_name"
date: "11/18/2016"
output: pdf_document
---
使用以下javascript代码,我想在表格的第一行中选择第二个“框”,其ID为“table_x”:
<body>
<table id="table_x">
<tbody>
<tr>
<td></td>
<td>this box should be selected</td>
<td></td>
<td></td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
</tbody>
</table>
</body>
但是,当我想在控制台中输出元素时(使用命令console.log(test);)我只是回到“未定义”。我选择html元素有什么问题?
答案 0 :(得分:5)
我将假设您尝试获取行x
,然后从中获取单元格y
。 (我已将y
用于行,x
用于单元格,但您的代码似乎正好相反。)
如果是这样,您不想使用childNodes
,因为它不仅包含元素,还包括注释节点,文本节点等。
另外,您要确保matrix
引用tbody
元素,而不是table
元素。
然后你可以使用其中任何一个;请注意,其中一个甚至不需要matrix
变量:
function select1(x, y) {
return matrix.children[x].children[y];
}
function select2(x, y) {
return matrix.rows[x].cells[y];
}
function select3(x, y) {
var selector = "#table_x tr:nth-child(" + (x + 1) + ") > td:nth-child(" + (y + 1) + ")";
return document.querySelector(selector);
}
三者的例子:
var matrix = document.querySelector("#table_x tbody");
function select1(x, y) {
return matrix.children[x].children[y];
}
function select2(x, y) {
return matrix.rows[x].cells[y];
}
function select3(x, y) {
var selector = "#table_x tr:nth-child(" + (x + 1) + ") > td:nth-child(" + (y + 1) + ")";
return document.querySelector(selector);
}
select1(0, 0).style.color = "blue";
select2(1, 1).style.color = "green";
select3(2, 2).style.color = "red";
&#13;
<table id="table_x">
<tbody>
<tr>
<td>x</td>
<td>x</td>
<td>x</td>
<td>x</td>
</tr>
<tr>
<td>x</td>
<td>x</td>
<td>x</td>
<td>x</td>
</tr>
<tr>
<td>x</td>
<td>x</td>
<td>x</td>
<td>x</td>
</tr>
<tr>
<td>x</td>
<td>x</td>
<td>x</td>
<td>x</td>
</tr>
</tbody>
</table>
&#13;
答案 1 :(得分:2)
在html表中选择某些内容时,您可以利用表的特殊rows
属性以及每行的类似cells
属性,
这是您的功能的更新版本(添加了id
参数):
function select(x, y, id) {
var matrix = document.getElementById(id)
var row = matrix.rows[x];
var box = row.cells[y];
return box;
}
var test = select(0, 1, 'table_x').style.color = 'red';
&#13;
<table id="table_x">
<tbody>
<tr>
<td></td>
<td>this box should be selected</td>
<td></td>
<td></td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
</tbody>
</table>
&#13;
答案 2 :(得分:1)
DOM元素可以包含元素节点和文本节点。
table_x
的第一个子节点是一个空白文本节点 - 不是 TBODY元素。
要跳过文本节点并仅使用元素节点,请使用children
代替childNodes
。
function select(x, y) {
row = matrix.children[x];
box = row.children[y];
return box;
}
答案 3 :(得分:1)
而不是使用childNodes
使用特定于表格的rows
和cells
。此外,您可以使函数更小/更快地将row
和box
变量合并到返回中。
var matrix = document.getElementById("table_x");
function select(x,y){
return matrix.rows[x].cells[y];
}
var test = select(0,1);
console.log(test);
<body>
<table id="table_x">
<tbody>
<tr>
<td></td>
<td>this box should be selected</td>
<td></td>
<td></td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
</tbody>
</table>
</body>