Dodawanie elementu div do treści lub dokumentu w JavaScript

139

Tworzę lightbox w czystym JavaScript. W tym celu robię nakładkę. Chcę dodać tę nakładkę do treści, ale chcę również zachować zawartość na stronie. Mój obecny kod dodaje nakładkę div, ale usuwa również bieżącą zawartość w treści. Jak dodać element div i zachować zawartość w treści?

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
źródło
4
czy próbowałeś dodać go w ten sposób: document.body.innerHTML = '<div style = "pozycja: bezwzględna; szerokość: 100%; wysokość: 100%; krycie: 0,3; indeks z: 100; tło: # 000;" > </div> '+ document.body.innerHTML;
Ricky

Odpowiedzi:

159

Wypróbuj to: -

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

Posługiwać się

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

zamiast

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

Edycja: - Najlepiej byłoby użyć body.appendChildmetody zamiast zmieniaćinnerHTML

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
źródło
18
Musisz wziąć pod uwagę, że wykonanie document.body.innerHTML = „coś” pociąga za sobą wiele niepotrzebnych obliczeń, ponieważ przeglądarka musi przeanalizować ciąg znaków „coś”, a to zajmuje dużo czasu na dużej stronie. Znacznie bardziej wydajnym podejściem jest utworzenie nowego elementu i dołączenie go do DOM. Sprawdź to porównanie na jsperf: jsperf.com/innerhtml-vs-appendchild2
fegemo
14
Takie podejście będzie miało również niepożądane skutki uboczne. Na przykład wszystkie powiązane zdarzenia w elementach podrzędnych staną się niezwiązane po ustawieniu innerHTMLod nowa.
anoopelias
5
To zdecydowanie zła odpowiedź ... pytanie dotyczy dodania elementu, a nie przepisywania całej strony, zobacz JPH po lepszą alternatywę.
Christian
4
-1. To okropny sposób na osiągnięcie tego. Jeśli to czytasz, nie używaj tego powolnego i przestarzałego rozwiązania. Spójrz na odpowiedź @ peter-t
MacroMan
3
Nie tylko jest to powolne, ale niszczy wcześniejsze elementy, więc wszelkie detektory zdarzeń dołączone wcześniej do strony zostaną utracone! Unikaj tego za wszelką cenę. Zamiast tego użyj appendChild.
Kranthi Kiran P 13-17
223

Korzystanie z 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);

Korzystanie z jQuery

$('body').append('<div style="position:absolute;width:100%;height:100%;opacity:0.3;z-index:100;background:#000;"></div>');
Peter T.
źródło
2
najdziwniejsza rzecz. w moim najgorszym przypadku czysty javascript zawsze był sposobem na zrobienie wszystkiego, co chciałem.
Spencer Williams,
3
To powinna być akceptowana odpowiedź. To jedyna odpowiedź, która odnosi się do tego we właściwy sposób.
MacroMan
@MacroMan Nawet wersja jQuery? Używam jquery i również chciałbym to zrobić poprawnie. (Tylko upewniając się, że jego odpowiedź jquery to tylko jedna linia i nie wydaje się tworzyć węzła ani niczego).
felwithe
@felwithe Wersja jQuery jest akceptowalna, ale możesz chcieć utworzyć węzeł od podstaw i zastosować style indywidualnie, jeśli potrzebujesz większej przejrzystości w kodzie.
MacroMan
appendChild()i insertBefore()dają jeszcze większą swobodę w lokalizacji wstawianego elementu
averasko
21

Zamiast zamieniać wszystko na innerHTML, spróbuj:

document.body.appendChild(myExtraNode);

Joakim Poromaa Helger
źródło
10
Pamiętaj, że możesz dostać się do ciała po prostu wykonując document.body.
Christian
To lepsze rozwiązanie.
Abhishek Sinha,
12

ulepszenie postu @Peter T, poprzez zebranie wszystkich rozwiązań w jednym miejscu.

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}";
}

Za pomocą XPathznajdź pozycję elementu w drzewie DOM i wstaw określony tekst w określonej pozycji do elementu XPath_Element. wypróbuj ten kod w konsoli przeglądarki.

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
źródło
2

Spróbuj

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

Możesz stworzyć swój divkod HTML i ustawić go bezpośrednio w body(lub dowolnym elemencie) za pomocą następującego kodu:

var divStr = '<div class="text-warning">Some html</div>';
document.getElementsByTagName('body')[0].innerHTML += divStr;
Yashar Aliabbasi
źródło
najlepszy i najłatwiejszy sposób. Dzięki!
Muhammad Ali
1

Współczesnym sposobem jest użycie ParentNode.append():

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
źródło
0

Najlepszym i lepszym sposobem jest utworzenie elementu i dołączenie go do bodytagu. Drugim sposobem jest najpierw pobranie innerHTMLwłaściwości programu bodyi dodanie za jego pomocą kodu. Na przykład:

var b = document.getElementsByTagName('body');
b.innerHTML = b.innerHTML + "Your code";
Sayanjyoti Das
źródło
3
Po pierwsze, możesz dostać się do treści strony, po prostu robiąc document.body, po drugie, jak wspomniałem wcześniej, nie przepisuj całej strony tylko po to, aby dodać element.
Christian
-2

Oto naprawdę szybka sztuczka: powiedzmy, że chcesz dodać znacznik p wewnątrz znacznika div.

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

I to wszystko.

Poussy
źródło