除了事件委托,还有哪些处理大量 DOM 元素的方法?

简介: 【10月更文挑战第29天】

除了事件委托之外,还有以下几种处理大量 DOM 元素的方法:

事件节流与防抖

  • 原理:事件节流是指在一定时间内,只允许函数执行一次,即使在这段时间内事件被多次触发,也只有第一次触发时函数会执行。事件防抖则是在事件被触发后,延迟一定时间再执行函数,如果在延迟时间内事件再次被触发,则重新计算延迟时间,直到延迟时间内没有再次触发事件,函数才会执行。
  • 示例:假设页面中有大量的按钮,点击按钮时会发送 AJAX 请求获取数据并更新页面。如果不进行处理,快速点击按钮会导致多次重复的请求,浪费资源且可能导致页面数据混乱。使用事件节流或防抖可以避免这种情况。以节流为例,可以这样实现:
function throttle(func, delay) {
   
  let timer = null;
  return function() {
   
    if (!timer) {
   
      func.apply(this, arguments);
      timer = setTimeout(() => {
   
        timer = null;
      }, delay);
    }
  };
}

const throttledClickHandler = throttle(function() {
   
  // 发送 AJAX 请求并更新页面的逻辑
  console.log('发送请求并更新页面');
}, 1000);

const buttons = document.querySelectorAll('button');
buttons.forEach(button => {
   
  button.addEventListener('click', throttledClickHandler);
});

通过这种方式,无论用户点击按钮的频率多快,在 1 秒钟内只会发送一次请求,有效地减少了不必要的操作,提高了性能。

虚拟 DOM

  • 原理:虚拟 DOM 是一种用 JavaScript 对象来模拟真实 DOM 结构和属性的技术。当数据发生变化时,首先在虚拟 DOM 上进行修改,然后通过对比新旧虚拟 DOM 的差异,只将需要更新的部分应用到真实 DOM 上,而不是直接操作整个真实 DOM,从而减少了对 DOM 的操作次数,提高性能。
  • 示例:在使用 React 或 Vue 等框架时,开发者编写的组件模板会被编译成虚拟 DOM 树。当组件的状态发生变化时,框架会自动更新虚拟 DOM,并高效地将变化应用到真实 DOM。例如,在一个列表组件中,当列表数据发生变化时,框架会快速计算出需要更新的列表项,而不是重新渲染整个列表,大大提高了渲染效率。
// React 示例
import React, { useState } from 'react';

const ListComponent = () => {
  const [items, setItems] = useState([1, 2, 3, 4, 5]);

  const handleAddItem = () => {
    setItems([...items, items.length + 1]);
  };

  return (
    <div>
      <button onClick={handleAddItem}>添加项目</button>
      <ul>
        {items.map((item, index) => (
          <li key={index}>{item}</li>
        ))}
      </ul>
    </div>
  );
};

export default ListComponent;

在上述示例中,当点击按钮添加项目时,React 会高效地更新虚拟 DOM,并仅对新增的列表项进行真实 DOM 的操作,而不是重新渲染整个列表。

文档碎片

  • 原理:文档碎片是一个轻量级的文档对象,它可以包含和操作多个 DOM 节点,但不会像直接操作真实 DOM 那样引起频繁的重绘和回流。当需要对大量 DOM 元素进行批量操作时,可以先将这些元素添加到文档碎片中,然后一次性将文档碎片插入到真实 DOM 中,从而减少 DOM 操作的次数,提高性能。
  • 示例:假设要动态创建一个包含 100 个 <li> 元素的列表,可以使用文档碎片来优化性能。
const fragment = document.createDocumentFragment();
for (let i = 1; i <= 100; i++) {
   
  const li = document.createElement('li');
  li.textContent = '项目 ' + i;
  fragment.appendChild(li);
}
document.getElementById('list').appendChild(fragment);

通过这种方式,只需要一次 DOM 插入操作,而不是 100 次单独的插入操作,大大提高了页面的渲染速度。

懒加载

  • 原理:懒加载是一种延迟加载资源的技术,对于页面中大量的图片、视频等资源,只有当它们进入浏览器的可视区域时才会加载,而不是在页面加载时一次性全部加载。这样可以避免一次性加载大量资源导致页面加载速度过慢,提高页面的初始加载性能。
  • 示例:在一个图片列表页面中,可以使用懒加载来优化图片的加载。当页面滚动时,通过判断图片是否进入可视区域来动态加载图片。例如,使用 IntersectionObserver API 来实现懒加载:
const images = document.querySelectorAll('img[data-src]');

const observer = new IntersectionObserver((entries) => {
   
  entries.forEach((entry) => {
   
    if (entry.isIntersecting) {
   
      const img = entry.target;
      img.src = img.dataset.src;
      observer.unobserve(img);
    }
  });
});

images.forEach((img) => {
   
  observer.observe(img);
});

在上述示例中,只有当图片进入可视区域时,才会将 data-src 属性中的真实图片地址赋给 src 属性,从而加载图片,有效地减少了页面初始加载时的资源请求数量,提高了页面的加载速度。

这些方法都可以在不同的场景下有效地处理大量 DOM 元素,提高页面的性能和用户体验。在实际应用中,可以根据具体的需求和项目特点选择合适的方法或组合使用多种方法来优化 DOM 操作。

相关文章
|
1月前
|
JavaScript 前端开发 索引
js中DOM的基础方法
【10月更文挑战第31天】这些DOM基础方法是操作网页文档结构和实现交互效果的重要工具,通过它们可以动态地改变页面的内容、样式和行为,为用户提供丰富的交互体验。
|
1月前
|
缓存 JavaScript 前端开发
JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用
本文深入讲解了 JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用。
49 5
|
1月前
|
JavaScript 前端开发 开发者
.js的dom元素操作
【10月更文挑战第29天】通过灵活运用这些 DOM 元素操作方法,JavaScript 可以实现丰富的网页交互效果,如动态更新页面内容、响应用户操作、创建和删除页面元素等。在实际开发中,开发者可以根据具体的需求和场景,选择合适的 DOM 元素操作方法来实现所需的功能,为用户提供更加流畅和动态的网页体验。
|
1月前
|
JavaScript 前端开发
|
2月前
|
缓存 编解码 JavaScript
DOM 和 BOM 在项目中应用时的性能优化方法
【10月更文挑战第19天】总之,优化 DOM 和 BOM 的性能需要综合考虑多个方面,通过合理的设计和技术手段,提升项目的运行效率和用户体验。在实际开发中,要不断地进行性能优化实践,以适应不断变化的需求和技术发展。
|
2月前
|
移动开发 JavaScript 前端开发
原生js如何获取dom元素的自定义属性
原生js如何获取dom元素的自定义属性
85 4
|
2月前
|
JavaScript
在Vue中获取DOM元素的实际宽高
【10月更文挑战第2天】
363 1
|
2月前
|
JavaScript 前端开发
DOM的概念?获取html元素的方法有哪些?
DOM的概念?获取html元素的方法有哪些?
38 0
|
2月前
|
JavaScript
DOM 节点列表长度(Node List Length)
DOM 节点列表长度(Node List Length)
|
2月前
|
JavaScript
HTML DOM 节点树
HTML DOM 节点是指在 HTML 文档对象模型中,文档中的所有内容都被视为节点。整个文档是一个文档节点,每个 HTML 元素是元素节点,元素内的文本是文本节点,属性是属性节点,注释是注释节点。DOM 将文档表示为节点树,节点之间有父子和同胞关系。