在 JavaScript 中将 div 元素添加到正文或文档

IT技术 javascript
2021-01-22 17:22:35

我正在用纯 JavaScript 创建一个灯箱。为此,我正在制作一个叠加层。我想将此覆盖添加到正文,但我也想保留页面上的内容。我当前的代码添加了覆盖 div,但它也删除了正文中的当前内容。如何添加 div 元素并将内容保留在正文中?

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>';
}
6个回答

使用 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);

使用 jQuery

$('body').append('<div style="position:absolute;width:100%;height:100%;opacity:0.3;z-index:100;background:#000;"></div>');
@MacroMan 甚至是 jquery 版本?我正在使用 jquery,并且也希望以这种方式正确地使用它。(只是确保因为他的 jquery 答案只有一行并且似乎没有创建节点或任何东西。)
2021-03-22 17:22:35
最奇怪的事情。在我最糟糕的情况下,纯 javascript 一直是做任何我想做的事情的方式。
2021-04-05 17:22:35
这应该是公认的答案。这是以正确方式解决此问题的唯一答案。
2021-04-05 17:22:35
@felwithe jQuery 版本是可以接受的,但如果您需要更清晰的代码,您可能希望从头开始创建一个节点并单独应用样式。
2021-04-05 17:22:35
appendChild()insertBefore()在要插入的元素的位置上提供更大的灵活性
2021-04-06 17:22:35

试试这个:-

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

利用

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

代替

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

编辑:- 理想情况下,您应该使用body.appendChild方法而不是更改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);
您需要考虑执行 document.body.innerHTML = 'something' 会导致大量不必要的计算,因为浏览器需要解析 'something' 字符串,这在大页面中会占用大量资源。一种更高效的方法是创建新元素并将其附加到 DOM。在 jsperf 上检查这个比较:jsperf.com/innerhtml-vs-appendchild2
2021-03-26 17:22:35
这绝对是错误的答案......问题是关于添加一个元素,而不是重写整个页面,请参阅 JPH 以获得更好的选择。
2021-03-26 17:22:35
这种方法也会产生一些不需要的副作用。例如,一旦您innerHTML重新设置,所有子元素上的绑定事件将变为未绑定
2021-03-27 17:22:35
这不仅很慢,而且会破坏较早的元素,因此先前附加到页面的任何事件侦听器都将丢失!不惜一切代价避免这样做。使用 appendChild 代替。
2021-04-10 17:22:35
-1. 这是实现这一目标的糟糕方法。如果您正在阅读本文,请不要使用这种缓慢而过时的解决方案。看看@peter-t 的回答
2021-04-14 17:22:35

不要用 innerHTML 替换所有内容,请尝试:

document.body.appendChild(myExtraNode);

这是一个更好的解决方案。
2021-03-19 17:22:35
请注意,您只需执行document.body.
2021-04-05 17:22:35

通过将所有解决方案收集到一个地方来改进@Peter T 的帖子。

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

使用XPath查找元素在 DOM 树中的位置并将指定文本插入到 XPath_Element 的指定位置。通过浏览器控制台尝试此代码。

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"]';
var childHTML = '<div id="Yash">Hi My name is <B>\"YASHWANTH\"</B></div>';
var position = 'beforeend';
insertHTML_ByXPath(xpath_DOMElement, position, childHTML);

现代方法是使用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);