0

0

如何在JavaScript中将数组数据动态显示为DOM列表元素

碧海醫心

碧海醫心

发布时间:2025-11-01 11:36:23

|

824人浏览过

|

来源于php中文网

原创

如何在JavaScript中将数组数据动态显示为DOM列表元素

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

    `)中,形成一系列列表项(`
  • `)。文章涵盖了从html结构到javascript逻辑的完整实现步骤,包括数据保存、列表构建和dom更新,并特别强调了使用`innerhtml`时潜在的安全风险及其防范措施。

    在Web开发中,经常需要将动态数据(例如从用户输入或API获取的数据)显示在网页上。将JavaScript数组中的数据以列表形式呈现在DOM中是一个常见需求。本教程将指导您如何高效且安全地实现这一功能。

    1. 核心概念:动态生成HTML字符串

    要将数组内容显示为列表,我们需要遍历数组,为每个元素创建一个HTML <li> 标签,然后将这些标签组合成一个完整的HTML字符串,最后将其插入到DOM中的 <ul> 元素内。

    2. HTML结构准备

    首先,我们需要一个HTML结构来承载我们的输入、操作按钮以及最终的列表显示区域。

    <input id="input-el" title="lead" placeholder="input weblink" type="text">
    <button id="input-btn" onclick="save()">SAVE</button>
    <button id="del-btn" ondblclick="delLeads()">DELETE</button>
    <div>
      <div>
        <ul id="display_link-el"></ul>
      </div>
      <!-- 另一个列表区域,如果需要可以保留或移除 -->
      <div>
        <ul id="log_link-el"></ul>
      </div>
    </div>

    在这个结构中:

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

    • <input id="input-el"> 用于用户输入数据。
    • <button id="input-btn" onclick="save()"> 用于触发数据保存和显示。
    • <ul id="display_link-el"> 是我们将动态生成 <li> 元素并插入的目标位置。

    3. JavaScript逻辑实现

    接下来,我们将编写JavaScript代码来处理数据存储、列表生成和DOM更新。

    3.1 初始化与DOM元素引用

    首先,定义一个数组来存储数据,并获取DOM元素的引用。

    let linksArray = []; // 存储链接数据的数组
    let inputEl = document.getElementById("input-el"); // 获取输入框元素
    let displayEl = document.getElementById("display_link-el"); // 获取显示列表的ul元素
    
    // 尝试从localStorage加载数据(如果存在)
    // 这部分代码在原始问题中没有给出,但通常会考虑持久化数据
    const mylinks = JSON.parse(localStorage.getItem("mylinks"));
    if (mylinks) {
      linksArray = mylinks;
      // 页面加载时立即显示已保存的链接
      displayEl.innerHTML = convertToListLi(linksArray);
    }

    3.2 保存数据到数组并更新DOM

    save 函数负责将用户输入添加到 linksArray,更新 localStorage,然后调用列表转换函数并更新DOM。

    Img.Upscaler
    Img.Upscaler

    免费的AI图片放大工具

    下载
    function save() {
      // 检查输入是否为空,避免添加空链接
      if (inputEl.value.trim() !== "") {
        linksArray.push(inputEl.value);
        console.log(linksArray); // 方便调试
    
        // 将数组保存到localStorage,JSON.stringify用于将JS数组转换为字符串
        localStorage.setItem("mylinks", JSON.stringify(linksArray));
    
        inputEl.value = ""; // 清空输入框
    
        // 调用函数将数组转换为HTML列表字符串,并更新displayEl的innerHTML
        displayEl.innerHTML = convertToListLi(linksArray);
      } else {
        alert("请输入有效的链接!");
      }
    }

    3.3 核心功能:将数组转换为HTML列表字符串

    convertToListLi 函数是实现动态列表显示的关键。它遍历 linksArray,为每个元素生成一个 <li> 标签,并将它们拼接成一个完整的HTML字符串。

    function convertToListLi(arr) {
      let listItems = ""; // 初始化一个空字符串来存储所有<li>标签
      for (let i = 0; i < arr.length; i++) {
        // 拼接每个<li>标签。注意:这里可以添加链接的<a>标签等
        listItems += "<li>" + arr[i] + "</li>";
      }
      return listItems; // 返回包含所有<li>标签的完整HTML字符串
    }

    3.4 删除功能(可选但常见)

    虽然原始问题中未详细实现删除逻辑,但一个完整的教程通常会包含它。这里提供一个简单的删除所有链接的示例。

    function delLeads() {
      // 双击删除所有链接
      localStorage.clear(); // 清空localStorage
      linksArray = []; // 清空数组
      displayEl.innerHTML = ""; // 清空DOM显示
      console.log("所有链接已删除。");
    }

    4. 完整代码示例

    将上述HTML和JavaScript代码整合,您可以得到一个功能完整的页面。

    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>动态显示JavaScript数组数据为DOM列表</title>
        <style>
            body { font-family: sans-serif; margin: 20px; }
            input { padding: 8px; margin-right: 5px; }
            button { padding: 8px 15px; cursor: pointer; margin-right: 5px; }
            ul { list-style-type: decimal; padding-left: 20px; }
            li { margin-bottom: 5px; }
        </style>
    </head>
    <body>
    
        <h1>我的链接列表</h1>
    
        <input id="input-el" title="lead" placeholder="输入网址" type="text">
        <button id="input-btn" onclick="save()">保存</button>
        <button id="del-btn" ondblclick="delLeads()">删除所有</button>
    
        <div>
            <h2>已保存的链接:</h2>
            <ul id="display_link-el">
                <!-- 链接将在这里动态显示 -->
            </ul>
        </div>
    
        <script>
            let linksArray = [];
            const inputEl = document.getElementById("input-el");
            const displayEl = document.getElementById("display_link-el");
    
            // 从localStorage加载数据
            const mylinks = JSON.parse(localStorage.getItem("mylinks"));
            if (mylinks) {
                linksArray = mylinks;
                displayEl.innerHTML = convertToListLi(linksArray);
            }
    
            function convertToListLi(arr) {
                let listItems = "";
                for (let i = 0; i < arr.length; i++) {
                    // 注意:为了安全,如果arr[i]是用户输入,应该进行转义或使用更安全的DOM操作
                    listItems += `<li><a href="${arr[i]}" target="_blank">${arr[i]}</a></li>`;
                }
                return listItems;
            }
    
            function save() {
                if (inputEl.value.trim() !== "") {
                    linksArray.push(inputEl.value);
                    localStorage.setItem("mylinks", JSON.stringify(linksArray));
                    inputEl.value = "";
                    displayEl.innerHTML = convertToListLi(linksArray);
                } else {
                    alert("请输入有效的链接!");
                }
            }
    
            function delLeads() {
                // 双击删除所有链接
                localStorage.clear();
                linksArray = [];
                displayEl.innerHTML = "";
                console.log("所有链接已删除。");
            }
        </script>
    
    </body>
    </html>

    5. 注意事项与安全考量

    XSS (跨站脚本攻击) 风险: 当使用 element.innerHTML = someHTMLString 来插入用户生成的内容时,存在潜在的跨站脚本攻击(XSS)风险。如果 linksArray[i] 包含恶意脚本(例如 <script>alert('XSS')</script>),它将被浏览器执行。

    防范措施:

    1. 输入过滤/转义: 在将用户输入添加到数组或插入DOM之前,始终对输入进行严格的过滤和HTML实体转义。例如,将 < 转换为 。
    2. 使用 textContent 或 document.createElement: 对于纯文本内容,使用 element.textContent 更安全,因为它会自动转义特殊字符。对于更复杂的结构,推荐使用 document.createElement()、appendChild() 等DOM API来构建元素,而不是直接拼接HTML字符串。

    示例:使用 document.createElement 的更安全方法

    function convertToListLiSafe(arr) {
      // 清空现有内容
      displayEl.innerHTML = ""; 
    
      for (let i = 0; i < arr.length; i++) {
        const listItem = document.createElement("li"); // 创建<li>元素
        const link = document.createElement("a");      // 创建<a>元素
        link.href = arr[i];                            // 设置链接地址
        link.textContent = arr[i];                     // 设置链接文本,textContent会自动转义
        link.target = "_blank";                        // 在新标签页打开
    
        listItem.appendChild(link);                    // 将<a>添加到<li>
        displayEl.appendChild(listItem);               // 将<li>添加到<ul>
      }
    }
    
    // 在save函数中调用:
    // displayEl.innerHTML = ""; // 先清空,因为append会不断添加
    // convertToListLiSafe(linksArray);

    这种方法虽然代码量稍多,但由于它直接操作DOM对象而非解析HTML字符串,因此大大降低了XSS风险。

    总结

    本教程详细展示了如何利用JavaScript将数组数据动态地渲染为DOM中的列表元素。我们学习了如何构建HTML字符串并使用 innerHTML 更新DOM,同时强调了在使用 innerHTML 插入用户内容时必须注意XSS安全风险,并介绍了更安全的 document.createElement 方法作为替代方案。掌握这些技术是进行动态Web开发的基础。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

761

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

221

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1570

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

651

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

1249

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

1206

2024.04.29

go语言字符串相关教程
go语言字符串相关教程

本专题整合了go语言字符串相关教程,阅读专题下面的文章了解更多详细内容。

194

2025.07.29

c++字符串相关教程
c++字符串相关教程

本专题整合了c++字符串相关教程,阅读专题下面的文章了解更多详细内容。

131

2025.08.07

C++多线程并发控制与线程安全设计实践
C++多线程并发控制与线程安全设计实践

本专题围绕 C++ 在高性能系统开发中的并发控制技术展开,系统讲解多线程编程模型与线程安全设计方法。内容包括互斥锁、读写锁、条件变量、原子操作以及线程池实现机制,同时结合实际案例分析并发竞争、死锁避免与性能优化策略。通过实践讲解,帮助开发者掌握构建稳定高效并发系统的关键技术。

3

2026.03.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 6.1万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 3.5万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号