Как вставить строку HTML между двумя узлами DOM?
Рассмотрим следующий фрагмент DOM:
<div id="div-1">foo</div>
<div id="div-2">bar</div>
Можно ли вставлять HTML-строку (EDIT: содержит теги для визуализации) между div, не обертывая ее в другой div (EDIT: или какой-либо другой тег), созданный с помощью document.createElement и устанавливающий его свойство innerHTML?
Ответы
Ответ 1
Большинство браузеров поддерживают element#insertAdjacentHTML()
, который в итоге стал стандартным в Спецификация HTML5. К сожалению, Firefox 7 и ниже не поддерживают его, но мне удалось найти обходной путь, который использует диапазоны для вставки HTML. Я адаптировал его ниже для работы по вашему сценарию:
var el = document.getElementById("div-2"),
html = "<span>Some HTML <b>here</b></span>";
// Internet Explorer, Opera, Chrome, Firefox 8+ and Safari
if (el.insertAdjacentHTML)
el.insertAdjacentHTML ("beforebegin", html);
else {
var range = document.createRange();
var frag = range.createContextualFragment(html);
el.parentNode.insertBefore(frag, el);
}
Пример в реальном времени: http://jsfiddle.net/AndyE/jARTf/
Ответ 2
Это делается для прямого текста, так как я читаю ваш исходный вопрос (см. ниже обновление для строк, содержащих теги):
var div = document.getElementById('div-2');
var textNode = document.createTextNode('your text');
div.parentNode.insertBefore(textNode, div);
Живой пример
Если вы начинаете с:
<div id="div-1">foo</div>div id="div-2">bar</div>
(обратите внимание, что между ними нет пробелов), то результат выше - это именно то, что вы получили бы с этим HTML:
<div id="div-1">foo</div>your text<div id="div-2">bar</div>
Если у вас действительно есть пробел между div, у вас уже будет текст node, и выше будет добавлено другое рядом с ним. Для практически всех целей и задач это не имеет значения, но если это вас беспокоит, вы можете добавить к существующему тексту node, если хотите:
var text = 'your text';
var div = document.getElementById('div-2');
var prev = div.previousSibling;
if (prev && prev.nodeType == 3) { // 3 == TEXT_NODE
// Prev is a text node, append to it
prev.nodeValue = prev.nodeValue + text;
}
else {
// Prev isn't a text node, insert one
var textNode = document.createTextNode(text);
div.parentNode.insertBefore(textNode, div);
}
Живой пример
Ссылки на документы W3C: insertBefore
, createTextNode
Включение тегов HTML
В вашем пересмотренном вопросе вы сказали, что хотите включить теги для интерпретации при выполнении всего этого. Это возможно, но это круговое движение. Сначала вы помещаете HTML-строку в элемент, затем переместите материал, например:
var text, div, tempdiv, node, next, parent;
// The text
text = 'your text <em>with</em> <strong>tags</strong> in it';
// Get the element to insert in front of, and its parent
div = document.getElementById('div-2');
parent = div.parentNode;
// Create a temporary container and render the HTML to it
tempdiv = document.createElement('div');
tempdiv.innerHTML = text;
// Walk through the children of the container, moving them
// to the desired target. Note that we have to be sure to
// grab the node next sibling *before* we move it, because
// these things are live and when we moev it, well, the next
// sibling will become div-2!
node = tempdiv.firstChild;
next = node.nextSibling;
while (node) {
parent.insertBefore(node, div);
node = next;
next = node ? node.nextSibling : undefined;
}
Пример в реальном времени
Но здесь есть драконы, вам нужно выбрать элемент контейнера в соответствии с содержимым, которое вы вставляете. Например, мы не могли использовать <tr>
в тексте с указанным выше кодом, потому что мы вставляем его в div
, а не в tbody
, и поэтому это недействительно, а результаты являются специфичными для реализации. Подобные сложности - вот почему у нас есть библиотеки, которые помогают нам. Вы запросили необработанный ответ DOM и что то, что было выше, но я действительно проверил jQuery, Closure, Prototype, YUI или любой из нескольких других. Они сгладят много вещей для вас.
Ответ 3
var neuB = document.createElement("b");
var neuBText = document.createTextNode("mit fettem Text ");
neuB.appendChild(neuBText);
document.getElementById("derText").insertBefore(neuB, document.getElementById("derKursiveText"));
Вы искали: insertBefore
Ответ 4
Использование jquery очень просто:
$("#div-1").after("Other tag here!!!");
Смотрите: jquery.after
Очевидно, что javascript не является чистым решением для JavaScript.