#javascript #html
#javascript #HTML
Вопрос:
У меня есть родительский div
узел, содержащий несколько span
элементов, вместе образующих предложение или абзац. Например,
<div>
<span class="red">I </span>
<span class="normal">love </span>
<span class="red">you</span>
<span class="normal">.</span>
</div>
Я хочу вставить span
узел со значением «не» после «I» в первый дочерний узел в div
с использованием JavaScript, вот так
// Note that the position is between the text, not the node positions
// No JavaScript function exists like the below, btw
document.getElementsByTagName("div")[0].insertNodeAtPos(2, mySpanElement);
Для этого у меня есть числовая позиция (здесь, 2), такая, что первый узел будет:
<span class="red">I <span>don't</span>
И если бы у меня была позиция 3, то 1-й дочерний узел был бы нетронутым, а второй дочерний узел был бы:
<span class="normal"><span>don't</span>love </span>
Итак, как я могу вставить узел в любую позицию, независимо от дочерних узлов в div
? Вставленный узел также может находиться внутри дочернего узла. Мне нужно сделать это на ванильном JavaScript без каких-либо рамок.
Заранее спасибо.
Комментарии:
1. Это сразу после того, как
I
2. @Bibberty нет, это после любого смещения позиции в текстовых значениях этих <span> элеме нтов. Я взял 2 просто в качестве примера для позиции, которая привела бы к вставке span после буквы «I».
3. Хорошо, но смещение против слова, которое я заметил. Думаю, я понял.
Ответ №1:
Вы можете использовать insertBefore.
var insertedNode = parentNode.insertBefore(newNode, referenceNode);
insertedNode
Вставляемый узел, то естьnewNode
parentNode
Родительский элемент вновь вставленного узла.newNode
Узел, который нужно вставить.referenceNode
Узел, перед которымnewNode
вставляется.
Комментарии:
1. У меня нет доступа к ссылочному узлу, поскольку я никак не могу узнать, в каком узле находится позиция. Если у меня есть позиция 5, как я могу узнать, в каком <span> узле находится это смещение те кста? Конечно, из приведенного выше примера я могу сказать, что смещение текста на 5 находится на 2-м дочернем узле в < div>. Но мое приложение добавляет дочерние узлы с текстом динамически, поэтому я не могу его отслеживать.
2. Верно, я пропустил ту часть, когда вы отмечаете, что вам нужно вставить его в текст.
Ответ №2:
Здесь используется индекс, основанный на нулевом значении. Попробуйте изменить значение.
// Assumes every word has a span wrapper.
function insertAtNodePosition(pos, element) {
// get container node
let container = document.querySelector('div');
// array of the words (span)
let words = container.querySelectorAll('span');
// determine which one to add before
let word = words[pos];
if(word) {
container.insertBefore(element, word);
} else {
container.childNodes.appendChild(word);
}
}
let myElement = document.createElement('span');
myElement.innerText = "don't ";
insertAtNodePosition(0, myElement);
<div>
<span class="red">I </span>
<span class="normal">love </span>
<span class="red">you</span>
<span class="normal">.</span>
</div>
<!--
I want to insert a span node with value of "don't" after "I " in the first child node in the div using JavaScript, like this
// Note that the position is between the text, not the node positions
// No JavaScript function exists like the below, btw
document.getElementsByTagName("div")[0].insertNodeAtPos(2, mySpanElement);
-->