Замена элемента со всеми потрохами
Есть ли универсальный способ заменить существующий DOM элемент, вместе с самим тегом и параметрами по аналогии с replaceChild(), но без предварительного создания средствами document.createElement(), то есть новый эелемент перед заменой имеется только в виде текстовой переменной (html).
спасибо. |
Пока только вот такое в голову пришло.
function replace_element_by_html(target, html) { var tmpNode = document.createElement('div'); tmpNode.innerHTML = html; for (key in tmpNode.childNodes) { target.parentNode.insertBefore(tmpNode.childNodes[key].cloneNode(true), target); } target.parentNode.removeChild(target); } Не очень конечно с точки зрения производительности. |
Попробуй так:
function replace_element_by_html(ele, html){ var newEle=ele.cloneNode(false); newEle.innerHTML=html; ele.parentNode.insertBefore(newEle, ele); ele.parentNode.removeChild(ele); } |
Цитата:
|
Цитата:
|
Цитата:
переписывать не newEle, а в цикле все его содержимое. Но это все равно противоречит ТС: Цитата:
|
Цитата:
Всё же неважно, решение найденно. Можно также делать cloneNode родительского элемента и манипулировать с ним, но в некоторых случаях это будет накладнее по ресурсам. P.S. такой вопрос: может существует стандартная функция которая переводит html в коллекцию элементов, никто не в курсе ? |
Цитата:
|
Цитата:
function html2hodes(h){ var newEl=document.createElement('span'); newEl.innerHTML=h; return newEl.childNodes; } Однако я голову уже сломал размышляя, почему нельзя использовать createElement? Что в нём такого запретного? |
Цитата:
по теме можно еще DocumentFragment попробовать заюзать |
document.createElement() можно и нужно! юзать. Но есть ситуации, когда этот метод не подходит, например если html получаешь ajax-ом.
document.createDocumentFragment() можно использовать в цикле затусовав туда все элементы, а потом один раз replaceChild, вместо множественных insertBefore; function replace(targetNode, html) { var tmpNode = document.createElement('div'); tmpNode.innerHTML = html; var fragmentNode = document.createDocumentFragment(); while (tmpNode.firstChild) { fragmentNode.appendChild(tmpNode.firstChild); } targetNode.parentNode.replaceChild(fragmentNode, targetNode); } |
Часовой пояс GMT +3, время: 20:56. |