Adicionando elemento div ao corpo ou documento em JavaScript

139

Estou criando uma caixa de luz em JavaScript puro. Por isso estou fazendo uma sobreposição. Quero adicionar essa sobreposição ao corpo, mas também quero manter o conteúdo na página. Meu código atual adiciona a div de sobreposição, mas também remove o conteúdo atual no corpo. Como adicionar um elemento div e manter o conteúdo no corpo?

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
fonte
4
você tentou anexá-lo como: document.body.innerHTML = '<div style = "position: absolute; width: 100%; height: 100%; height: 100%; opacidade: 0,3; z-index: 100; background: # 000;" > </div> '+ document.body.innerHTML;
Ricky

Respostas:

159

Experimente: -

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

Usar

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

ao invés de

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

Edit: - Idealmente, você deve usar o body.appendChildmétodo em vez de alterar oinnerHTML

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
fonte
18
Você precisa considerar que fazer document.body.innerHTML = 'something' incorre em muita computação desnecessária porque o navegador precisa analisar a string 'something' e isso leva muito em uma página grande. Uma abordagem muito mais eficiente é criar o novo elemento e anexá-lo ao DOM. Verifique esta comparação em jsperf: jsperf.com/innerhtml-vs-appendchild2
fegemo
14
Essa abordagem também terá alguns efeitos colaterais indesejados. Por exemplo, todos os eventos vinculados nos elementos filho serão desvinculados quando você definir innerHTMLnovamente.
anoopelias 9/03/2015
5
Esta é definitivamente a resposta errada ... a pergunta é sobre adicionar um elemento, não reescrever a página inteira, consulte o JPH para uma alternativa melhor.
Christian
4
-1. Esta é uma maneira terrível de conseguir isso. Se você estiver lendo isso, não use esta solução lenta e datada. Veja a resposta por @ peter-t
MacroMan
3
Isso não é apenas lento, mas destrói os elementos anteriores, para que os ouvintes de eventos anexados à página anterior sejam perdidos! Evite fazer isso a todo custo. Use appendChild.
precisa saber é o seguinte
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.
fonte
2
coisa mais estranha. no pior dos casos, o javascript puro sempre foi o caminho para fazer o que eu queria.
Spencer Williams
3
Essa deve ser a resposta aceita. É a única resposta que faz isso da maneira correta.
Macroman
@ MacroMan Até a versão jquery? Estou usando jquery e gostaria de fazê-lo corretamente dessa maneira também. (Basta ter certeza, porque sua resposta jQuery é apenas uma linha e não parece para criar um nó ou nada.)
felwithe
@felwithe A versão do jQuery é aceitável, mas você pode criar um nó do zero e aplicar os estilos individualmente, se precisar de mais clareza no seu código.
Macroman
appendChild()e insertBefore()dê ainda mais flexibilidade na localização do elemento a ser inserido
averasko 30/01
21

Em vez de substituir tudo pelo innerHTML, tente:

document.body.appendChild(myExtraNode);

Joakim Poromaa Helger
fonte
10
Note que você pode chegar ao corpo simplesmente fazendo document.body.
Christian
Esta é uma solução melhor.
Abhishek Sinha
12

aprimorando a publicação do @Peter T, reunindo todas as soluções em um só lugar.

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

Utilizando, XPathencontre a posição do Elemento na Árvore DOM e insira o texto especificado em uma posição especificada em um XPath_Element. tente este código no console do 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
fonte
2

Tente fazer

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

Você pode criar seu divcódigo HTML e configurá-lo diretamente em body(ou qualquer elemento) com o seguinte código:

var divStr = '<div class="text-warning">Some html</div>';
document.getElementsByTagName('body')[0].innerHTML += divStr;
Yashar Aliabbasi
fonte
a melhor e mais fácil maneira. Obrigado!
Muhammad Ali
1

A maneira moderna é usar ParentNode.append(), assim:

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

A melhor e melhor maneira é criar um elemento e anexá-lo à bodytag. A segunda maneira é primeiro obter a innerHTMLpropriedade de bodye adicionar código a ela. Por exemplo:

var b = document.getElementsByTagName('body');
b.innerHTML = b.innerHTML + "Your code";
Sayanjyoti Das
fonte
3
Em primeiro lugar, você pode acessar o corpo da página simplesmente document.body, em segundo lugar, como mencionei antes, não reescreva a página inteira apenas para acrescentar um elemento.
Christian
-2

Aqui está um truque muito rápido: digamos que você queira adicionar uma tag p dentro da tag div.

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

E é isso.

Poussy
fonte