jQuery有一个可爱的,有点错误的名为
closest()的方法,它在DOM树中寻找匹配的元素.例如,如果我有这个HTML:
<table src="foo"> <tr> <td>Yay</td> </tr> </table>
假设元素设置为< td>,那么我可以像这样计算src的值:
element.closest('table')['src']
如果缺少表元素或其src属性,那将彻底返回“undefined”.
在Javascriptland习惯了这个,我很想在Rubyland中找到与Nokogiri相同的东西,但是我能够想出的最接近的是使用ancestors()这个明显不优雅的黑客攻击:
ancestors = element.ancestors('table') src = ancestors.any? ? first['src'] : nil
需要三元组,因为如果在空数组上调用,则返回nil.好主意?
解决方法
你可以先调用一个空数组,问题是它会返回nil并且你不能说nil [‘src’]而不会感到悲伤.你可以这样做:
src = (element.ancestors('table').first || { })['src']
如果你在Rails中,你可以尝试使用:
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