JavaScript修改DOM元素内容的方法大全

 更新时间:2025年09月16日 10:19:27   作者:遂心_  
在前端开发中,动态修改页面内容是实现交互体验的核心技术,本文将全面解析DOM元素内容修改的各种方法、性能考量以及最佳实践,需要的朋友可以参考下

1. 引言:为什么需要动态修改DOM内容?

在现代Web应用中,静态页面已经远远不能满足用户需求。从简单的文本更新到复杂的动态界面,都需要我们能够高效、安全地修改DOM元素内容。掌握DOM内容修改技术,是实现以下功能的基础:

  • 用户交互反馈(如表单提交后的提示信息)
  • 动态数据展示(如实时数据仪表盘)
  • 单页面应用(SPA)的视图更新
  • 内容懒加载和无限滚动

2. 基础方法:三大内容属性对比

2.1 innerHTML:功能强大但需谨慎使用

innerHTML是最常用的内容修改属性,它可以获取或设置元素的HTML内容。

// 获取元素内容
const content = document.getElementById('container').innerHTML;

// 设置元素内容
document.getElementById('container').innerHTML = '<h2>新标题</h2><p>段落内容</p>';

优点

  • 可以解析HTML标签
  • 使用简单直接

缺点

  • 存在XSS安全风险
  • 性能相对较低(尤其是大量操作时)
  • 会破坏现有的事件监听器

2.2 textContent:纯文本操作的安全选择

textContent用于获取或设置元素的文本内容,不会解析HTML标签。

// 获取文本内容
const text = document.getElementById('title').textContent;

// 设置文本内容
document.getElementById('title').textContent = '新的标题文本';

优点

  • 自动转义HTML标签,防止XSS攻击
  • 性能优于innerHTML

缺点

  • 不能解析HTML标签

2.3 innerText:感知样式的文本操作

innerTexttextContent类似,但会考虑CSS样式,不显示隐藏元素的文本。

// 获取可见文本
const visibleText = document.getElementById('element').innerText;

// 设置文本
document.getElementById('element').innerText = '新内容';

优点

  • 考虑元素可见性
  • 返回人类可读的格式(会忽略多余空格和换行)

缺点

  • 性能较差(需要计算样式)
  • 浏览器兼容性略有差异

三大属性对比表

特性innerHTMLtextContentinnerText
处理HTML
性能中等
安全性低(XSS风险)
考虑CSS样式
保留格式是(包括隐藏内容)否(人类可读格式)

3. 高级内容操作技术

3.1 使用DOM API创建和添加元素

直接操作DOM节点虽然代码量较多,但性能更好且更安全。

// 创建新元素
const newDiv = document.createElement('div');
newDiv.className = 'alert';
newDiv.setAttribute('role', 'alert');

// 创建文本节点
const textNode = document.createTextNode('操作成功!');

// 添加文本到元素
newDiv.appendChild(textNode);

// 添加到DOM中
document.getElementById('container').appendChild(newDiv);

3.2 使用DocumentFragment优化批量操作

当需要添加多个元素时,使用DocumentFragment可以显著提高性能。

// 创建文档片段
const fragment = document.createDocumentFragment();

// 批量创建元素并添加到片段
for (let i = 0; i < 100; i++) {
    const item = document.createElement('li');
    item.textContent = `项目 ${i + 1}`;
    fragment.appendChild(item);
}

// 一次性添加到DOM
document.getElementById('list').appendChild(fragment);

3.3 使用insertAdjacentHTML进行精确插入

insertAdjacentHTML方法可以在指定位置插入HTML字符串,比innerHTML更加灵活。

const element = document.getElementById('target');

// 在元素开始前插入
element.insertAdjacentHTML('beforebegin', '<p>在前方插入</p>');

// 在元素第一个子元素前插入
element.insertAdjacentHTML('afterbegin', '<p>在内部开头插入</p>');

// 在最后一个子元素后插入
element.insertAdjacentHTML('beforeend', '<p>在内部末尾插入</p>');

// 在元素结束后插入
element.insertAdjacentHTML('afterend', '<p>在后方插入</p>');

4. 现代API:更优雅的内容操作方式

4.1 使用模板元素(Template)

<template>标签提供了一种更声明式的内容操作方式。

<template id="user-card">
    <div class="user-card">
        <h3 class="user-name"></h3>
        <p class="user-email"></p>
    </div>
</template>
// 使用模板
const template = document.getElementById('user-card');
const clone = template.content.cloneNode(true);

// 填充数据
clone.querySelector('.user-name').textContent = '张三';
clone.querySelector('.user-email').textContent = 'zhangsan@example.com';

// 添加到DOM
document.getElementById('container').appendChild(clone);

4.2 使用DOMParser解析HTML字符串

DOMParser可以将HTML字符串转换为DOM节点,避免XSS风险。

const parser = new DOMParser();
const htmlString = '<div><h2>标题</h2><p>内容</p></div>';

// 解析HTML
const doc = parser.parseFromString(htmlString, 'text/html');
const nodes = doc.body.childNodes;

// 添加到DOM
document.getElementById('container').appendChild(nodes[0]);

5. 性能优化与最佳实践

5.1 减少重排和重绘

DOM操作会触发浏览器的重排和重绘,影响性能。

// 不佳:多次操作触发多次重排
for (let i = 0; i < 100; i++) {
    document.getElementById('list').innerHTML += `<li>项目 ${i}</li>`;
}

// 更佳:使用文档片段减少重排
const fragment = document.createDocumentFragment();
for (let i = 0; i < 100; i++) {
    const li = document.createElement('li');
    li.textContent = `项目 ${i}`;
    fragment.appendChild(li);
}
document.getElementById('list').appendChild(fragment);

5.2 使用事件委托避免内存泄漏

使用innerHTML会移除现有元素上的事件监听器,事件委托可以解决这个问题。

// 不佳:直接添加事件监听器
document.getElementById('container').innerHTML = '<button class="btn">点击</button>';
document.querySelector('.btn').addEventListener('click', handleClick);

// 更佳:使用事件委托
document.getElementById('container').innerHTML = '<button class="btn">点击</button>';
document.getElementById('container').addEventListener('click', (event) => {
    if (event.target.classList.contains('btn')) {
        handleClick();
    }
});

5.3 安全考虑:防止XSS攻击

直接使用innerHTML插入用户提供的内容可能导致XSS攻击。

// 危险:直接插入用户输入
const userInput = '<script>恶意代码</script>';
document.getElementById('container').innerHTML = userInput;

// 安全:使用textContent或DOMParser
document.getElementById('container').textContent = userInput;

// 或者使用专门的消毒库
// 如DOMPurify.sanitize(userInput)

6. 实际应用场景

6.1 动态表单反馈

function showFormMessage(message, type = 'success') {
    const messageDiv = document.createElement('div');
    messageDiv.className = `alert alert-${type}`;
    messageDiv.textContent = message;
    
    // 插入到表单前面
    const form = document.getElementById('myForm');
    form.parentNode.insertBefore(messageDiv, form);
    
    // 3秒后自动消失
    setTimeout(() => {
        messageDiv.remove();
    }, 3000);
}

6.2 实时数据更新

function updateDashboard(data) {
    // 使用文档片段批量更新
    const fragment = document.createDocumentFragment();
    
    Object.entries(data).forEach(([key, value]) => {
        const element = document.createElement('div');
        element.className = 'data-item';
        element.innerHTML = `
            <span class="data-label">${key}:</span>
            <span class="data-value">${value}</span>
        `;
        fragment.appendChild(element);
    });
    
    // 清空容器并添加新内容
    const container = document.getElementById('dashboard');
    container.innerHTML = '';
    container.appendChild(fragment);
}

6.3 无限滚动列表

let isLoading = false;

window.addEventListener('scroll', () => {
    const { scrollTop, scrollHeight, clientHeight } = document.documentElement;
    
    if (scrollTop + clientHeight >= scrollHeight - 100 && !isLoading) {
        isLoading = true;
        
        // 显示加载指示器
        document.getElementById('loading').style.display = 'block';
        
        // 加载更多数据
        loadMoreItems()
            .then(items => {
                const fragment = document.createDocumentFragment();
                
                items.forEach(item => {
                    const li = document.createElement('li');
                    li.textContent = item.title;
                    fragment.appendChild(li);
                });
                
                document.getElementById('list').appendChild(fragment);
            })
            .finally(() => {
                isLoading = false;
                document.getElementById('loading').style.display = 'none';
            });
    }
});

7. 总结与选择指南

修改DOM元素内容有多种方法,选择合适的方法取决于具体场景:

  1. 简单文本更新 → 使用textContent
  2. 需要包含HTML标签 → 使用innerHTML(注意XSS风险)或insertAdjacentHTML
  3. 批量添加多个元素 → 使用DocumentFragment
  4. 复杂模板内容 → 使用<template>标签
  5. 需要最高安全性 → 使用textContentDOMParser

关键要点

  • 优先考虑安全性,避免XSS漏洞
  • 批量操作DOM以减少重排和重绘
  • 根据场景选择最合适的方法
  • 现代API(如Template、DocumentFragment)能提供更好的性能和可维护性

通过掌握这些技术和方法,你将能够高效、安全地操作DOM内容,创建出更加动态和交互性强的Web应用。

以上就是JavaScript修改DOM元素内容的方法大全的详细内容,更多关于JavaScript修改DOM元素内容的资料请关注脚本之家其它相关文章!

相关文章

  • JavaScript实现快速排序的方法分析

    JavaScript实现快速排序的方法分析

    这篇文章主要介绍了JavaScript实现快速排序的方法,结合实例形式分析了快速排序的原理、实现方法及相关操作注意事项,需要的朋友可以参考下
    2018-01-01
  • js实现弹窗效果

    js实现弹窗效果

    这篇文章主要为大家详细介绍了js实现弹窗效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-08-08
  • 微信小程序自定义导航栏实例代码

    微信小程序自定义导航栏实例代码

    这篇文章主要给大家介绍了关于微信小程序自定义导航栏的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用微信小程序具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-04-04
  • 关于JavaScript回调函数的深入理解

    关于JavaScript回调函数的深入理解

    由于函数是一等对象,我们可以把一个函数作为参数传递给另一个函数,然后在那个函数内执行,至也可以被那个函数返回,然后再执行,这篇文章主要给大家介绍了关于JavaScript回调函数的深入理解,需要的朋友可以参考下
    2021-06-06
  • 详解JavaScript中常用操作符的使用

    详解JavaScript中常用操作符的使用

    在 JavaScript 中,有一些操作符可以使代码更简洁、易读和高效。这篇文章为大家整理了11个JavaScript中常用操作符的使用,需要的可以参考一下
    2023-04-04
  • JavaScript实现仿windows文件名称排序

    JavaScript实现仿windows文件名称排序

    在JavaScript中,数组排序是一个常见的操作,本文将通过一个具体的代码示例,解释如何实现一个仿windows文件名称的排序算法,需要的可以参考下
    2024-12-12
  • js实现点击上传图片并设为模糊背景

    js实现点击上传图片并设为模糊背景

    这篇文章主要为大家详细介绍了js实现点击上传图片并设为模糊背景,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-08-08
  • js动态生成form 并用ajax方式提交的实现方法

    js动态生成form 并用ajax方式提交的实现方法

    下面小编就为大家带来一篇js动态生成form 并用ajax方式提交的实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-09-09
  • ES6入门教程之变量的解构赋值详解

    ES6入门教程之变量的解构赋值详解

    这篇文章主要给大家介绍了关于ES6入门教程之变量的解构赋值的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用ES6具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-04-04
  • Javascript实用方法之json合并的场景分析

    Javascript实用方法之json合并的场景分析

    这篇文章主要介绍了Javascript实用方法之json合并,jQuery 的“extend()”方法有两个原型:合并的方法,分别是浅合并和深度合并,本文通过代码给大家介绍的非常详细,需要的朋友可以参考下
    2022-09-09

最新评论