Agregar elemento div al cuerpo o documento en JavaScript

139

Estoy creando una caja de luz en JavaScript puro. Para eso estoy haciendo una superposición. Quiero agregar esta superposición al cuerpo, pero también quiero mantener el contenido en la página. Mi código actual agrega el div de superposición, pero también elimina el contenido actual en el cuerpo. ¿Cómo agregar un elemento div y mantener los contenidos en el cuerpo?

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
fuente
44
¿Ha intentado agregarlo como: document.body.innerHTML = '<div style = "position: absolute; width: 100%; height: 100%; opacity: 0.3; z-index: 100; background: # 000;" > </div> '+ document.body.innerHTML;
Ricky

Respuestas:

159

Probar esto:-

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

Utilizar

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

en vez de

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

Editar: - Idealmente, debe usar el body.appendChildmétodo en lugar de cambiar elinnerHTML

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
fuente
18
Debe tener en cuenta que hacer document.body.innerHTML = 'algo' incurre en muchos cálculos innecesarios porque el navegador necesita analizar la cadena 'algo' y eso toma mucho en una página grande. Un enfoque mucho más eficaz es crear el nuevo elemento y adjuntarlo al DOM. Compruebe esta comparación en jsperf: jsperf.com/innerhtml-vs-appendchild2
fegemo
14
Este enfoque también tendrá algunos efectos secundarios no deseados. Por ejemplo, todos los eventos vinculados en elementos secundarios se desvincularán una vez que establezca de innerHTMLnuevo.
Anoopelias
55
Esta es definitivamente la respuesta incorrecta ... la pregunta se refiere a agregar un elemento, no a reescribir toda la página, ver JPH para una mejor alternativa.
Christian
44
-1. Esta es una forma horrible de lograr esto. Si está leyendo esto, no use esta solución lenta y anticuada. Mira la respuesta de @ peter-t
MacroMan
3
¡Esto no solo es lento, sino que destruye los elementos anteriores, por lo que se pierden los oyentes de eventos adjuntos a la página anterior! Evite hacer esto a toda costa. Use appendChild en su lugar.
Kranthi Kiran P
223

Usando 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);

Usando jQuery

$('body').append('<div style="position:absolute;width:100%;height:100%;opacity:0.3;z-index:100;background:#000;"></div>');
Peter T.
fuente
2
Lo más extraño. en el peor de los casos, javascript puro siempre ha sido la forma de hacer lo que quería hacer.
Spencer Williams
3
Esta debería ser la respuesta aceptada. Es la única respuesta que trata sobre esto de la manera correcta.
MacroMan
@MacroMan ¿Incluso la versión jquery? Estoy usando jquery y me gustaría hacerlo correctamente de esa manera también. (Solo asegurándose porque su respuesta jquery es solo una línea y no parece crear un nodo ni nada.)
Felwithe
@felwithe La versión jQuery es aceptable, pero es posible que desee crear un nodo desde cero y aplicar los estilos individualmente si necesita más claridad en su código.
MacroMan
appendChild()y insertBefore()dar aún más flexibilidad en la ubicación del elemento que se insertará
averasko
21

En lugar de reemplazar todo con innerHTML, intente:

document.body.appendChild(myExtraNode);

Joakim Poromaa Helger
fuente
10
Tenga en cuenta que puede llegar al cuerpo simplemente haciendo document.body.
Christian
Esta es una mejor solución.
Abhishek Sinha
12

mejorando la publicación de @Peter T, al reunir todas las soluciones en un solo lugar.

Element.insertAdarestHTML ()

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

Usando XPathencontrar la posición del elemento en el árbol DOM e insertar el texto especificado en una posición especificada a un XPath_Element. prueba este código en la consola del navegador.

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
fuente
2

Trata de hacerlo

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

Puede crear su divcódigo HTML y configurarlo directamente en body(O cualquier elemento) con el siguiente código:

var divStr = '<div class="text-warning">Some html</div>';
document.getElementsByTagName('body')[0].innerHTML += divStr;
Yashar Aliabbasi
fuente
La mejor y más fácil manera. ¡Gracias!
Muhammad Ali
1

La forma moderna es usar ParentNode.append(), así:

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
fuente
0

La mejor y mejor manera es crear un elemento y agregarlo a la bodyetiqueta. La segunda forma es obtener primero la innerHTMLpropiedad de bodyy agregarle código. Por ejemplo:

var b = document.getElementsByTagName('body');
b.innerHTML = b.innerHTML + "Your code";
Sayanjyoti Das
fuente
3
En primer lugar, puede acceder al cuerpo de la página simplemente haciendo document.body, en segundo lugar, como mencioné antes, no reescribir toda la página solo para agregar un elemento.
Christian
-2

Aquí hay un truco muy rápido: digamos que quieres agregar la etiqueta p dentro de la etiqueta div.

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

Y eso es.

Poussy
fuente