javascript技巧

关注公众号 jb51net

关闭
首页 > 网络编程 > JavaScript > javascript技巧 > JavaScript获取和修改DOM内容

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 += ' 追加的内容';

特点

1.2 textContent:纯文本操作

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

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

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

优势

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

innerTexttextContent类似,但有重要区别:

const text = element.innerText;

特点

对比表

属性获取内容解析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);

优势

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

位置参数

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应用。以下是关键要点总结:

选择正确的属性:

性能优化原则:

安全第一:

现代开发:

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

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

您可能感兴趣的文章:
阅读全文