使用JavaScript和jQuery高效动态生成分组HTML元素

使用javascript和jquery高效动态生成分组html元素

本教程详细阐述如何利用JavaScript和jQuery,从结构化数据中高效动态生成分组的HTML元素,例如带有图片和链接的按钮组。文章将重点介绍如何通过数组切片(slice)和映射(map)的方法,将数据按指定大小分块,并将其转化为可直接插入DOM的HTML字符串,从而避免传统循环嵌套append可能导致的逻辑问题和性能瓶颈,确保页面内容的正确渲染和优化。

动态生成分组HTML元素的挑战

在前端开发中,我们经常需要根据后端返回的数据或本地静态数据,动态地生成大量的HTML元素。一个常见的场景是创建类似轮播图(carousel)或网格布局,其中每个“页面”或“行”包含固定数量的子元素。例如,从一个包含多个按钮信息的数组中,每15个按钮组成一个carousel-item,每个按钮内部包含一个链接和一张图片。

传统的做法可能会尝试使用嵌套的for循环和jQuery的append()方法。然而,在append()内部的函数中,return语句一旦执行,就会立即退出当前函数,导致只添加第一个元素,而不是循环中生成的所有元素。这使得直接在append()内部构建复杂的多元素结构变得困难且容易出错。

// 常见但存在问题的尝试$(document).ready(function () {    let testButtonEntries = [ /* ... 大量按钮数据 ... */ ];    // 这种方式在append内部的return会导致问题    for (let sections = 0; sections <= testButtonEntries.length % 15; sections++) {        $('

解决方案:数据分块与声明式HTML生成

为了高效且正确地解决这个问题,我们可以采用以下两步策略:

数据分块(Chunking Data):将原始数据数组按照预设的大小(例如每15个元素)分割成多个子数组。声明式HTML生成(Declarative HTML Generation):利用JavaScript的数组map()方法,将每个子数组转换为对应的HTML字符串片段,最终拼接成完整的HTML结构。

1. 数据分块

首先,我们需要将原始的按钮数据数组testButtonEntries按照每15个元素进行分块。这可以通过while循环结合splice()方法实现。splice()方法会修改原数组,并返回被移除的元素组成的新数组。

立即学习“Java免费学习笔记(深入)”;

萌动AI 萌动AI

CreateAI旗下AI动漫视频生成平台

萌动AI 438 查看详情 萌动AI

$(document).ready(function () {    const testButtonEntries = [        // 示例数据,实际应用中会更多        { button_title: 'Employee Button 1', button_alt_text: 'Alt 1', button_image: 'img1', link: '#link1' },        { button_title: 'Employee Button 2', button_alt_text: 'Alt 2', button_image: 'img2', link: '#link2' },        // ... 省略更多数据,假设总共有16个或更多数据        { button_title: 'Employee Button 15', button_alt_text: 'Alt 15', button_image: 'img15', link: '#link15' },        { button_title: 'Employee Button 16', button_alt_text: 'Alt 16', button_image: 'img16', link: '#link16' }    ];    const rows = []; // 用于存储分块后的数组    const chunkSize = 15; // 每块的元素数量    // 当原始数组还有元素时,持续进行分块    while (testButtonEntries.length > 0) {        // 使用splice从testButtonEntries中移除chunkSize个元素,并将其添加到rows        rows.push(testButtonEntries.splice(0, chunkSize));    }    // 此时,rows 数组将包含多个子数组,每个子数组最多包含 chunkSize 个元素    // 例如:rows = [[item1..item15], [item16]]    // ... 后续的HTML生成代码将在这里});

2. 声明式HTML生成

一旦数据被分块,我们就可以使用map()方法来遍历这些分块,并为每个分块生成相应的HTML结构。这种方法使得代码更具声明性,易于理解和维护。

$(document).ready(function () {    const testButtonEntries = [        // ... 同上,示例数据 ...    ];    const rows = [];    const chunkSize = 15;    while (testButtonEntries.length > 0) {        rows.push(testButtonEntries.splice(0, chunkSize));    }    // 使用map将每个分块(row)转换为一个carousel-item的HTML字符串    const generatedHtmlChunks = rows.map((row) => {        // 对于每个row(即一个carousel-item内部的数据),再次使用map生成其内部的按钮HTML        const innerElementsHtml = row.map((ele) => {            const { button_title, link, button_image, button_alt_text } = ele;            // 使用模板字符串构建每个按钮的HTML            return `                            `;        }).join(''); // 将所有按钮的HTML字符串拼接起来        // 返回一个完整的carousel-item的HTML字符串        return `                    `;    });    // 将所有生成的HTML字符串拼接成一个大字符串,并一次性插入到DOM中    $("#employee-button-container").html(generatedHtmlChunks.join(''));});

完整示例代码

将上述两部分结合,形成完整的解决方案:

            动态生成分组HTML元素                /* 简单的CSS,用于模拟布局 */        .d-flex { display: flex; }        .flex-wrap { flex-wrap: wrap; }        .carousel-item { border: 1px solid #ccc; margin-bottom: 10px; padding: 10px; }        .carousel-item div { margin: 5px; border: 1px dashed #eee; padding: 5px; }        .img-responsive { max-width: 100px; height: auto; display: block; margin: 0 auto; }        #employee-button-container { border: 2px solid #007bff; padding: 15px; }        

动态按钮组生成示例

$(document).ready(function () { // 示例数据:包含16个按钮条目,模拟真实场景 let testButtonEntries = [ { button_title: '员工按钮标题 1', button_alt_text: '员工Alt文本 1', button_image: 'button_img_01', link: 'https://example.com/link1' }, { button_title: '员工按钮标题 2', button_alt_text: '员工Alt文本 2', button_image: 'button_img_02', link: 'https://example.com/link2' }, { button_title: '员工按钮标题 3', button_alt_text: '员工Alt文本 3', button_image: 'button_img_03', link: 'https://example.com/link3' }, { button_title: '员工按钮标题 4', button_alt_text: '员工Alt文本 4', button_image: 'button_img_04', link: 'https://example.com/link4' }, { button_title: '员工按钮标题 5', button_alt_text: '员工Alt文本 5', button_image: 'button_img_05', link: 'https://example.com/link5' }, { button_title: '员工按钮标题 6', button_alt_text: '员工Alt文本 6', button_image: 'button_img_06', link: 'https://example.com/link6' }, { button_title: '员工按钮标题 7', button_alt_text: '员工Alt文本 7', button_image: 'button_img_07', link: 'https://example.com/link7' }, { button_title: '员工按钮标题 8', button_alt_text: '员工Alt文本 8', button_image: 'button_img_08', link: 'https://example.com/link8' }, { button_title: '员工按钮标题 9', button_alt_text: '员工Alt文本 9', button_image: 'button_img_09', link: 'https://example.com/link9' }, { button_title: '员工按钮标题 10', button_alt_text: '员工Alt文本 10', button_image: 'button_img_10', link: 'https://example.com/link10' }, { button_title: '员工按钮标题 11', button_alt_text: '员工Alt文本 11', button_image: 'button_img_11', link: 'https://example.com/link11' }, { button_title: '员工按钮标题 12', button_alt_text: '员工Alt文本 12', button_image: 'button_img_12', link: 'https://example.com/link12' }, { button_title: '员工按钮标题 13', button_alt_text: '员工Alt文本 13', button_image: 'button_img_13', link: 'https://example.com/link13' }, { button_title: '员工按钮标题 14', button_alt_text: '员工Alt文本 14', button_image: 'button_img_14', link: 'https://example.com/link14' }, { button_title: '员工按钮标题 15', button_alt_text: '员工Alt文本 15', button_image: 'button_img_15', link: 'https://example.com/link15' }, { button_title: '员工按钮标题 16 (最后一个)', button_alt_text: '员工Alt文本 16', button_image: 'button_img_16', link: 'https://example.com/link16' } ]; const rows = []; // 用于存储分块后的数组 const chunkSize = 15; // 每块的元素数量 // 1. 数据分块:将原始数组按 chunkSize 分割 while (testButtonEntries.length > 0) { rows.push(testButtonEntries.splice(0, chunkSize)); } // 2. 声明式HTML生成:将分块后的数据转换为HTML字符串 const dataHtml = rows.map((row) => { // 为当前分块生成内部的按钮HTML const elementsHtml = row.map((ele) => { const { button_title, link, button_image, button_alt_text } = ele; // 注意:这里假设图片路径是 'images/' + button_image + '.png' // 如果实际路径没有 .png 后缀,请根据实际情况调整 return ` `; }).join(''); // 将内部所有按钮的HTML拼接成一个字符串 // 为当前分块生成外部的 carousel-item HTML return ` `; }).join(''); // 将所有 carousel-item 的HTML拼接成一个字符串 // 3. 将生成的HTML一次性插入到DOM中 $("#employee-button-container").html(dataHtml); });

注意事项与总结

效率提升:相较于在循环中多次操作DOM(每次append()都会触发DOM重绘),这种方法先将所有HTML构建成一个字符串,然后通过html()或append()一次性插入DOM,可以显著减少DOM操作次数,提高页面渲染性能。代码可读性与维护性:使用map()和模板字符串(Template Literals)使得HTML结构与数据逻辑分离,代码更清晰,易于理解和修改。splice()对原数组的影响:Array.prototype.splice()方法会修改原始数组。如果需要保留原始数据,应先创建数组的副本(例如使用slice()方法:const tempArray = […testButtonEntries]; 或 const tempArray = testButtonEntries.slice();),再对副本进行splice操作。在本例中,修改原数组是可接受的。图片路径:示例中假设图片路径为images/${button_image}.png,请根据实际项目中的图片存放路径和命名规则进行调整。错误处理:在实际应用中,应考虑数据为空或数据格式不正确的情况,添加相应的错误处理逻辑。

通过这种数据分块和声明式HTML生成的方法,我们可以优雅且高效地解决动态生成复杂分组HTML元素的挑战,确保代码的健壮性和性能。

以上就是使用JavaScript和jQuery高效动态生成分组HTML元素的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/257468.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月4日 07:55:28
下一篇 2025年11月4日 07:56:27

相关推荐

  • js如何打印

    可通过以下方法实现 JavaScript 打印:直接打印:使用 window.print() 函数打印当前页面。打印特定元素:使用 element.print() 函数打印特定元素。自定义打印样式:使用 @media print 样式来隐藏或调整元素样式。打印预览:使用 window.open() …

    2025年12月19日
    000
  • js如何获取标签

    JavaScript 提供了几种获取标签的方法:getElementById():通过 ID 属性获取单个标签。getElementsByTagName():返回具有指定标签名的所有标签的 HTMLCollection。querySelector():返回与 CSS 选择器匹配的第一个元素。quer…

    2025年12月19日
    000
  • js的效果如何

    JavaScript 是一种广泛使用的编程语言,拥有众多功能,可产生各种效果,包括:交互性:表单验证、下拉菜单、提示框、导航菜单动画和过渡:元素移动、淡入淡出、旋转、缩放数据操作:DOM 操作、JSON 处理、AJAX 调用其他效果:图形、多媒体、游戏 JavaScript 的效果 JavaScri…

    2025年12月19日
    000
  • js如何修改

    在 JavaScript 中可以通过以下步骤修改文本输入框的值:1. 获取文本输入框元素(使用 document.getElementById() 或 document.querySelector() 方法);2. 设置值(使用 value 属性)。 在 JavaScript 中修改文本输入框的值 …

    2025年12月19日
    000
  • js如何断点

    如何使用 JavaScript 断点?通过在 Chrome DevTools 中设置断点可暂停 JavaScript 执行,从而检查变量和堆栈调用。开发者可按以下步骤进行操作:设置断点:将鼠标悬停在代码行上并单击空心圆圈。暂停执行:当执行流达到断点时,代码将暂停。检查变量:在 “Vari…

    2025年12月19日
    000
  • typescript的使用情况_typescript使用说明书

    TypeScript 广泛用于构建大型、复杂的 JavaScript 项目,因为它提供额外的类型安全性和开发人员工具。其主要用途包括:1. 前端开发(Web 应用程序);2. 后端开发(Node.js 应用程序);3. 移动开发(跨平台移动应用程序);4. 桌面开发(Electron 应用程序)。 …

    2025年12月19日
    000
  • typescript的声明语法

    TypeScript 的声明语法包括声明类型(接口、类型、枚举)和变量类型声明。声明类型用于定义数据约束,包括接口(描述对象形状)、类型(定义自定义类型)和枚举(定义常量值)。变量类型声明指定变量存储数据的类型,函数类型声明指定函数的参数类型和返回值类型。通过类型检查,声明语法提高代码可靠性,增强可…

    2025年12月19日
    000
  • 如何学好js

    掌握 JavaScript 的方法包括:理解基本语法,包括变量、数据类型、运算符和控制流。熟悉 HTML 和 CSS,并练习编写简单脚本。掌握核心概念,如函数、对象、数组和事件处理。通过编写交互式 web 界面来实践和应用 JavaScript 代码。使用 JavaScript 库和框架来简化任务。…

    2025年12月19日
    000
  • 清洗你的代码 一本关于前端开发人员的干净代码的书

    经过五年的写作,我终于完成了我的书!花了很多精力(和咖啡!)来完成,但终于完成了,我对结果非常满意。当我开始写这本书时,我认为这会是一件小事——也许 100 页左右。我没想到它最终会超过400页。我也没想到写一本编程书会花费如此巨大的精力。它不仅仅涉及编写,还涉及大量用于文本和代码检查、自定义单元测…

    2025年12月19日
    000
  • typescript的基础类型分析

    TypeScript 强制指定类型,基础类型包括 any、string、number、boolean 和 void。编译器可推断类型,也可通过显式注解指定。类型转换可用于转换值类型。结构类型系统允许根据结构比较类型兼容性,从而提高代码灵活性和可读性。这些基础类型对于编写健壮、可维护的 TypeScr…

    2025年12月19日
    000
  • 康威定律和 Web 开发中的关注点分离

    康威定律指出,软件系统往往会反映构建它们的组织的通信结构,它在现代 Web 开发的结构方式中发挥着至关重要的作用。从早期实践到当今更复杂的系统(例如微前端和基于组件的架构)的演变在很大程度上是由这一原则决定的。通过研究历史上 Web 开发中关注点是如何分离的,我们可以更好地理解当前实践是如何出现的以…

    2025年12月19日
    000
  • typescript 方法重载

    TypeScript 中的方法重载允许在同一类中创建具有相同名称但不同参数的方法,通过签名实现,根据参数类型选择实现。签名:定义方法参数类型和返回值类型。调用:根据提供的参数类型选择最合适实现。优点:代码可读性灵活性和代码重用 TypeScript 中的方法重载 方法重载是允许在同一类中创建具有相同…

    2025年12月19日
    000
  • typescript是静态语言

    TypeScript 是一种静态语言,在编译时检查类型错误,防止运行时错误。它的优势包括:提高代码可靠性:编译时捕获类型错误,防止运行时错误。更好的代码可读性:类型标注明确指定类型,提高代码可读性。防止意外类型转换:强制执行类型安全性,防止意外类型转换导致错误。 TypeScript 是一种静态语言…

    2025年12月19日
    000
  • 如何在任何 Nextjs 应用程序中处理 Cookie 同意

    在当今的 web 开发环境中,处理 cookie 同意对于满足 通用数据保护条例 (gdpr) 和 加州消费者隐私法案 (ccpa) 等隐私法规至关重要。 cookie 通常用于跟踪用户活动、个性化内容或收集分析,但在许多司法管辖区收集这些数据需要用户同意。作为开发者,我们有责任确保合规性并创造透明…

    2025年12月19日
    000
  • 使用 React 构建时您应该了解的库

    在本文中,我将讨论您可以在 React 项目中使用的库。 如果你喜欢我的文章,可以请我一杯咖啡:)给我买咖啡 1. 样式组件 它是一个使 CSS 在 React 应用程序中基于组件编写的库。由于它具有基于组件的结构,因此它允许您以模块化方式单独设置每个组件的样式。它还提供动态样式和主题之间的切换等功…

    2025年12月19日
    000
  • 拥抱 Tailwind CSS:Web 开发人员的样式新时代

    让我们开始摆脱那个永远长的 css 文件,并开始使用 tailwind css 增强您的造型体验!它使得直接在 html 或 react 组件中设置代码样式变得容易并且易于组织。 什么是 tailwind css?tailwind css 是一个实用程序优先的 css 框架,旨在使开发人员能够快速构…

    2025年12月19日
    000
  • 用于高效代码管理的 React 工具集

    简介 本文档概述了使用一组精选的工具和最佳实践来构建和管理 react 应用程序的综合方法。通过遵守这些准则,您可以创建可扩展、可维护且高效的应用程序。 状态管理 祖斯坦: 目的:提供一种简单且高性能的方法来管理全局应用程序状态。好处:清晰简洁的api。高效的更新和性能优化。与应用程序的其他部分轻松…

    好文分享 2025年12月19日
    000
  • 我做了一个组件库!

    经过多年的思考,我的人生该做什么,我终于得出了一个值得注意的结论,我想构建一个 React 组件库,但是如何构建?今天的旅程从了解组件库对开发人员来说具有无价价值的原因开始:它不仅涉及功能,还涉及设计的一致性、可重用性和优雅性。 第0步:是什么让我与众不同? 有很多组件库——Shadcn/UI、Ma…

    2025年12月19日
    000
  • 如何自定义PDFjs

    pdf.js 是一个很棒的开源项目,它经常更新并且不断添加新功能,但是从外观上看它很丑陋,或者可以说它看起来已经过时了。从 pdf.js 获取最新的 pdf 功能和修复,同时在演示文稿方面拥有流畅的外观怎么样? pdfjskit 的 pdf 查看器并不引人注目,它不会直接更改 pdf.js 的代码,…

    2025年12月19日
    000
  • 用于现代 Web 开发的实用 React 库

    在本文中,我将讨论您可以在 React 项目中使用的库。 如果你喜欢我的文章,可以请我一杯咖啡:)给我买咖啡 1. 样式组件 它是一个使 CSS 在 React 应用程序中基于组件编写的库。由于它具有基于组件的结构,因此它允许您以模块化方式单独设置每个组件的样式。它还提供动态样式和主题之间的切换等功…

    2025年12月19日
    000

发表回复

登录后才能评论
关注微信