使用 `Array#[]` 与 `find("...:nth-child(n)")`
Using `Array#[]` versus `find("...:nth-child(n)")`
当我想从多个相同类型的节点中根据索引提取某个节点时,有以下几种方法:
some_table_node.find("tr:nth-child(3)").find("td:nth-child(5)")
some_table_node.all("tr")[2].all("td")[4]
哪种方式更好?你能根据自己的喜好提供论据吗?
find
等待,all
不等待。一般来说,这意味着 find
不那么脆弱(而且更好)。您还应该能够将前者简化为:
some_table_node.find("tr:nth-child(3) td:nth-child(5)")
接受的答案实际上并没有太大的区别,因为可以通过传递计数选项之一使 all
等待。两者之间的真正区别在于 all
(和 first
)的结果无法自动重新加载。这意味着如果您存储一个元素,然后在该元素在页面上被替换后尝试使用它,您将得到一个过时的节点错误。如果您使用 find
它将尝试重新查询查找并重新加载匹配的元素。一个较小的好处是 find
调用将涉及较少的数据传输,因此速度稍快。
另请注意,您的查询并不总是相同的。如果您在 table 中有一个带有一个 tr 的 thead,后跟带有多个 trs 的 tbody,则 all
查询将 return tbody 的第二行,而 find
将return tbody第3行
<table id="some_table">
<thead>
<tr>
<th>...</th>
</tr>
</thead>
<tbody>
<tr>...</tr>
<tr>...</tr> <= some_table_node.all('tr')[2] will return this
<tr>...</tr> <= some_table_node.find('tr:nth-child(3)') will return this
<tr>...</tr>
</tbody>
</table>
当我想从多个相同类型的节点中根据索引提取某个节点时,有以下几种方法:
some_table_node.find("tr:nth-child(3)").find("td:nth-child(5)")
some_table_node.all("tr")[2].all("td")[4]
哪种方式更好?你能根据自己的喜好提供论据吗?
find
等待,all
不等待。一般来说,这意味着 find
不那么脆弱(而且更好)。您还应该能够将前者简化为:
some_table_node.find("tr:nth-child(3) td:nth-child(5)")
接受的答案实际上并没有太大的区别,因为可以通过传递计数选项之一使 all
等待。两者之间的真正区别在于 all
(和 first
)的结果无法自动重新加载。这意味着如果您存储一个元素,然后在该元素在页面上被替换后尝试使用它,您将得到一个过时的节点错误。如果您使用 find
它将尝试重新查询查找并重新加载匹配的元素。一个较小的好处是 find
调用将涉及较少的数据传输,因此速度稍快。
另请注意,您的查询并不总是相同的。如果您在 table 中有一个带有一个 tr 的 thead,后跟带有多个 trs 的 tbody,则 all
查询将 return tbody 的第二行,而 find
将return tbody第3行
<table id="some_table">
<thead>
<tr>
<th>...</th>
</tr>
</thead>
<tbody>
<tr>...</tr>
<tr>...</tr> <= some_table_node.all('tr')[2] will return this
<tr>...</tr> <= some_table_node.find('tr:nth-child(3)') will return this
<tr>...</tr>
</tbody>
</table>