このHTML文字列を追加する方法
var str = '<p>Just some <span>text</span> here</p>';
dOMにあるID 'test'
のDIVに?
(ところでdiv.innerHTML += str;
は受け入れられません。)
使用可能な場合は insertAdjacentHTML
を使用し、そうでない場合は何らかのフォールバックを使用します。 insertAdjacentHTML 現在のすべてのブラウザでサポートされています 。
div.insertAdjacentHTML( 'beforeend', str );
アイデアは、中間要素で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)Chrome 75.0.3770(64ビット)、Safari 11.1.0(13604.5.6)、Firefox 67.0.0(64ビット)上のMacOs High Sierra 10.13.4
AppendChild
(E)は、chromeおよびsafariの他のソリューションより2倍以上高速です。insertAdjacentHTML
(F)は、firefoxで最速です。 innerHTML=
(B)(+=
と混同しないでください)は、すべてのブラウザーで2番目に高速なソリューションであり、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
を使用することです。 8より前のFirefoxでは、str
にscript
タグが含まれていない場合、Range.createContextualFragment
の使用にフォールバックできます。
str
にscript
タグが含まれる場合、フラグメントを挿入する前に、script
によって返されるフラグメントからcreateContextualFragment
要素を削除する必要があります。それ以外の場合、スクリプトが実行されます。 (insertAdjacentHTML
は、スクリプトを実行不能としてマークします。)
なぜそれが受け入れられないのですか?
document.getElementById('test').innerHTML += str
それを行う教科書の方法になります。
クイックハック:
<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には2つの必須アイテムがあります。
ただし、console.logメッセージは表示されません。簡単な解決策を探してここに来ました。数行のスクラッチパッドコードの結果を確認したいだけで、他のソリューションでは手間がかかります。
これは解決できます
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>
text1のみが表示されます
これはどうですか:
子を追加してinnerHTMLに特別なタグを追加し、作成したタグを削除してouterHTMLを編集します。それがどれほどスマートかわからないが、私にとってはうまくいくか、outerHTMLをinnerHTMLに変更するので、関数replaceを使用する必要はありません
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>