Як додати цей рядок 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/
insertAdjacentHTML
швидше, ніж додавати innerHTML
, тому insertAdjacentHTML
що не серіалізує та не переробляє наявні дочірні елементи елемента.
insertAdjacentHTML
підтримує значення змінених елементів форми, тоді як додавання до innerHTML
відновлення елемента та втрачає весь контекст форми.
Це прийнятно?
var child = document.createElement('div');
child.innerHTML = str;
child = child.firstChild;
document.getElementById('test').appendChild(child);
jsFiddle .
Але , відповідь Нілу є найкращим рішенням.
innerHTML
?
insertAdjacentHTML
.
AppendChild
(E) більш ніж в 2 рази швидше, ніж інші розчини на хромі та сафарі, insertAdjacentHTML
(F) найшвидший на Firefox. innerHTML=
(B) (не плутати з+=
(А)) є другим швидким рішенням у всіх браузерах , і це набагато зручніше , ніж Е і F.
Налаштуйте середовище (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-розрядні)
Ви можете повторити тест на своєму пристрої тут
Ідея полягає в тому, щоб використовувати 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.
Правильний спосіб - це використання insertAdjacentHTML
. У Firefox раніше, ніж 8, ви можете перейти до використання, Range.createContextualFragment
якщо у вас str
немає script
тегів.
Якщо ваші теги str
містять script
, вам потрібно видалити script
елементи, повернуті фрагментом createContextualFragment
перед тим, як вставити фрагмент. Інакше сценарії запускаються. ( insertAdjacentHTML
позначає сценарії невиконаними.)
createContextualFragment
. Я шукав спосіб змусити деякі HTML-файли зі скриптами виконуватись лише в тому випадку, якщо користувач погодиться встановити файл cookie.
Швидкий злом :
<script>
document.children[0].innerHTML="<h1>QUICK_HACK</h1>";
</script>
Використовуйте випадки :
1: Збережіть як .html файл і запустіть у chrome або firefox або edge. (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's 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 має два must-have:
Але не відображаються повідомлення console.log. Сюди прийшли шукати швидкого рішення. Я просто хочу побачити результати кількох рядків коду скретчпад, інші рішення - це занадто багато роботи.
Чому це не прийнятно?
document.getElementById('test').innerHTML += str
був би підручник способом це зробити.
Це може вирішити
document.getElementById("list-input-email").insertAdjacentHTML('beforeend', '<div class=""><input type="text" name="" value="" class="" /></div>');
InnerHTML очистить усі дані, такі як подія для існуючих вузлів
додавання дитини до firstChild додає лише перший дитина до innerHTML. Наприклад, якщо нам потрібно додати:
<p>text1</p><p>text2</p>
відобразиться лише текст1
Як що до цього:
додає спеціальний тег до innerHTML додаванням дочірньої програми, а потім редагує externalHTML, видаляючи створений нами тег. Не знаю, наскільки він розумний, але він працює для мене, або ви можете змінити 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>
Найкоротший - 18 символів (не плутати +=
(згадати ОП) з =
більш детальною інформацією тут )
test.innerHTML=str
innerHTML
ставить рядок у елемент (замінюючи всіх дітей), тоді якinsertAdjacentHTML
ставить його (1) перед елементом, (2) після елемента, (3) всередині елемента перед першим дочірнім або (4) всередині елемента після останньої дитини.