Get the last leaf of a DOM tree (while considering text nodes)

Posted . Visible to the public.

I use this to simulate the (non-existing) :last-letter CSS pseudoclass, e. g. to insert a tombstone Show archive.org snapshot at the end of an article:

findLastLeaf = ($container) ->
  $children = $container.children()
  if $children.length == 0
    $container
  else
    $lastChild = $children.last()
    $lastContent = $container.contents().filter(->
      # Only return nodes that are either elements or non-empty text nodes
      @nodeType == 1 || (@nodeType == 3 && _.strip(@nodeValue) != '')
    ).last()
    if $lastContent.get(0) == $lastChild.get(0)
      findLastLeaf($lastChild)
    else
      $container

Please note that you can't simply say $container.descendants.last() or something similar, since jQuery is ignorant of text nodes.

Henning Koch
License
Source code in this card is licensed under the MIT License.
Posted by Henning Koch to makandra dev (2014-05-19 14:23)