JavaScript动态获取和修改DOM元素内容的完整指南
作者: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:样式感知的文本获取
innerText
与textContent
类似,但有重要区别:
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, "&") .replace(/</g, "<") .replace(/>/g, ">") .replace(/"/g, """) .replace(/'/g, "'"); } 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, '<') }); 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内容的资料请关注脚本之家其它相关文章!