Преобразование HTML-строки в элементы DOM?
Есть ли способ конвертировать HTML как:
<div>
<a href="#"></a>
<span></span>
</div>
или любую другую строку HTML в элемент DOM? (Чтобы я мог использовать appendChild()). Я знаю, что могу делать .innerHTML и .innerText, но это не то, что я хочу - я буквально хочу быть способным преобразовать динамическую строку HTML в элемент DOM, чтобы я мог передать ее в .appendChild().
Обновление: Кажется, есть путаница. У меня есть содержимое HTML в строке, как значение переменной в JavaScript. В документе нет содержимого HTML.
Ответы
Ответ 1
Вы можете использовать DOMParser
примерно так:
var xmlString = "<div id='foo'><a href='#'>Link</a><span></span></div>";
var doc = new DOMParser().parseFromString(xmlString, "text/xml");
console.log(doc.firstChild.innerHTML); // => <a href="#">Link...
console.log(doc.firstChild.firstChild.innerHTML); // => Link
Ответ 2
Обычно вы создаете временный родительский элемент, в который вы можете написать innerHTML
, затем извлеките содержимое:
var wrapper= document.createElement('div');
wrapper.innerHTML= '<div><a href="#"></a><span></span></div>';
var div= wrapper.firstChild;
Если элемент, у которого есть внешний HTML, есть простой <div>
, как здесь, это легко. Если это может быть что-то другое, что не может идти нигде, у вас может быть больше проблем. Например, если это был <li>
, вам нужно, чтобы родительская оболочка была <ul>
.
Но IE не может писать innerHTML
для таких элементов, как <tr>
, поэтому, если у вас есть <td>
, вам придется обернуть всю строку HTML в <table><tbody><tr>
... </tr></tbody></table>
, напишите, что innerHTML
и вытащите фактический <td>
, который вы хотели бы с двух уровней вниз.
Ответ 3
Почему бы не использовать insertAdjacentHTML
например:
// <div id="one">one</div>
var d1 = document.getElementById('one');
d1.insertAdjacentHTML('afterend', '<div id="two">two</div>');
// At this point, the new structure is:
// <div id="one">one</div><div id="two">two</div>here
Ответ 4
Отъезд John Resig чистый JavaScript-анализатор HTML HTML.
EDIT: если вы хотите, чтобы браузер разбирал HTML для вас, innerHTML
- это именно то, что вы хотите. Из этот вопрос SO:
var tempDiv = document.createElement('div');
tempDiv.innerHTML = htmlString;
Ответ 5
Хорошо, я сам осознал ответ, после того как мне пришлось подумать о других ответах людей.: P
var htmlContent = ... // a response via AJAX containing HTML
var e = document.createElement('div');
e.setAttribute('style', 'display: none;');
e.innerHTML = htmlContent;
document.body.appendChild(e);
var htmlConvertedIntoDom = e.lastChild.childNodes; // the HTML converted into a DOM element :), now let remove the
document.body.removeChild(e);
Ответ 6
Вот небольшой полезный код.
var uiHelper = function () {
var htmls = {};
var getHTML = function (url) {
/// <summary>Returns HTML in a string format</summary>
/// <param name="url" type="string">The url to the file with the HTML</param>
if (!htmls[url])
{
var xmlhttp = new XMLHttpRequest();
xmlhttp.open("GET", url, false);
xmlhttp.send();
htmls[url] = xmlhttp.responseText;
};
return htmls[url];
};
return {
getHTML: getHTML
};
}();
- Преобразование HTML-строки в элемент DOM
String.prototype.toDomElement = function () {
var wrapper = document.createElement('div');
wrapper.innerHTML = this;
var df= document.createDocumentFragment();
return df.addChilds(wrapper.children);
};
- помощник прототипа
HTMLElement.prototype.addChilds = function (newChilds) {
/// <summary>Add an array of child elements</summary>
/// <param name="newChilds" type="Array">Array of HTMLElements to add to this HTMLElement</param>
/// <returns type="this" />
for (var i = 0; i < newChilds.length; i += 1) { this.appendChild(newChilds[i]); };
return this;
};
- Использование
thatHTML = uiHelper.getHTML('/Scripts/elevation/ui/add/html/add.txt').toDomElement();
Ответ 7
Просто введите элемент id
и обработайте его, например:
<div id="dv">
<a href="#"></a>
<span></span>
</div>
Теперь вы можете сделать так:
var div = document.getElementById('dv');
div.appendChild(......);
Или с помощью jQuery:
$('#dv').get(0).appendChild(........);
Ответ 8
Вы можете сделать это следующим образом:
String.prototype.toDOM=function(){
var d=document
,i
,a=d.createElement("div")
,b=d.createDocumentFragment();
a.innerHTML=this;
while(i=a.firstChild)b.appendChild(i);
return b;
};
var foo="<img src='//placekitten.com/100/100'>foo<i>bar</i>".toDOM();
document.body.appendChild(foo);
Ответ 9
Во время серфинга я нашел отличные онлайн-инструменты для преобразования HTML в DOM в чистый javascript.
Я предпочитаю this. Просто измените имена переменных и имя функции в соответствии с вашими предпочтениями, и ваш DOM будет готов. Получайте удовольствие....