通常のJavaScriptでプリペンドとアペンドを実装するにはどうすればよいですか?


150

jQueryを使用せずに通常のJavaScriptでプリペンドアペンドを実装するにはどうすればよいですか?


1
どういう意味かわかりません。
ペッカ

@GenericTypeTea:それで、私もほぼ同時にそうしました...今はそのままにしておきます!
Mark Byers、2010

@Mark-あなたの編集はより良かった:)。
djdd87 2010

回答:


147

おそらく、DOMメソッド appendChildとについて質問しているでしょうinsertBefore

parentNode.insertBefore(newChild, refChild)

ノードnewChildparentNode既存の子ノードの前の子として挿入しますrefChild。(戻りますnewChild。)

refChildがnullの場合newChild、子のリストの最後に追加されます。同等に、そしてより読みやすく、を使用します parentNode.appendChild(newChild)


7
したがって、プリペンドは基本的にこれですfunction prepend(tag, ele) { var x =document.getElementsByTagName(tag)[0]; x.insertBefore(ele ,x.children[0]); }
Muhammad Umer 2015

166

ここにあなたを始めるためのスニペットがあります:

theParent = document.getElementById("theParent");
theKid = document.createElement("div");
theKid.innerHTML = 'Are we there yet?';

// append theKid to the end of theParent
theParent.appendChild(theKid);

// prepend theKid to the beginning of theParent
theParent.insertBefore(theKid, theParent.firstChild);

theParent.firstChild内の最初の要素への参照を与え、その前にtheParent置きtheKidます。


ありがとう、なぜプリペンドに追加のdivを作成せずにinsertBeforeを使用するのですか?グラムドリッグの答えのように?
Yosef

これは要素を作成し、それをdomに追加し、作業を追加および追加します
Andrei Cristian Prodan '25

私はGrumdigの答えに比べて、このいずれかを取得する
アンドリュー・

10
それは2015年prepend()です。組み込みのメソッドはまだありますか?
1.21ギガワット2015年

Node.appendまたはnode.appendChildはvoidメソッドです。代わりにinsertBefore(node、null)を使用してください
Suhayb

28

ここで説明することはあまりありませんでしたが、要素の最初または最後にコンテンツを追加する方法を尋ねているだけだと思いますか?もしそうなら、これはあなたがそれをかなり簡単に行うことができる方法です:

//get the target div you want to append/prepend to
var someDiv = document.getElementById("targetDiv");

//append text
someDiv.innerHTML += "Add this text to the end";

//prepend text
someDiv.innerHTML = "Add this text to the beginning" + someDiv.innerHTML;

とても簡単。


ニース、ちょうど私が探していたもの。
Andrei Cristian Prodan 2014

2
@Munzillaこのメソッドは、ブラウザに既存のすべての子を再度解析することを強制します。上記のソリューションでは、ブラウザは指定された子をドキュメントに添付する必要があります。
Sayam Qazi

12

どんなに複雑であっても生のHTML文字列を挿入したい場合は、次のように使用でき insertAdjacentHTMLます。

'beforebegin' 要素自体前。 'afterbegin' 要素すぐ内側、最初の子の前。 'beforeend' 要素の最後、子直後。 'afterend' 要素自体後。

ヒント:いつでも呼び出しElement.outerHTMLて、挿入する要素を表すHTML文字列を取得できます。

使用例:

document.getElementById("foo").insertAdjacentHTML("beforeBegin",
          "<div><h1>I</h1><h2>was</h2><h3>inserted</h3></div>");

デモ

注意: insertAdjacentHTMLが接続されているリスナーは保持されません.addEventLisntener


insertAdjacentHTMLリスナーを保存しません...」どのようなリスナーですか?これはHTMLなので、バインドする要素はまだありません。内の既存の要素を参照している場合foo、それは真のステートメントではありません。全体の要点.insertAdjacentHTMLは、リスナーを維持することです。.innerHTML += "..."古いDOMノードを破壊するを考えているかもしれません。
スパンキー2017

@spankyあなたが文を複数の方法で解釈することができる権利ということである、私が実際に何を意味するのかたてで作成したDOMノードたinsertAdjacentHTML(ないルートもルートの既存の子孫)
アルトゥルgrzesiak

6

私はこれを自分のプロジェクトに追加しましたが、うまくいくようです:

HTMLElement.prototype.prependHtml = function (element) {
    const div = document.createElement('div');
    div.innerHTML = element;
    this.insertBefore(div, this.firstChild);
};

HTMLElement.prototype.appendHtml = function (element) {
    const div = document.createElement('div');
    div.innerHTML = element;
    while (div.children.length > 0) {
        this.appendChild(div.children[0]);
    }
};

例:

document.body.prependHtml(`<a href="#">Hello World</a>`);
document.body.appendHtml(`<a href="#">Hello World</a>`);

5

あなたの人生を簡素化するために、HTMLElementオブジェクトを拡張することができます。古いブラウザでは動作しないかもしれませんが、間違いなくあなたの人生を楽にします:

HTMLElement = typeof(HTMLElement) != 'undefined' ? HTMLElement : Element;

HTMLElement.prototype.prepend = function(element) {
    if (this.firstChild) {
        return this.insertBefore(element, this.firstChild);
    } else {
        return this.appendChild(element);
    }
};

次回はこれを行うことができます:

document.getElementById('container').prepend(document.getElementById('block'));
// or
var element = document.getElementById('anotherElement');
document.body.prepend(div);

1
ノードに子ノードがない場合はどうなりますか?その場合、firstChildはnullになります
felixfbecker 2015年

prependは既に存在します。ParentNode.prepend()を参照してください。prependChildを作成するには、prnt.prepend(chld)を呼び出すだけで十分です
Igor Fomenko

2

次に、prependを使用してドキュメントに段落を追加する例を示します。

var element = document.createElement("p");
var text = document.createTextNode("Example text");
element.appendChild(text);
document.body.prepend(element);

結果:

<p>Example text</p>

1

2017年、私はEdge 15とIE 12でprependメソッドがDiv要素のプロパティとして含まれていないことを知っていますが、誰かが関数をポリフィルするためのクイックリファレンスが必要な場合は、次のようにしました:

 HTMLDivElement.prototype.prepend = (node, ele)=>{ 
               try { node.insertBefore(ele ,node.children[0]);} 
                     catch (e){ throw new Error(e.toString()) } }

ほとんどの最新のブラウザーと互換性のある単純な矢印関数。


0
var insertedElement = parentElement.insertBefore(newElement, referenceElement);

referenceElementがnullまたは未定義の場合、newElementは子ノードのリストの最後に挿入されます。

insertedElement The node being inserted, that is newElement
parentElement The parent of the newly inserted node.
newElement The node to insert.
referenceElement The node before which newElement is inserted.

例はここにあります:Node.insertBefore



-1

これは最良の方法ではありませんが、誰かがすべての前に要素を挿入したい場合は、ここに方法があります。

var newElement = document.createElement("div");
var element = document.getElementById("targetelement");
element.innerHTML = '<div style="display:none !important;"></div>' + element.innerHTML;
var referanceElement = element.children[0];
element.insertBefore(newElement,referanceElement);
element.removeChild(referanceElement);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.