如何在DOM中将JavaScript数组数据渲染为列表元素

如何在DOM中将JavaScript数组数据渲染为列表元素

本教程详细介绍了如何将javascript数组中存储的数据动态地渲染到html的无序列表(`

`)中。通过迭代数组元素并构建html字符串,然后使用`innerhtml`将其插入到dom,您可以实现数据与视图的有效分离与展示。文章还强调了使用`innerhtml`时潜在的安全风险(xss)以及相应的防范措施。

在Web开发中,经常需要将JavaScript中存储的数据(例如数组)动态地展示在用户界面上。一个常见的场景是将一个字符串数组渲染成HTML的无序列表(

)中的列表项()。本教程将指导您如何实现这一功能,并提供一个完整的示例。

核心概念

实现这一目标的关键在于:

获取数据: 从JavaScript数组中获取需要展示的每个元素。构建HTML字符串: 遍历数组,为每个元素生成对应的HTML 标签。更新DOM: 将生成的完整HTML字符串插入到目标 元素的 innerHTML 属性中。

示例代码与实现步骤

我们将通过一个简单的网页应用来演示如何保存用户输入的链接并将其显示为列表。

1. HTML 结构

首先,我们需要一个基本的HTML结构,包括一个输入框、保存按钮以及一个用于显示链接的无序列表。

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

            链接列表管理                

我的链接

在这个HTML中:

input-el:用户输入链接的文本框。input-btn:触发保存操作的按钮。del-btn:触发删除所有链接操作的按钮(本教程主要关注显示功能,删除功能可自行扩展)。display_link-el:我们将把JavaScript数组中的链接渲染到这个 元素中。

2. JavaScript 逻辑

接下来,我们将编写JavaScript代码来处理数据存储、渲染和事件监听。

// index.jslet linksArray = []; // 用于存储链接的数组const inputEl = document.getElementById("input-el"); // 获取输入框元素const displayEl = document.getElementById("display_link-el"); // 获取显示链接的UL元素const inputBtn = document.getElementById("input-btn"); // 获取保存按钮const delBtn = document.getElementById("del-btn"); // 获取删除按钮// 尝试从localStorage加载已保存的链接const linksFromLocalStorage = JSON.parse(localStorage.getItem("mylinks"));if (linksFromLocalStorage) {    linksArray = linksFromLocalStorage;    renderLinksAsList(linksArray); // 页面加载时渲染已保存的链接}// 绑定保存按钮的点击事件inputBtn.addEventListener("click", function() {    saveLink();});// 绑定删除按钮的双击事件delBtn.addEventListener("dblclick", function() {    clearLinks();});/** * 将当前输入框中的链接保存到数组并更新DOM和localStorage */function saveLink() {    const linkValue = inputEl.value.trim(); // 获取输入值并去除首尾空格    if (linkValue) { // 确保输入不为空        linksArray.push(linkValue);        inputEl.value = ""; // 清空输入框        // 更新localStorage        localStorage.setItem("mylinks", JSON.stringify(linksArray));        // 重新渲染列表        renderLinksAsList(linksArray);    }}/** * 将JavaScript数组中的链接渲染为HTML列表项 * @param {string[]} array - 包含链接字符串的数组 */function renderLinksAsList(array) {    let listItems = ""; // 用于构建HTML字符串    for (let i = 0; i < array.length; i++) {        // 构建每个
  • 元素,可以根据需要添加链接属性等 listItems += `
  • ${array[i]}
  • `; } // 将构建好的HTML字符串插入到DOM中 displayEl.innerHTML = listItems;}/** * 清空所有链接并更新DOM和localStorage */function clearLinks() { linksArray = []; // 清空数组 localStorage.clear(); // 清空localStorage renderLinksAsList(linksArray); // 渲染空列表}

    代码解析:

    初始化与DOM元素获取:linksArray:一个空数组,用于存储所有输入的链接。inputEl, displayEl, inputBtn, delBtn:通过document.getElementById获取对应的DOM元素,方便后续操作。localStorage 加载:在脚本加载时,尝试从localStorage中读取名为”mylinks”的数据。如果存在,将其解析为JavaScript数组并赋值给linksArray,然后立即调用renderLinksAsList函数将已保存的链接显示出来。事件监听:inputBtn.addEventListener(“click”, saveLink):为保存按钮添加点击事件监听器,点击时调用saveLink函数。delBtn.addEventListener(“dblclick”, clearLinks):为删除按钮添加双击事件监听器,双击时调用clearLinks函数。saveLink 函数:获取inputEl.value,并使用trim()去除可能的空白字符。如果输入值不为空,将其push到linksArray中。清空输入框inputEl.value = “”。使用localStorage.setItem(“mylinks”, JSON.stringify(linksArray))将更新后的数组保存到本地存储。JSON.stringify用于将JavaScript数组转换为字符串以便存储。调用renderLinksAsList(linksArray)来更新页面上显示的列表。renderLinksAsList 函数(核心):声明一个空字符串listItems,用于逐步构建所有元素的HTML。使用for循环遍历linksArray中的每一个链接。在循环内部,通过字符串模板(或字符串拼接)为每个链接生成一个元素。这里我们还添加了标签,使其成为可点击的链接,并设置target=”_blank”在新标签页打开。循环结束后,将完整的listItems字符串赋值给displayEl.innerHTML。这会用新的HTML内容替换元素内部的所有子元素,从而更新页面显示。clearLinks 函数:将linksArray重置为空数组。调用localStorage.clear()清空所有本地存储数据(或者只清除”mylinks”)。调用renderLinksAsList(linksArray)渲染一个空列表。

    注意事项与安全提示

    XSS 漏洞风险:

    当使用innerHTML将用户提供的数据直接插入DOM时,存在跨站脚本攻击(XSS)的风险。如果用户输入恶意脚本(例如 alert(‘XSS!’);),它将会被浏览器执行。防范措施: 在将用户输入的数据插入DOM之前,务必进行输入过滤和内容净化。这通常涉及将特殊HTML字符(如 , &, “, ‘)转义为HTML实体(例如

    性能考虑:

    对于小型列表,每次更新都重新构建整个HTML字符串并赋值给innerHTML是高效且简洁的。对于非常大的列表(成千上万个元素)或频繁的更新,反复操作innerHTML可能会导致性能问题。在这种情况下,可以考虑以下替代方案:document.createElement: 动态创建DOM元素,然后使用appendChild或insertBefore将其添加到DOM中。这种方法通常更安全,因为浏览器会正确处理文本内容,避免XSS,并且可以更精细地控制DOM操作。文档片段(DocumentFragment): 批量创建DOM元素,将它们添加到DocumentFragment中,然后一次性将DocumentFragment添加到DOM树中,减少DOM重绘和回流的次数。虚拟DOM库: 对于更复杂的应用,React、Vue等框架通过虚拟DOM机制来优化DOM操作。

    用户体验:

    在实际应用中,可以考虑添加加载状态、错误处理和用户友好的提示信息。

    总结

    通过本教程,您应该已经掌握了如何使用JavaScript将数组中的数据动态地渲染为HTML无序列表。核心步骤包括遍历数组、构建HTML字符串,并通过innerHTML将其插入到DOM。同时,请务必牢记innerHTML带来的XSS安全风险,并在实际项目中采取适当的防范措施。对于更高级的需求,可以探索使用document.createElement或其他前端框架来获得更好的性能和安全性。

    以上就是如何在DOM中将JavaScript数组数据渲染为列表元素的详细内容,更多请关注创想鸟其它相关文章!

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

    (0)
    打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
    上一篇 2025年12月23日 08:12:56
    下一篇 2025年12月23日 08:13:02

    相关推荐

    • 如何使用 vue-color 创建交互式颜色渐变页面?

      如何创建交互式颜色渐变页面? 实现交互式颜色渐变页面可以通过利用第三方库来简化开发流程。 推荐解决方案: vue-color 立即学习“前端免费学习笔记(深入)”; vue-color是一个vue.js库,提供了一个功能强大的调色板组件。它允许你轻松创建和管理颜色渐变。 特性: 颜色选择器:选择单一…

      2025年12月24日
      200
    • 如何利用 vue-color 库打造交互式色彩渐变页面?

      打造交互性前端:色彩渐变页面的制作方法 在前端开发中,色彩渐变页面和交互式元素深受设计师和开发人员的欢迎。本文将探讨如何利用 vue-color 库轻松实现这样的页面。 使用 vue-color 库构建调色板 vue-color 是一个 vue.js 库,可用于创建可定制的调色板。其基本功能包括: …

      2025年12月24日
      300
    • 如何使用前端技术创建交互式颜色渐变页面?

      如何创建交互式颜色渐变页面? 当您希望在前端界面实现颜色渐变效果并实现交互功能时,可以使用以下方法: 解决方案: 1. 使用 vue-color 库 vue-color 库是一个功能强大的 vue.js 库,可用于创建色板和处理颜色操作。它可以帮助您轻松实现颜色渐变效果,如下所示: 立即学习“前端免…

      好文分享 2025年12月24日
      000
    • Vue 中如何动态添加带有动态样式的伪元素?

      vue 动态添加具有动态样式的伪元素 在某些情况下,需要根据动态条件向 dom 元素添加带有动态样式的伪元素。例如,元素的伪元素“before”可能只有在满足特定条件时才会出现,并且其样式(如长度、高度和其他属性)也是不确定的。 解决方案:css 变量 由于伪元素的样式不能直接在 css 中定义,可…

      2025年12月24日
      000
    • Vue 中如何动态添加伪元素?

      vue中如何动态添加伪元素 在某些情况下,需要动态地为元素添加伪元素,但传统方法受限于伪元素不能写死在 css 中。本文将介绍一种使用 css 变量解决此问题的方法。 使用 css 变量 css 变量允许在样式表中定义可重复使用的变量,然后可以在其他样式中使用这些变量。利用这个特性,我们可以动态地控…

      2025年12月24日
      100
    • 如何使用 CSS 变量动态控制 Vue 应用中 DOM 伪元素的样式?

      灵活操纵 vue 中 dom 伪元素 在 vue 应用中,有时需要在特定条件下动态添加和修改伪元素样式。虽然 css 中的伪元素通常是静态定义的,但有些情况下,需要根据用户的行为或数据动态调整其样式。 动态控制伪元素样式 可以使用 css 变量来解决此问题。css 变量允许您在样式表中存储可变值,然…

      2025年12月24日
      100
    • Vue中如何利用CSS变量动态操纵伪元素样式?

      利用css变量动态操纵伪元素 在vue中,有时需要动态地给dom元素添加伪元素,并且伪元素的样式也是动态变化的。不能在css文件中直接定义伪元素样式,因为伪元素包含动态参数。 这个问题的解决方法之一是使用css变量。css变量允许我们在css中定义变量并动态地将其分配给元素的样式。 代码示例: 立即…

      2025年12月24日
      300
    • HTMLrev 上的免费 HTML 网站模板

      HTMLrev 是唯一的人工策划的库专门专注于免费 HTML 模板,适用于由来自世界各地慷慨的模板创建者制作的网站、登陆页面、投资组合、博客、电子商务和管理仪表板世界。 这个人就是我自己 Devluc,我已经工作了 1 年多来构建、改进和更新这个很棒的免费资源。我自己就是一名模板制作者,所以我知道如…

      2025年12月24日
      300
    • Vue/UniApp 中如何实现选中效果的切换?

      vue/uniapp中复现选中的效果 在vue/uniapp中实现此效果,可以使用view元素和样式类来控制外观。让我们来看看这个问题的示例代码。 日 周 月 年 .tabs { display: flex; justify-content: space-between; flex-directio…

      2025年12月24日
      000
    • 如何简化五子棋代码中的重复部分?

      五子棋代码简化 问题: 如何简化五子棋代码中重复的部分? 问题内容: 提供了vue编写的五子棋代码,但其中有多个重复的部分。希望得到一个更简化的代码版本。 问题答案: 拆分重复方法 将大方法中的重复部分拆分成更小的函数,例如: placepiece():放置棋子checkandplace():检查某…

      2025年12月24日
      000
    • Vue/Uniapp 中如何实现类似图片所示的日周月年切换标签效果?

      vue/uniapp中,如何实现类似图片中效果的日周月年切换标签? 图片中呈现了四个标签,选中”日”后,背景变成蓝色,字体变成白色。而其他未选中的标签,背景为灰色,字体也呈灰色。 一位网友通过纯html实现了一个简易的版本,代码如下: 日 周 月 年 具体效果,可以点开上面的…

      2025年12月24日
      000
    • Vue/UniApp中如何制作圆角选项卡,且选中状态颜色与未选中状态颜色不同?

      vue/uniapp中,如何制作圆角栏目的选项卡效果? 你想要创建一个圆角栏目的选项卡效果,其中一个选中的选项是用白色文本填充蓝色背景,而其他选项是黑色文本填充灰色背景。 以下是使用html和css实现此效果的方法: 日 周 月 年 .tabs { display: flex; justify-co…

      2025年12月24日
      000
    • Vue2表格隐藏列后,固定列出现空白行怎么办?

      vue2表格隐藏列导致固定列空白行 当使用vue2表格库(例如element-table)时,隐藏其中一列可能会导致固定列(通常包含操作按钮)最上方出现空白行。 解决方案 要解决此问题,需要在切换列显示状态后手动调用dolayout()方法。该方法会重新计算表格的布局,消除空白行。 立即学习“前端免…

      2025年12月24日
      000
    • 如何优化 Vue 五子棋程序中的重复代码?

      简化代码 问题: 一个使用 vue 编写的五子棋程序中存在大量重复代码,需要进行简化。 代码重复: 立即学习“前端免费学习笔记(深入)”; 部分的 clickbox 函数中重复的条件检查和棋子放置逻辑。 部分的 aripoint 函数中重复的四种条件检查和棋子放置逻辑。 部分的 determinee…

      2025年12月24日
      100
    • Vue/UniApp 选项卡选中时如何添加边框和背景色?

      vue/uniapp中选中时有边框和背景色的选项卡如何实现 原帖中提供的代码不能实现选中时有边框和背景色的效果。下面是用 html 实现这种效果的代码: Document 日 周 月 年 .tabs { display: flex; justify-content: space-between; f…

      2025年12月24日
      000
    • 如何使用 Vue/Uniapp 实现美观实用的“选框”样式页面元素?

      vue/uniapp页面设计优化 在vue/uniapp中,为实现类似“选框”样式的页面元素,可采用以下优化方案: 创建层叠布局(flex layout): 设置外层容器的显示方式为“flex”,并启用水平排列。 定义“选框”元素: 立即学习“前端免费学习笔记(深入)”; 为每个“选框”创建一个子元…

      2025年12月24日
      000
    • React 开关按钮点击无响应怎么办?

      解决点击“开关”按钮无响应问题 在提供的 react 代码中,“开关”按钮点击事件不响应的原因可能是由于: 事件名拼写错误:请确保 onclick 属性拼写正确,并且事件处理函数名为 handleclick。元素遮盖:检查按钮是否被其他元素遮挡,例如另一个按钮或 div。控制台重写:如果您的代码中对…

      2025年12月24日
      000
    • 让我们只用一根安装线就可以使网络响应起来吗?我正在寻找贡献者!

      最近我发布了一个 npm 包,其使命如标题所示:让项目只需一行代码即可响应! 我与您分享响应式应用程序 [beta] 包 我花了几年时间尝试和开发这项技术,目前包括: 动态设置 html 标签字体大小(通过 js 脚本),考虑:(1) 屏幕分辨率和 (2) 浏览器字体大小(用于网络可访问性)将像素定…

      2025年12月24日
      000
    • 如何自定义 details 和 summary 元素的点击范围,仅对图标起作用?

      定制 details 和 summary 元素的点击范围 本文旨在解决如何自定义 details 和 summary 元素的点击范围,使其只对特定区域起作用。 问题描述 一位用户想要创建一个类似树形结构的表格,其中 details 和 summary 元素用于展开和关闭内容。但是,当前点击该行的任何…

      2025年12月24日
      000
    • 如何仅通过点击行最前面的图标展开或隐藏 和 标签中的内容?

      点击范围自定义:细节和概要 在 html 中,ails> 和 标签可以创建可折叠的内容。通常,单击行中的任何位置都可以展开或关闭内容。但是,为了实现更精细的控制,可以通过自定义点击范围来指定仅特定区域可以触发操作。 问题详情 一位开发者希望构建一个类似树形表的内容,但希望只能通过点击行最前面的…

      2025年12月24日
      000

    发表回复

    登录后才能评论
    关注微信