Hinzufügen eines div-Elements zum Textkörper oder Dokument in JavaScript

139

Ich erstelle eine Light Box in reinem JavaScript. Dafür mache ich eine Überlagerung. Ich möchte dieses Overlay zum Body hinzufügen, aber ich möchte auch den Inhalt auf der Seite behalten. Mein aktueller Code fügt das Overlay-Div hinzu, entfernt aber auch den aktuellen Inhalt im Body. Wie füge ich ein div-Element hinzu und behalte den Inhalt auf dem Körper?

var el = document.getElementById('element');
var body = document.getElementsByTagName('body');
el.innerHTML = '<p><a id="clickme" href="#">Click me</a></p>';
document.getElementById('clickme').onclick = function (e) {
    e.preventDefault();
    document.body.innerHTML = '<div style="position:absolute;width:100%;height:100%;opacity:0.3;z-index:100;background:#000;"></div>';
}
Om3ga
quelle
4
Haben Sie versucht, es wie folgt anzuhängen: document.body.innerHTML = '<div style = "Position: absolut; Breite: 100%; Höhe: 100%; Deckkraft: 0,3; Z-Index: 100; Hintergrund: # 000;" > </ div> '+ document.body.innerHTML;
Ricky

Antworten:

159

Probieren Sie es aus: -

http://jsfiddle.net/adiioo7/vmfbA/

Verwenden

document.body.innerHTML += '<div style="position:absolute;width:100%;height:100%;opacity:0.3;z-index:100;background:#000;"></div>';

anstatt

document.body.innerHTML = '<div style="position:absolute;width:100%;height:100%;opacity:0.3;z-index:100;background:#000;"></div>';

Bearbeiten: - Idealerweise sollten Sie die body.appendChildMethode verwenden, anstatt die zu änderninnerHTML

var elem = document.createElement('div');
elem.style.cssText = 'position:absolute;width:100%;height:100%;opacity:0.3;z-index:100;background:#000';
document.body.appendChild(elem);
Aditya Singh
quelle
18
Sie müssen berücksichtigen, dass das Ausführen von document.body.innerHTML = 'etwas' viele unnötige Berechnungen erfordert, da der Browser die Zeichenfolge 'etwas' analysieren muss und dies auf einer großen Seite viel kostet. Ein viel leistungsfähigerer Ansatz besteht darin, das neue Element zu erstellen und es an das DOM anzuhängen. Überprüfen Sie diesen Vergleich auf jsperf: jsperf.com/innerhtml-vs-appendchild2
fegemo
14
Dieser Ansatz hat auch einige unerwünschte Nebenwirkungen. Beispielsweise werden alle gebundenen Ereignisse für untergeordnete Elemente ungebunden, sobald Sie sie erneut festlegen innerHTML.
Anoopelias
5
Dies ist definitiv die falsche Antwort. Bei der Frage geht es darum, ein Element hinzuzufügen und nicht die gesamte Seite neu zu schreiben. Eine bessere Alternative finden Sie in JPHs.
Christian
4
-1. Dies ist ein schrecklicher Weg, um dies zu erreichen. Wenn Sie dies lesen, verwenden Sie diese langsame und veraltete Lösung nicht. Schauen Sie sich die Antwort von @ peter-t
MacroMan
3
Dies ist nicht nur langsam, sondern zerstört auch die früheren Elemente, sodass alle Ereignis-Listener, die früher an die Seite angehängt wurden, verloren gehen! Vermeiden Sie dies um jeden Preis. Verwenden Sie stattdessen appendChild.
Kranthi Kiran P
223

Verwenden von Javascript

var elemDiv = document.createElement('div');
elemDiv.style.cssText = 'position:absolute;width:100%;height:100%;opacity:0.3;z-index:100;background:#000;';
document.body.appendChild(elemDiv);

Verwenden von jQuery

$('body').append('<div style="position:absolute;width:100%;height:100%;opacity:0.3;z-index:100;background:#000;"></div>');
Peter T.
quelle
2
seltsamste Sache. Im schlimmsten Fall war reines Javascript immer der Weg, alles zu tun, was ich tun wollte.
Spencer Williams
3
Dies sollte die akzeptierte Antwort sein. Es ist die einzige Antwort, die dies richtig macht.
MacroMan
@ MacroMan Auch die jquery-Version? Ich benutze jquery und möchte es auch so richtig machen. (Nur um sicher zu gehen, weil seine jquery Antwort nur eine Zeile ist und keinen Knoten oder irgendetwas zu schaffen scheint.)
felwithe
@felwithe Die jQuery-Version ist akzeptabel, aber Sie möchten möglicherweise einen Knoten von Grund auf neu erstellen und die Stile einzeln anwenden, wenn Sie mehr Klarheit in Ihrem Code benötigen.
MacroMan
appendChild()und insertBefore()geben Sie noch mehr Flexibilität bei der Position des einzufügenden Elements
Averasko
21

Anstatt alles durch innerHTML zu ersetzen, versuchen Sie:

document.body.appendChild(myExtraNode);

Joakim Poromaa Helger
quelle
10
Beachten Sie, dass Sie einfach zum Körper gelangen können document.body.
Christian
Dies ist eine bessere Lösung.
Abhishek Sinha
12

Verbesserung des Beitrags von @Peter T durch Zusammenführen aller Lösungen an einem Ort.

Element.insertAdjacentHTML ()

function myFunction() {
    window.document.body.insertAdjacentHTML( 'afterbegin', '<div id="myID" style="color:blue;"> With some data...</div>' );
}
function addElement(){
    var elemDiv = document.createElement('div');
    elemDiv.style.cssText = 'width:100%;height:10%;background:rgb(192,192,192);';
    elemDiv.innerHTML = 'Added element with some data'; 
    window.document.body.insertBefore(elemDiv, window.document.body.firstChild);
    // document.body.appendChild(elemDiv); // appends last of that element
}
function addCSS() {
    window.document.getElementsByTagName("style")[0].innerHTML += ".mycss {text-align:center}";
}

Verwenden Sie XPathSuchen der Position des Elements im DOM-Baum und fügen Sie den angegebenen Text an einer angegebenen Position in ein XPath_Element ein. Versuchen Sie diesen Code über die Browserkonsole.

function insertHTML_ByXPath( xpath, position, newElement) {
    var element = document.evaluate(xpath, window.document, null, 9, null ).singleNodeValue;
    element.insertAdjacentHTML(position, newElement);
    element.style='border:3px solid orange';
}

var xpath_DOMElement = '//*[@id="answer-33669996"]/table/tbody/tr[1]/td[2]/div';
var childHTML = '<div id="Yash">Hi My name is <B>\"YASHWANTH\"</B></div>';
var position = 'beforeend';
insertHTML_ByXPath(xpath_DOMElement, position, childHTML);
Yash
quelle
2

Versuchen Sie es

document.body.innerHTML += '<div style="position:absolute;width:100%;height:100%;opacity:0.3;z-index:100;background:#000;"></div>'
Cody Norden
quelle
2

Sie können Ihren divHTML-Code erstellen und ihn bodymit folgendem Code direkt in (oder ein beliebiges Element) setzen:

var divStr = '<div class="text-warning">Some html</div>';
document.getElementsByTagName('body')[0].innerHTML += divStr;
Yashar Aliabbasi
quelle
der beste und einfachste Weg. Vielen Dank!
Muhammad Ali
1

Der moderne Weg ist ParentNode.append(), wie folgt zu verwenden :

let element = document.createElement('div');
element.style.cssText = 'position:absolute;width:100%;height:100%;opacity:0.3;z-index:100;background:#000;';
document.body.append(element);

Luís Ramalho
quelle
0

Der beste und bessere Weg ist, ein Element zu erstellen und es an das bodyTag anzuhängen . Der zweite Weg besteht darin, zuerst die innerHTMLEigenschaft von bodyabzurufen und Code hinzuzufügen. Beispielsweise:

var b = document.getElementsByTagName('body');
b.innerHTML = b.innerHTML + "Your code";
Sayanjyoti Das
quelle
3
Erstens können Sie zum Seitenkörper gelangen, indem Sie einfach document.body, wie bereits erwähnt, nicht die gesamte Seite neu schreiben, nur um ein Element anzuhängen.
Christian
-2

Hier ist ein sehr schneller Trick: Angenommen, Sie möchten ein p-Tag in das div-Tag einfügen.

<div>
<p><script>document.write(<variablename>)</script></p>
</div>

Und das ist es.

Poussy
quelle