gpt4 book ai didi

ruby - Nokogiri 等效于 jQuery closest() 方法,用于在树中查找第一个匹配的祖先

转载 作者:数据小太阳 更新时间:2023-10-29 06:56:00 26 4
gpt4 key购买 nike

jQuery 有一个可爱的方法,虽然名字有点错误,叫做 closest()遍历 DOM 树寻找匹配的元素。例如,如果我有这个 HTML:

<table src="foo">
<tr>
<td>Yay</td>
</tr>
</table>

假设element设置为 <td> , 然后我可以算出 src 的值像这样:

element.closest('table')['src']

如果缺少 table 元素或其 src 属性,它将干净地返回“undefined”。

在 Javascriptland 中已经习惯了这一点,我很想在 Rubyland 中找到与 Nokogiri 等效的东西,但我能想到的最接近的是使用 ancestors() 的明显不雅的 hack。 :

ancestors = element.ancestors('table')
src = ancestors.any? ? first['src'] : nil

需要三元,因为如果在空数组上调用,则 first 返回 nil。更好的想法?

最佳答案

您可以在空数组上调用first,问题是它将返回nil 而您不能说nil['src'] 不会难过。你可以这样做:

src = (element.ancestors('table').first || { })['src']

如果你在 Rails 中,你可以这样使用 try:

src = element.ancestors('table').first.try(:fetch, 'src')

如果你经常做这种事情,那么用一个方法隐藏丑陋:

def closest_attr_from(e, selector, attr)
a = e.closest(selector)
a ? a[attr] : nil
end

然后

src = closest_attr_from(element, 'table', 'src')

您也可以将其直接修补到 Nokogiri::XML::Node 中(但我不推荐这样做):

class Nokogiri::XML::Node
def closest(selector)
ancestors(selector).first
end
def closest_attr(selector, attr)
a = closest(selector)
a ? a[attr] : nil
end
end

关于ruby - Nokogiri 等效于 jQuery closest() 方法,用于在树中查找第一个匹配的祖先,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8003215/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com