Как добавить дочернего элемента к узлу в определенной позиции?
Вопрос
У меня есть узел, у которого есть два дочерних элемента:HTML-текст и HTML-элемент.
<h1 id="Installation-blahblah">Installation on server<a href="#Installation-blah" class="wiki-anchor">¶</a>
</h1>
В этом случае HTML-текст:
Installation on server
и элемент HTML:
<a href="#Installation-blah" class="wiki-anchor">anchor;</a>
Затем я создаю такой узел:
span_node = Nokogiri::HTML::Node.new('span',doc)
span_node['class'] = 'edit-section'
link_node = Nokogiri::HTML::Node.new('a',doc)
link_node['href'] = "/wiki/#{page_id}/#{@page.title}/edit?section=#{section_index}"
link_node['class'] = 'icon icon-edit'
link_node.content = 'mylink'
span_node.add_child(link_node)
Теперь, чтобы добавить указанный выше узел к основному узлу, я использую следующее:
node.add_child(span_node)
Это добавляет узел диапазона в конец.Как я могу поставить span_node
на глазах у всех детей?
Решение
Спасибо, Песто, за ваше почти правильное решение.
Рабочее решение:
node.children.first.add_previous_sibling(span_node)
Другие советы
Вы можете использовать NodeSet#before
так:
node.children.before(span_node)
NodeSet#before
— это сокращенный метод вставки элемента в качестве первого элемента.Более универсальное решение — использовать Node#before
и Node#after
.Например, some_node.before foo
добавит узел foo
как брат или сестра непосредственно перед этим some_node
. Node#after
похож.Обратите внимание, что это:
node.children.first.before(span_node)
таким образом, эквивалентно приведенному выше решению.
node.prepend_child span_node