我正在尝试使用 querySelector 来查找表的 NEXT 行中的第一个单元格。因此,从 ROW 1 开始,找到下一个 TR 元素,然后找到该 TR 元素中的第一个子 TD 元素。

但是,当我编写 CSS 选择器时,它返回 null

我的 CSS 选择器语法是:

"tr.row ~ tr td"

这是一个完整的工作示例:
<!DOCTYPE html>
<html>
<head>

    <script>
        function findRow()
        {
            var row1 = document.querySelector("tr.row");
            var targetCell = row1.querySelector("tr.row ~ tr td");
            alert(targetCell);
        }
    </script>

</head>

<body>

    <table>
        <tr class = "row">
            <td class = "cell"></td>
        </tr>
        <tr class = "row">
            <td class = "cell"></td>
        </tr>
    </table>

    <script>
        findRow();
    </script>

</body>
</html>

所以选择器 ".row1 成功地给了我 ID 为 row1 的 TR 元素。

但是,第二个选择器 ".row1 ~ tr td" 返回 null

现在,如果不是使用 querySelector 元素调用 TR ,而是调用 document.querySelector ,它就可以工作。我什至可以调用 row1.parentNode.querySelector ,然后它也能正常工作。这向我表明调用 querySelector 的实际 Element 不包含在要搜索的元素集中。

不幸的是,这不是这里的解决方案。这只是一个简化的例子:在我的实际用例中,我不能从 querySelector 上方的父元素调用 row1 ,因为那样我将失去我所在的上下文 - (在我的实际用例中,我有很多动态- 生成的行,所以如果我调用 document.querySelector ,甚至 row1.parentNode.querySelector 我将丢失我的上下文)。

我意识到我可以用普通的 DOM 遍历循环来做到这一点,但我试图养成在这里使用 querySelector 的习惯,因为这显然对 future 更好。 (另外,我在这里没有使用 jQuery。)我也怀疑 :scope 选择器在这里会有所帮助,但不幸的是,它还没有得到广泛支持。

那么可以使用 querySelector 做我想做的事吗?

最佳答案

使用 querySelector 会很困难。 element.querySelector 的问题在于它只针对后代节点。最好使用类似的东西

var targetCell = row1.nextElementSibling.cells[0];

var row1 = document.querySelector("tr.row"),
    targetCell = row1.nextElementSibling.cells[0];
alert(targetCell);
<table>
  <tr class="row">
    <td class="cell"></td>
  </tr>
  <tr class="row">
    <td class="cell"></td>
  </tr>
</table>


如果你真的想使用它,你可以在 parent 上使用 :nth-child(k) 来引用 k th 元素。
var parent = row1.parentElement,
    index = [].slice.call(parent.children).indexOf(row1) + 1,
    targetCell = parent.querySelector(":nth-child("+index+") ~ tr td");

var row1 = document.querySelector("tr.row"),
    parent = row1.parentElement,
    index = [].slice.call(parent.children).indexOf(row1) + 1,
    targetCell = parent.querySelector(":nth-child("+index+") ~ tr td");
alert(targetCell);
<table>
  <tr class="row">
    <td class="cell"></td>
  </tr>
  <tr class="row">
    <td class="cell"></td>
  </tr>
</table>

关于javascript - 使用 querySelector 查找同级行中包含的下一个单元格,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27571808/

10-11 17:00