Nokogiri 相当于 jQuery Closest() 方法,用于在树中查找第一个匹配的祖先

2024-05-23

jQuery 有一个可爱的方法,虽然命名有些错误,称为最接近() http://api.jquery.com/closest/它会沿着 DOM 树向上寻找匹配的元素。例如,如果我有这样的 HTML:

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

假设element被设定为<td>,那么我可以计算出src像这样:

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

如果缺少 table 元素或其 src 属性,则将干净地返回“未定义”。

在 Javascriptland 中习惯了这一点后,我很想在 Rubyland 中找到与 Nokogiri 相同的东西,但我能想到的最接近的是这个明显不优雅的 hack 使用祖先() http://nokogiri.org/Nokogiri/XML/Node.html#method-i-ancestors:

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

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


您可以致电first在空数组上,问题是它将返回nil你不能说nil['src']没有悲伤。你可以这样做:

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

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

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

如果你经常做这种事情,那么将丑陋的地方隐藏在一个方法中:

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

and then

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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Nokogiri 相当于 jQuery Closest() 方法,用于在树中查找第一个匹配的祖先 的相关文章

随机推荐