JavaScript动态获取和修改DOM元素内容的完整指南

 更新时间:2025年06月23日 09:06:02   作者:AllenBright  
在现代Web开发中,动态获取和修改DOM元素内容是构建交互式用户界面的核心技能,无论是更新实时数据、创建动态内容还是响应用户交互,都离不开对DOM内容的精确控制,本文将全面介绍JavaScript中操作DOM内容的各种方法,需要的朋友可以参考下

1. DOM内容操作基础

1.1 innerHTML:强大的内容操作属性

innerHTML是最常用的DOM内容操作属性之一,它可以获取或设置元素的HTML内容:

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

// 获取HTML内容
const content = element.innerHTML;
console.log(content); // 输出元素内的所有HTML字符串

// 设置HTML内容
element.innerHTML = '<strong>新内容</strong> <em>包含HTML标签</em>';

// 追加内容
element.innerHTML += ' 追加的内容';

特点

  • 可以解析HTML标签
  • 性能较高(浏览器优化良好)
  • 会触发重绘(repaint)
  • 存在XSS安全风险(需对用户输入进行转义)

1.2 textContent:纯文本操作

当不需要HTML解析时,textContent是更安全的选择:

// 获取纯文本内容(忽略所有HTML标签)
const text = element.textContent;

// 设置纯文本内容(HTML标签会被转义显示)
element.textContent = '<strong>这段代码会原样显示</strong>';

优势

  • 自动转义HTML标签,防止XSS攻击
  • 性能略优于innerHTML(不需要解析HTML)
  • 获取时包含所有子元素的文本(包括隐藏元素)

1.3 innerText:样式感知的文本获取

innerTexttextContent类似,但有重要区别:

const text = element.innerText;

特点

  • 只返回"可见"文本(受CSS样式影响)
  • 不返回<script><style>元素内容
  • 会触发重排(reflow)以计算布局
  • 不是标准属性(但被所有现代浏览器支持)

对比表

属性获取内容解析HTML性能注意
innerHTML包含HTML标签XSS风险
textContent纯文本标准属性
innerText可见文本非标准

2. 表单元素内容操作

表单元素(input, textarea, select等)有特殊的属性来操作内容:

2.1 value属性

const input = document.querySelector('input[type="text"]');

// 获取值
const inputValue = input.value;

// 设置值
input.value = '新的输入值';

2.2 特殊表单元素

textarea

const textarea = document.querySelector('textarea');
textarea.value = '多行文本内容';

select

const select = document.querySelector('select');

// 获取选中值
const selectedValue = select.value;

// 设置选中值
select.value = 'option2';

// 获取选中项
const selectedOption = select.options[select.selectedIndex];

checkbox/radio

const checkbox = document.querySelector('input[type="checkbox"]');

// 获取选中状态
const isChecked = checkbox.checked;

// 设置选中状态
checkbox.checked = true;

3. 高级内容操作技巧

3.1 使用DocumentFragment高效批量操作

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

优势

  • 减少DOM操作次数
  • 避免多次重排和重绘
  • 提高性能(特别对大量元素)

3.2 使用模板字符串动态生成内容

const user = { name: '张三', age: 30 };

element.innerHTML = `
  <div class="user-card">
    <h2>${user.name}</h2>
    <p>年龄: ${user.age}</p>
    <p>注册时间: ${new Date().toLocaleDateString()}</p>
  </div>
`;

3.3 使用insertAdjacentHTML精确控制插入位置

element.insertAdjacentHTML('beforebegin', '<p>在元素前插入</p>');
element.insertAdjacentHTML('afterbegin', '<p>在元素内开头插入</p>');
element.insertAdjacentHTML('beforeend', '<p>在元素内末尾插入</p>');
element.insertAdjacentHTML('afterend', '<p>在元素后插入</p>');

位置参数

  • beforebegin:元素自身之前
  • afterbegin:元素内部第一个子节点之前
  • beforeend:元素内部最后一个子节点之后
  • afterend:元素自身之后

4. 内容操作性能优化

4.1 减少DOM操作次数

不佳实践

// 多次操作DOM
for (let i = 0; i < 100; i++) {
  const div = document.createElement('div');
  document.body.appendChild(div);
}

优化方案

// 单次操作DOM
const container = document.createElement('div');
for (let i = 0; i < 100; i++) {
  const div = document.createElement('div');
  container.appendChild(div);
}
document.body.appendChild(container);

4.2 使用事件委托减少内容更新

// 而不是为每个元素添加监听器
document.getElementById('list').addEventListener('click', function(e) {
  if (e.target.tagName === 'LI') {
    e.target.textContent = '已点击';
  }
});

4.3 使用requestAnimationFrame优化动画内容更新

function updateContent() {
  element.textContent = new Date().toLocaleTimeString();
  requestAnimationFrame(updateContent);
}

requestAnimationFrame(updateContent);

5. 安全注意事项

5.1 防范XSS攻击

危险做法

element.innerHTML = userProvidedContent; // 可能包含恶意脚本

安全做法

// 使用textContent
element.textContent = userProvidedContent;

// 或转义HTML
function escapeHtml(unsafe) {
  return unsafe
    .replace(/&/g, "&amp;")
    .replace(/</g, "&lt;")
    .replace(/>/g, "&gt;")
    .replace(/"/g, "&quot;")
    .replace(/'/g, "&#039;");
}

element.innerHTML = escapeHtml(userProvidedContent);

5.2 使用现代API增强安全性

DOMPurify库:

const clean = DOMPurify.sanitize(userProvidedContent);
element.innerHTML = clean;

Trusted Types API(现代浏览器):

if (window.trustedTypes && window.trustedTypes.createPolicy) {
  const escapePolicy = trustedTypes.createPolicy('myEscapePolicy', {
    createHTML: string => string.replace(/</g, '&lt;')
  });
  element.innerHTML = escapePolicy.createHTML(userProvidedContent);
}

6. 现代框架中的内容操作

6.1 React中的内容操作

function MyComponent() {
  const [content, setContent] = useState('初始内容');

  return (
    <div>
      <div dangerouslySetInnerHTML={{__html: sanitizedContent}} />
      <button onClick={() => setContent('新内容')}>更新</button>
    </div>
  );
}

6.2 Vue中的内容操作

<template>
  <div v-html="sanitizedContent"></div>
  <button @click="content = '新内容'">更新</button>
</template>

<script>
export default {
  data() {
    return {
      content: '初始内容'
    }
  },
  computed: {
    sanitizedContent() {
      // 在这里实现净化逻辑
      return this.content;
    }
  }
}
</script>

7. 总结与最佳实践

DOM内容操作是前端开发的基础技能,正确使用这些技术可以创建动态、交互式的Web应用。以下是关键要点总结:

选择正确的属性:

  • 需要HTML解析 → innerHTML
  • 纯文本操作 → textContent
  • 表单元素 → value/checked等

性能优化原则:

  • 减少DOM操作次数
  • 批量更新内容
  • 使用文档片段
  • 合理使用事件委托

安全第一:

  • 永远不要直接插入未净化的用户输入
  • 优先使用textContent而非innerHTML
  • 考虑使用DOMPurify等净化库

现代开发:

  • 框架提供了更安全的内容操作方式
  • 利用虚拟DOM减少直接操作
  • 遵循框架的最佳实践

随着Web平台的不断发展,DOM操作API也在持续演进。掌握这些基础技术将帮助您构建更高效、更安全的Web应用程序。

以上就是JavaScript动态获取和修改DOM元素内容的完整指南的详细内容,更多关于JavaScript获取和修改DOM内容的资料请关注脚本之家其它相关文章!

相关文章

  • 使用20行JS代码实现屏幕录制功能

    使用20行JS代码实现屏幕录制功能

    在开发中可能有遇到过屏幕录制的需求,无论是教学、演示还是游戏录制,都需要通过屏幕录制来记录和分享内容,MediaRecorder 是一种强大的技术,可以在浏览器端实现屏幕录制功能,本文将介绍如何使用JS MediaRecorder 实现屏幕录制,需要的朋友可以参考下
    2023-11-11
  • JavaScript编程的10+最佳实践解决方案

    JavaScript编程的10+最佳实践解决方案

    在现代Web开发中,JavaScript已经成为无法替代的核心技术,在现代Web开发中,JavaScript已经成为无法替代的核心技术,本文将通过代码示例详细介绍一些实践解决方案,感兴趣的同学可以参考下
    2023-06-06
  • 学会javascript之迭代器

    学会javascript之迭代器

    本文主要讲解javascript之迭代器,在 JavaScript 中,迭代器是一个对象,它定义一个序列,并在终止时可能返回一个返回值。需要详细了解相关知识的小伙伴可以参考一下这篇文章
    2021-09-09
  • Javascript基础教程之比较null和undefined值

    Javascript基础教程之比较null和undefined值

    这篇文章主要介绍了Javascript基础教程之比较null和undefined值的相关知识,非常不错,具有参考借鉴价值,感兴趣的朋友一起学习吧
    2016-05-05
  • 在百度知道团队中快速审批新成员的js脚本

    在百度知道团队中快速审批新成员的js脚本

    每天都有大量网友申请加入我的团队,于是审核团队新成员成了一个费力气的活儿,在此情况下,我写了个脚本,自动计算他们的回答采纳率,采纳率低于20%的自动打勾 选中,等级太低的人也自动打勾选中
    2014-02-02
  • 前端js中的事件循环eventloop机制详解

    前端js中的事件循环eventloop机制详解

    这篇文章主要给大家介绍了关于前端js中事件循环eventloop机制的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用js具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-05-05
  • Bootstrap的图片轮播示例代码

    Bootstrap的图片轮播示例代码

    Bootstrap 是一个用于快速开发 Web 应用程序和网站的前端框架。Bootstrap 是基于 HTML、CSS、JAVASCRIPT 的。本文给大家分享Bootstrap的图片轮播示例代码,小伙伴们快来围观吧。
    2015-08-08
  • 微信小程序自定义toast的实现代码

    微信小程序自定义toast的实现代码

    这篇文章主要介绍了微信小程序自定义toast的实现代码,本文以toast为例通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-11-11
  • javascript 数据结构的题

    javascript 数据结构的题

    面试题是3个数据结构的题,可以用java/c/c++/python实现,靠,js也能实现,鄙视js?我上机就用js写的,虽说肯定没戏,但js我挺。
    2008-07-07
  • 代码触发js事件(click、change)示例应用

    代码触发js事件(click、change)示例应用

    Chrome , Firfox 不支持fireEvent的方法可以使用dispatchEvent的方法替代,直接给一个兼容的Code,下面有个不错的示例,喜欢的朋友可以收藏下
    2013-12-12

最新评论