JavaScriptを使用したHTML要素の挿入


105

次の構文を使用する場合、属性とイベントの各タイプの回避策を面倒に検索する代わりに、

elem = document.createElement("div");
elem.id = 'myID';
elem.innerHTML = ' my Text '
document.body.insertBefore(elem,document.body.childNodes[0]);

HTML要素全体を文字列として宣言する方法はありますか?お気に入り:

elem = document.createElement("<div id='myID'> my Text </div>");
document.body.insertBefore(elem,document.body.childNodes[0]);

回答:


124

直接いじるのではinnerHTMLなく、フラグメントを作成してから挿入する方がよい場合があります。

function create(htmlStr) {
    var frag = document.createDocumentFragment(),
        temp = document.createElement('div');
    temp.innerHTML = htmlStr;
    while (temp.firstChild) {
        frag.appendChild(temp.firstChild);
    }
    return frag;
}

var fragment = create('<div>Hello!</div><p>...</p>');
// You can use native DOM methods to insert the fragment:
document.body.insertBefore(fragment, document.body.childNodes[0]);

利点:

  1. insertBefore、appendChildなどのネイティブDOMメソッドを挿入に使用できます。
  2. 挿入する前に、実際のDOMノードにアクセスできます。フラグメントのchildNodesオブジェクトにアクセスできます。
  3. 文書フラグメントの使用は非常に迅速です。DOMの外部で要素を作成するよりも高速で、特定の状況ではinnerHTMLよりも高速です。

にもかかわらず、innerHTML関数内で使用され、それははるかに速くあなたが思うだろうよりも、ですので、それはDOMのすべて起こっ外です...


3
このcreateDocumentFragment()は「レガシー」のinnerHTMLほど良くないでしょう。
TheFlash

2
この方法は、最新のすべてのブラウザで機能します。IE 5.5以前の場合、次のようなチェックを実行できます。:if(document.createDocumentFragment){create( '...'); } else {/ *おそらくinnerHTMLを使用* /}
James

32
クレセントフレッシュ、私は人々を助けることを楽しんでいるので、私はSOを助けます。ソリューションがすべての状況で100%動作可能ではない場合は、申し訳ありません。懸念がある場合は、すでに提供されている回答を不必要に批判するのではなく、独自のソリューションを提供してみませんか?どんな抽象化でも常にエッジケースがあります!これは学習環境です。私たちはここで人々に解決策を提供するためにここにいるわけではありません。申し訳ありませんが、どこで「AJAX」について言及しましたか?
ジェームズ

1
けっこうだ。謝罪いたします。ここには、警告がまったくない状態で、非常に多くの抽象化が行われているように感じます。
クレセントフレッシュ

1
これは必要以上に複雑です
-sime

83

あなたはこれを求めている

document.body.insertAdjacentHTML( 'afterbegin', '<div id="myID">...</div>' );

13
なぜこれが受け入れられない答えなのかはわかりません。これは非常に単純で、より明確です
JonnyRaa

@JonnyLeedsこれはbody要素では機能しないようですが、他の要素では問題なく機能します。
Phill、2015

1
@Phillもちろん動作し<body>ます。実際のところ、それを実行すること<body>は、コンソールを介してスタイルシートのようなものをWebページに挿入する私の標準的な方法です。どのような問題がありますか?
–ŠimeVidas、2015

@ŠimeVidasおそらくbody要素が実行時に定義されなかったためです...私はあなたの行をwindow.onload = function(){…}とペアにして、その問題を防ぎました
GDY

@Grandy Phillは、他の要素でも機能することを書いています。<body>が未定義の場合、他のすべての要素もそうなるため、これはPhillの問題ではない可能性があります。
サイムVIDAS

32

見ていinsertAdjacentHTMLを

var element = document.getElementById("one");
var newElement = '<div id="two">two</div>'
element.insertAdjacentHTML( 'afterend', newElement )
// new DOM structure: <div id="one">one</div><div id="two">two</div>

positionは、挿入する要素に隣接する位置です。

「beforebegin」 要素自体

'afterbegin' 要素の内側、最初の子の前

'beforeend' 要素の内部、最後の子の後

'afterend' 要素自体


17

古い学校のJavaScriptでは、これを行うことができます。

document.body.innerHTML = '<p id="foo">Some HTML</p>' + document.body.innerHTML;

あなたのコメントに応じて:

[...]要素のではなく、新しい要素の属性とイベントのソースを宣言することに興味がinnerHTMLありました。

ただし、新しいHTMLをDOMに挿入する必要があります。これinnerHTMLが、昔ながらのJavaScriptの例で使用されている理由です。要素は、新しいHTMLで付加されます。実際には内の既存のHTMLには触れていません。innerHTMLBODYBODY

これを明確にするために、上記の例を書き直します。

var newElement = '<p id="foo">This is some dynamically added HTML. Yay!</p>';
var bodyElement = document.body;
bodyElement.innerHTML = newElement + bodyElement.innerHTML;
// note that += cannot be used here; this would result in 'NaN'

JavaScriptフレームワークを使用すると、このコードの冗長性が大幅に低下し、読みやすさが向上します。たとえば、jQueryでは次のことが可能です。

$('body').prepend('<p id="foo">Some HTML</p>');

かなり良い。しかし、要素のinnerHTMLではなく、新しい要素の属性とイベントのソースを宣言することに興味がありました。
TheFlash

1
document.getElementsByTagName('body')[0]確かにdocument.body、良い点に置き換えることができます。ただし、新しいHTMLをBODYの代わりに別の既存の要素に追加または追加する場合は、document.getElementById()および/ を使用する必要がありdocument.getElementsByTagName()ます。そのため、例で使用しました。
Mathias Bynens、2009年

1
また、「innerHTML」を直接追加/挿入している場合、コードが非常に乱雑になる可能性があります
James

1
@JimmyP:なんてごみ!この質問の目的は、HTMLを構築する関数をいじるのではなく、文字列としてHTMLを直接挿入できることです。属性ごと、ノードごと、要素ごとに機能を試す必要はありません。
TheFlash

1
これにより、すべてのイベントハンドラーが切り離され、メモリリークが大きく発生する可能性があります。
adardesign 2010

1

私の知る限り、これはかなり新しいものであり、限られたものですが、この手法の唯一の潜在的な問題は、いくつかのテーブル要素を動的に作成できないことです。

「テンプレート」要素を非表示のDIVに追加し、次にcloneNode(true)を使用してクローンを作成し、必要に応じてそれを追加することで、フォームを使用してテンプレートを作成します。重複を防ぐために、必要に応じてIDを確実に再割り当てする必要があることに注意してください。


-1

他の人が言ったように、便利なjQuery prepend機能はエミュレートできます:

var html = '<div>Hello prepended</div>';
document.body.innerHTML = html + document.body.innerHTML;

innerHTMLを "いじる" ことは避けた方がよいと言う人もいますが、これを知っていれば、多くの使用例で信頼できます。

場合<div><span>または<noembed>ノードが文字を含む、子テキストノードを(有する&)、( <)、または(>)は、innerHTMLプロパティは、としてこれらの文字を返し&amp&ltそして&gtそれぞれ。Node.textContentこれらのテキストノードのコンテンツの正しいコピーを取得するために使用します。

https://developer.mozilla.org/en-US/docs/Web/API/Element/innerHTML

または:

var html = '<div>Hello prepended</div>';
document.body.insertAdjacentHTML('afterbegin', html)

insertAdjacentHTMLおそらく良い代替手段です:https : //developer.mozilla.org/en-US/docs/Web/API/Element/insertAdjacentHTML


-2

既存のページのタグ内にHTMLコードを挿入する場合は、Jneratorを使用します。このツールは、この目標のために特別に作成されました。

次のコードを書く代わりに

    var htmlCode = '<ul class=\'menu-countries\'><li
        class=\'item\'><img src=\'au.png\'></img><span>Australia </span></li><li
        class=\'item\'><img src=\'br.png\'> </img><span>Brazil</span></li><li
        class=\'item\'> <img src=\'ca.png\'></img><span>Canada</span></li></ul>';
    var element = document.getElementById('myTag');
    element.innerHTML = htmlCode;

あなたはより理解しやすい構造を書くことができます

    var jtag = $j.ul({
        class: 'menu-countries',
        child: [
            $j.li({ class: 'item', child: [
                $j.img({ src: 'au.png' }),
                $j.span({ child: 'Australia' })
            ]}),
            $j.li({ class: 'item', child: [
                $j.img({ src: 'br.png' }),
                $j.span({ child: 'Brazil' })
            ]}),
            $j.li({ class: 'item', child: [
                $j.img({ src: 'ca.png' }),
                $j.span({ child: 'Canada' })
            ]})
        ]
    });
    var htmlCode = jtag.html();
    var element = document.getElementById('myTag');
    element.innerHTML = htmlCode;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.