JavaScript 创建、修改和删除节点
|
admin
2025年7月6日 14:14
本文热度 67
|
const newDiv = document.createElement('div');
newDiv.textContent = '我是新来的div';
newDiv.style.backgroundColor = 'lightblue';
newDiv.style.padding = '10px';
createElement
方法接收一个参数, 就是你要创建的 HTML 标签名. 创建后, 这个元素还不会立即出现在页面上, 它只是存在于内存中, 等着被添加到 DOM 树中.const textNode = document.createTextNode('这是一段纯文本内容');
newDiv.appendChild(textNode);
虽然现在大多数情况下我们直接用textContent
或innerText
就够了, 但在某些特殊场景下 createTextNode
还是很有用的.创建好节点后, 我们需要把它们放到页面中才能看到效果:添加到末尾, 这是最常用的方法 , 把节点添加到指定父节点的子节点列表末尾:
const container = document.getElementById('container');
container.appendChild(newDiv);
如果你把一个已存在于文档中的节点 append 到另一个位置, 它会被从原来的位置移动, 而不会被复制.在指定位置插入, 如果你想控制新节点的位置 , 而不是总是添加到末尾, 可以使用 insertBefore:
const newParagraph = document.createElement('p');
newParagraph.textContent = '我在中间';
const firstChild = container.firstChild;
container.insertBefore(newParagraph, firstChild);
insertBefore
接收两个参数: 要插入的节点和参考节点.新节点会被插入到参考节点之前.
更灵活的插入,这组方法提供了更多插入位置的选择:
const targetElement = document.getElementById('target');
targetElement.insertAdjacentHTML('beforebegin', '<div>beforebegin - 在元素前面</div>');
targetElement.insertAdjacentHTML('afterbegin', '<div>afterbegin - 在元素内部开头</div>');
targetElement.insertAdjacentHTML('beforeend', '<div>beforeend - 在元素内部末尾</div>');
targetElement.insertAdjacentHTML('afterend', '<div>afterend - 在元素后面</div>');
三、修改节点, 创建和添加节点后, 我们经常需要修改它们const link = document.createElement('a');
link.href = 'https://www.example.com';
link.title = '示例网站';
link.setAttribute('data-custom', 'value');
link.style.color = 'red';
link.style.textDecoration = 'none';
link.innerHTML = '<strong>点击我</strong>';
link.textContent = '安全的文本内容';
link.innerHTML += ' (追加的内容)';
const newHeading = document.createElement('h2');
newHeading.textContent = '新的标题';
const oldHeading = document.getElementById('old-heading');
const parent = oldHeading.parentNode;
parent.replaceChild(newHeading, oldHeading);
const original = document.getElementById('original');
const shallowClone = original.cloneNode(false);
const deepClone = original.cloneNode(true);
document.body.appendChild(deepClone);
cloneNode
默认不会复制事件监听器,但会复制属性(包括像 onclick
这样的内联事件处理器).const parent = document.getElementById('parent');
const child = document.getElementById('child-to-remove');
parent.removeChild(child);
const elementToRemove = document.getElementById('remove-me');
elementToRemove.remove();
3) DocumentFragment, 批量操作优化:当你需要添加多个节点时,频繁操作 DOM 会导致性能问题.这时可以使用 DocumentFragment:
const fragment = document.createDocumentFragment();
for (let i = 0; i < 100; i++) {
const newItem = document.createElement('li');
newItem.textContent = `项目 ${i}`;
fragment.appendChild(newItem);
}
document.getElementById('list').appendChild(fragment);
五、我们来看一个完整的例子, 结合上面讲的各种方法
function addComment(name, text) {
const fragment = document.createDocumentFragment();
const commentDiv = document.createElement('div');
commentDiv.className = 'comment';
const nameHeading = document.createElement('h3');
nameHeading.textContent = name;
const textParagraph = document.createElement('p');
textParagraph.textContent = text;
const deleteButton = document.createElement('button');
deleteButton.textContent = '删除';
deleteButton.className = 'delete-btn';
commentDiv.appendChild(nameHeading);
commentDiv.appendChild(textParagraph);
commentDiv.appendChild(deleteButton);
fragment.appendChild(commentDiv);
const commentsContainer = document.getElementById('comments');
if (commentsContainer.firstChild) {
commentsContainer.insertBefore(fragment, commentsContainer.firstChild);
} else {
commentsContainer.appendChild(fragment);
}
}
document.getElementById('comments').addEventListener('click', function(e) {
if (e.target.classList.contains('delete-btn')) {
const comment = e.target.closest('.comment');
comment.remove();
}
});
addComment('张三', '这篇文章太棒了!');
addComment('李四', '学到了很多新知识!');
阅读原文:原文链接
该文章在 2025/7/7 9:35:50 编辑过