jpa*_*kal 7 ruby dom ancestor nokogiri closest
jQuery有一个可爱的,有点错误的名为nearest()的方法,它在DOM树中寻找匹配的元素.例如,如果我有这个HTML:
<table src="foo">
<tr>
<td>Yay</td>
</tr>
</table>
Run Code Online (Sandbox Code Playgroud)
假设element
设置为<td>
,那么我可以src
像这样计算值:
element.closest('table')['src']
Run Code Online (Sandbox Code Playgroud)
如果缺少表元素或其src属性,那将彻底返回"undefined".
在Javascriptland中习惯了这个,我很想在Rubyland中找到与Nokogiri相同的东西,但是我能够想出的最接近的是使用祖先()的这种明显不优雅的黑客攻击:
ancestors = element.ancestors('table')
src = ancestors.any? ? first['src'] : nil
Run Code Online (Sandbox Code Playgroud)
需要三元组,因为如果在空数组上调用,则返回nil.好主意?
mu *_*ort 11
你可以调用first
一个空数组,问题是它会返回nil
,你不能说nil['src']
没有伤心.你可以这样做:
src = (element.ancestors('table').first || { })['src']
Run Code Online (Sandbox Code Playgroud)
如果你在Rails中,你可以try
这样使用:
src = element.ancestors('table').first.try(:fetch, 'src')
Run Code Online (Sandbox Code Playgroud)
如果你做了很多这样的事情,那么在方法中隐藏丑陋:
def closest_attr_from(e, selector, attr)
a = e.closest(selector)
a ? a[attr] : nil
end
Run Code Online (Sandbox Code Playgroud)
然后
src = closest_attr_from(element, 'table', 'src')
Run Code Online (Sandbox Code Playgroud)
您也可以将其修补到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
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2956 次 |
最近记录: |