Почему нет document.createHTMLNode ()? - PullRequest
       36

Почему нет document.createHTMLNode ()?

9 голосов
/ 25 сентября 2011

Я хочу вставить HTML в текущем диапазоне (диапазон W3C).

Полагаю, мне нужно использовать метод insertNode. И это прекрасно работает с текстом.

Пример:

var node = document.createTextNode("some text");
range.insertNode(node);

Проблема в том, что я хочу вставить html (может быть что-то вроде "

test

чуть больше текста"). И нет createHTMLNode ().

Я попытался использовать createElement ('div'), присвоить ему идентификатор и HTML-код как innerHTML, а затем пытаясь заменить его на значение_узла после его вставки, но оно выдает мне ошибки DOM.

Есть ли способ сделать это без добавления дополнительного HTML-элемента в HTML, который я хочу вставить?

Ответы [ 5 ]

9 голосов
/ 25 сентября 2011

Поскольку "<h1>test</h1>some more text" состоит из элемента HTML и двух фрагментов текста. Это не узел.

Если вы хотите вставить HTML, используйте innerHTML.

Есть ли способ сделать это без добавления дополнительного HTML-элемента в HTML, который я хочу вставить?

Создать элемент (не добавляйте его в документ). Установите его innerHTML. Затем переместите все его дочерние узлы, выполнив цикл по foo.childNodes.

4 голосов
/ 25 сентября 2011

В некоторых браузерах (в частности, не в любой версии IE) объекты Range имеют изначально нестандартные createContextualFragment(), которые могут помочь. Вполне вероятно, что будущие версии браузеров, таких как IE, будут реализовывать это сейчас, когда он был стандартизирован .

Вот пример:

var frag = range.createContextualFragment("<h1>test</h1>some more text");
range.insertNode(frag);
3 голосов
/ 25 сентября 2011

Вместо innerHTML просто используйте appendChild (element); это может вам помочь.Если вы хотите комментировать здесь, и я приведу вам пример.

2 голосов
/ 19 октября 2011

Попробуйте

function createHTMLNode(htmlCode, tooltip) {
    // create html node
    var htmlNode = document.createElement('span');
    htmlNode.innerHTML = htmlCode
    htmlNode.className = 'treehtml';
    htmlNode.setAttribute('title', tooltip);
    return htmlNode;
}

От: http://www.koders.com/javascript/fid21CDC3EB9772B0A50EA149866133F0269A1D37FA.aspx

0 голосов
/ 30 января 2019

Метод Range.insertNode () вставляет узел в начало диапазона.

var range = window.getSelection().getRangeAt(0);

var node = document.createElement('b');

node.innerHTML = 'bold text';

range.insertNode(node); 

Ресурсы

https://developer.mozilla.org/en-US/docs/Web/API/range/insertNode

...