jQuery has a lovely if somewhat misnamed method called closest() that walks up the DOM tree looking for a matching element. For example, if I've got this HTML:
<table src="foo">
<tr>
<td>Yay</td>
</tr>
</table>
Assuming element
is set to <td>
, then I can figure the value of src
like this:
element.closest('table')['src']
And that will cleanly return "undefined" if either of the table element or its src attribute are missing.
Having gotten used to this in Javascriptland, I'd love to find something equivalent for Nokogiri in Rubyland, but the closest I've been able to come up with is this distinctly inelegant hack using ancestors():
ancestors = element.ancestors('table')
src = ancestors.any? ? first['src'] : nil
The ternary is needed because first returns nil if called on an empty array. Better ideas?