0

0

基于 JSON 的联系人列表与详情页动态切换教程

花韻仙語

花韻仙語

发布时间:2026-02-19 16:24:01

|

205人浏览过

|

来源于php中文网

原创

基于 JSON 的联系人列表与详情页动态切换教程

本文介绍如何使用原生 javascript 实现从 json 文件加载联系人数据,并在页面中动态切换「姓名列表视图」与「单个联系人详情视图」,无需后端渲染或框架依赖。

本文介绍如何使用原生 javascript 实现从 json 文件加载联系人数据,并在页面中动态切换「姓名列表视图」与「单个联系人详情视图」,无需后端渲染或框架依赖。

在构建轻量级前端数据展示应用时,常需从静态 JSON 文件读取结构化数据并实现交互式视图切换。本教程以“联系人管理”为典型场景,完整演示:① 安全加载并解析 JSON 数据;② 渲染可点击的姓名列表;③ 点击后动态生成并插入详情面板;④ 点击关闭按钮销毁详情视图——全程采用现代原生 Web API(fetch、addEventListener、Element.append()),避免全局变量污染与重复 DOM 操作。

✅ 核心思路:数据绑定 + 事件委托

关键在于将原始数据直接绑定到 DOM 元素上,而非依赖索引或 ID 查找。在创建

  • 时,通过自定义属性 li.personData = person 将对应联系人对象挂载至元素实例。这样,在点击事件中可通过 e.target.personData 直接访问完整数据,彻底规避了闭包陷阱与作用域丢失问题(如原代码中 data 和 i 在 showDetails 中不可访问)。

    同时,采用事件委托策略:不在每个

  • 上单独绑定事件监听器,而是将监听器绑定到父级
      ,通过 e.target.nodeName === 'LI' 判断触发源。此举显著提升性能(尤其数据量大时),并天然支持后续动态增删列表项。

      ✅ 完整可运行代码示例

      以下为优化后的 HTML、JavaScript 与关键 CSS 片段(已剔除冗余样式,聚焦功能逻辑):

      Molica AI
      Molica AI

      一款聚合了多种AI工具的一站式创作平台

      下载
      <!DOCTYPE html>
      <html lang="zh-CN">
      <head>
        <meta charset="UTF-8">
        <title>联系人管理</title>
        <link rel="stylesheet" href="style.css">
      </head>
      <body>
        <header><h1>联系人管理</h1></header>
        <main class="view"></main>
        <script src="script.js"></script>
      </body>
      </html>
      // script.js
      fetch('data.json')
        .then(res => {
          if (!res.ok) throw new Error(`HTTP ${res.status}: ${res.statusText}`);
          return res.json();
        })
        .then(data => createListContact(data))
        .catch(err => console.error('加载数据失败:', err));
      
      function createListContact(data) {
        const main = document.querySelector('main.view');
        main.innerHTML = ''; // 清空旧内容
      
        const ol = document.createElement('ol');
        ol.classList.add('list-view');
        ol.addEventListener('click', showDetails);
      
        data.personen.forEach((person, index) => {
          const li = document.createElement('li');
          li.classList.add('button');
          li.id = `person-${index}`;
          li.textContent = `Name: ${person.nachname}, ${person.vorname}`;
          li.personData = person; // ✅ 关键:数据直连 DOM
          ol.appendChild(li);
        });
      
        main.appendChild(ol);
      }
      
      function showDetails(e) {
        if (e.target.nodeName !== 'LI') return;
      
        const { personData } = e.target;
        const details = document.createElement('div');
        details.className = 'details';
        details.id = 'contact-details';
      
        const closeBtn = document.createElement('button');
        closeBtn.className = 'close-btn';
        closeBtn.textContent = '×';
        closeBtn.type = 'button';
        closeBtn.addEventListener('click', () => details.remove());
      
        const infoEl = document.createElement('div');
        infoEl.className = 'contact-info';
        infoEl.innerHTML = `
          <h2>${personData.vorname} ${personData.nachname}</h2>
          <p><strong>电话:</strong>${personData.telefonnummer || '未提供'}</p>
          <p><strong>邮箱:</strong>${personData.email || '未提供'}</p>
        `;
      
        details.append(closeBtn, infoEl);
        document.body.appendChild(details);
      }
      /* style.css */
      body {
        font-family: "Segoe UI", system-ui, sans-serif;
        background-color: #f5f5f5;
        margin: 0;
        padding: 20px;
      }
      
      main.view {
        max-width: 800px;
        margin: 0 auto;
        background: white;
        border-radius: 8px;
        box-shadow: 0 2px 10px rgba(0,0,0,0.1);
        overflow: hidden;
      }
      
      .list-view {
        list-style: none;
        padding: 0;
        margin: 0;
      }
      
      .list-view .button {
        padding: 12px 20px;
        margin: 4px;
        background: #4a6fa5;
        color: white;
        border: none;
        border-radius: 4px;
        cursor: pointer;
        font-size: 16px;
        text-align: left;
        transition: background 0.2s;
      }
      
      .list-view .button:hover {
        background: #3a5a80;
      }
      
      .details {
        position: fixed;
        top: 50%;
        left: 50%;
        transform: translate(-50%, -50%);
        background: white;
        border-radius: 8px;
        box-shadow: 0 10px 30px rgba(0,0,0,0.2);
        width: 90%;
        max-width: 500px;
        z-index: 1000;
        padding: 24px;
        border: 1px solid #e0e0e0;
      }
      
      .close-btn {
        float: right;
        background: none;
        border: none;
        font-size: 24px;
        cursor: pointer;
        color: #999;
        padding: 0;
        margin: -8px -8px 16px 0;
      }
      
      .close-btn:hover {
        color: #333;
      }
      
      .contact-info h2 {
        margin-top: 0;
        color: #2c3e50;
      }
      
      .contact-info p {
        margin: 8px 0;
        line-height: 1.5;
      }

      ⚠️ 注意事项与最佳实践

    • JSON 结构一致性:确保 data.json 中 personen 是数组,且每个对象包含 vorname、nachname、telefonnummer、email 字段(缺失字段建议用 || '未提供' 防错)。
    • 错误处理必须显式添加:fetch 可能因网络、CORS 或 JSON 格式错误失败,务必用 .catch() 捕获并提示用户(示例中已包含基础错误日志)。
    • 内存与性能:details.remove() 比 parentNode.removeChild() 更简洁安全;避免在循环中频繁调用 document.body.appendChild(),应先构建完整 DOM 片段再插入。
    • 无障碍与体验:生产环境建议为 .button 添加 role="button" 和键盘事件(Enter/Space 触发),并为模态框添加 aria-modal="true" 和焦点管理。
    • 样式隔离:.details 使用 position: fixed 并设 z-index,确保覆盖其他内容;关闭按钮浮动右上角,符合用户直觉。

    通过以上实现,你获得了一个零依赖、高可维护、语义清晰的前端数据展示方案。它不仅解决了“视图切换”的核心问题,更体现了现代 Web 开发中数据驱动、事件委托与关注点分离的设计思想。

  • 热门AI工具

    更多
    DeepSeek
    DeepSeek

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

    豆包大模型
    豆包大模型

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

    通义千问
    通义千问

    阿里巴巴推出的全能AI助手

    腾讯元宝
    腾讯元宝

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

    文心一言
    文心一言

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

    讯飞写作
    讯飞写作

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

    即梦AI
    即梦AI

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

    ChatGPT
    ChatGPT

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

    相关专题

    更多
    json数据格式
    json数据格式

    JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

    442

    2023.08.07

    json是什么
    json是什么

    JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

    544

    2023.08.23

    jquery怎么操作json
    jquery怎么操作json

    操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

    322

    2023.10.13

    go语言处理json数据方法
    go语言处理json数据方法

    本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

    81

    2025.09.10

    全局变量怎么定义
    全局变量怎么定义

    本专题整合了全局变量相关内容,阅读专题下面的文章了解更多详细内容。

    85

    2025.09.18

    python 全局变量
    python 全局变量

    本专题整合了python中全局变量定义相关教程,阅读专题下面的文章了解更多详细内容。

    101

    2025.09.18

    go语言闭包相关教程大全
    go语言闭包相关教程大全

    本专题整合了go语言闭包相关数据,阅读专题下面的文章了解更多相关内容。

    143

    2025.07.29

    append用法
    append用法

    append是一个常用的命令行工具,用于将一个文件的内容追加到另一个文件的末尾。想了解更多append用法相关内容,可以阅读本专题下面的文章。

    347

    2023.10.25

    pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
    pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

    本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

    660

    2026.02.13

    热门下载

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

    精品课程

    更多
    相关推荐
    /
    热门推荐
    /
    最新课程
    WEB前端教程【HTML5+CSS3+JS】
    WEB前端教程【HTML5+CSS3+JS】

    共101课时 | 9.4万人学习

    JS进阶与BootStrap学习
    JS进阶与BootStrap学习

    共39课时 | 3.3万人学习

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

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