Как добавить эту строку HTML
var str = '<p>Just some <span>text</span> here</p>';
в DIV с идентификатором 'test'
, который находится в DOM?
(Btw div.innerHTML += str;
неприемлемо.)
Как добавить эту строку HTML
var str = '<p>Just some <span>text</span> here</p>';
в DIV с идентификатором 'test'
, который находится в DOM?
(Btw div.innerHTML += str;
неприемлемо.)
Используйте insertAdjacentHTML
если он доступен, в противном случае используйте какой-то запасной вариант. insertAdjacentHTML поддерживается во всех текущих браузерах.
div.insertAdjacentHTML( 'beforeend', str );
Демонстрация в реальном времени: http://jsfiddle.net/euQ5n/
Это приемлемо?
var child = document.createElement('div');
child.innerHTML = str;
child = child.firstChild;
document.getElementById('test').appendChild(child);
Но Нил ответ - лучшее решение.
Идея состоит в том, чтобы использовать innerHTML
на промежуточном элементе, а затем переместить все его дочерние узлы туда, где вы действительно хотите их через appendChild
.
var target = document.getElementById('test');
var str = '<p>Just some <span>text</span> here</p>';
var temp = document.createElement('div');
temp.innerHTML = str;
while (temp.firstChild) {
target.appendChild(temp.firstChild);
}
Это позволяет избежать уничтожения любых обработчиков событий в div#test
но при этом позволяет добавлять строку HTML.
Вот некоторый тест производительности:
Настройка среды (2019.07.10) MacOs High Sierra 10.13.4 в Chrome 75.0.3770 (64-разрядная версия), Safari 11.1.0 (13604.5.6), Firefox 67.0.0 (64-разрядная версия)
AppendChild
(E) более чем в 2 раза быстрее, чем другие решения для Chrome и insertAdjacentHTML
, insertAdjacentHTML
(F) - самый быстрый в Firefox. innerHTML=
(B) (не путайте с +=
) - это второе быстрое решение во всех браузерах, и оно гораздо удобнее, чем E и F. Вы можете воспроизвести тест на своей машине здесь
function A() {
container.innerHTML += '<p>A: Just some <span>text</span> here</p>';
}
function B() {
container.innerHTML = '<p>B: Just some <span>text</span> here</p>';
}
function C() {
$('#container').append('<p>C: Just some <span>text</span> here</p>');
}
function D() {
var p = document.createElement("p");
p.innerHTML = 'D: Just some <span>text</span> here';
container.appendChild(p);
}
function E() {
var p = document.createElement("p");
var s = document.createElement("span");
s.appendChild( document.createTextNode("text ") );
p.appendChild( document.createTextNode("E: Just some ") );
p.appendChild( s );
p.appendChild( document.createTextNode(" here") );
container.appendChild(p);
}
function F() {
container.insertAdjacentHTML('beforeend', '<p>F: Just some <span>text</span> here</p>');
}
A();
B();
C();
D();
E();
F();
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
This snippet only for show code used in test (in jsperf.com) - it not perform test itself.
<div id="container"></div>
Правильный способ использует insertAdjacentHTML
. В Firefox раньше 8 вы можете вернуться к использованию Range.createContextualFragment
, если ваш str
не содержит тегов script
.
Если ваш str
содержит теги script
, вам нужно удалить элементы script
из фрагмента, возвращаемого createContextualFragment
, перед тем как вставить фрагмент. В противном случае скрипты будут запущены. (insertAdjacentHTML
отмечает, что скрипты не исполняются.)
Почему это неприемлемо?
document.getElementById('test').innerHTML += str
- это учебный способ сделать это.
Быстрый взлом:
<script>
document.children[0].innerHTML="<h1>QUICK_HACK</h1>";
</script>
Случаи использования:
1: Сохранить как файл .html и запустить в Chrome или Firefox или края. (IE не будет работать)
2: использовать в http://js.do
В действии: http://js.do/HeavyMetalCookies/quick_hack
Разбит с комментариями:
<script>
//: The message "QUICK_HACK"
//: wrapped in a header #1 tag.
var text = "<h1>QUICK_HACK</h1>";
//: It a quick hack, so I don't
//: care where it goes on the document,
//: just as long as I can see it.
//: Since I am doing this quick hack in
//: an empty file or scratchpad,
//: it should be visible.
var child = document.children[0];
//: Set the html content of your child
//: to the message you want to see on screen.
child.innerHTML = text;
</script>
Причина, почему я отправил:
У JS.do есть два обязательных элемента:
Но не показывает сообщения console.log. Пришел сюда в поисках быстрого решения. Я просто хочу увидеть результаты нескольких строк кода блокнота, другие решения слишком много работы.
Это может решить
document.getElementById("list-input-email").insertAdjacentHTML('beforeend', '<div class=""><input type="text" name="" value="" class="" /></div>');
InnerHTML очищает все данные как события для существующих узлов
append child с firstChild добавляет только первого дочернего элемента к innerHTML. Например, если мы должны добавить:
<p>text1</p><p>text2</p>
только text1 будет отображаться
Как насчет этого:
добавляет специальный тег к innerHTML путем добавления дочернего элемента, а затем редактирует outerHTML, удаляя созданный нами тег. Не знаю, насколько он умный, но он работает для меня, или вы можете изменить externalHTML на innerHTML, чтобы он не использовал функцию замены
function append(element, str)
{
var child = document.createElement('someshittyuniquetag');
child.innerHTML = str;
element.appendChild(child);
child.outerHTML = child.outerHTML.replace(/<\/?someshittyuniquetag>/, '');
// or Even child.outerHTML = child.innerHTML
}
<div id="testit">
This text is inside the div
<button onclick="append(document.getElementById('testit'), '<button>dadasasdas</button>')">To div</button>
<button onclick="append(this, 'some text')">to this</button>
</div>
Позиции beforebegin и afterend работают только в том случае, если node находится в дереве и имеет родительский элемент. - https://developer.mozilla.org/en-US/docs/Web/API/Element/insertAdjacentHTML