讲师中心 微信公众号
AI工具推荐 视频效率加速

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

大静大大_1010

大静大大_1010

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

|

265人浏览过

|

来源于php中文网

原创

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

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

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

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

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

关键在于将原始数据直接绑定到 DOM 元素上,而非依赖索引或 ID 查找。在创建 <li> 时,通过自定义属性 li.personData = person 将对应联系人对象挂载至元素实例。这样,在点击事件中可通过 e.target.personData 直接访问完整数据,彻底规避了闭包陷阱与作用域丢失问题(如原代码中 data 和 i 在 showDetails 中不可访问)。

同时,采用事件委托策略:不在每个 <li> 上单独绑定事件监听器,而是将监听器绑定到父级 <ol>,通过 e.target.nodeName === 'LI' 判断触发源。此举显著提升性能(尤其数据量大时),并天然支持后续动态增删列表项。

Feishu calendar sync, local ics to json data for AI agent
Feishu calendar sync, local ics to json data for AI agent

将ICS日历文件转为JSON格式,用于飞书日历导入导出及数据集成。

下载

✅ 完整可运行代码示例

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

<!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工具

更多
WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

相关专题

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

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

2035

2023.08.07

json是什么
json是什么

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

2982

2023.08.23

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

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

1016

2023.10.13

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

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

3379

2025.09.10

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

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

4145

2025.09.18

python 全局变量
python 全局变量

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

1710

2025.09.18

c++ 全局变量
c++ 全局变量

本专题整合了c++全局变量的使用、定义、作用域等等内容,阅读专题下面的文章了解更多详细内容。

199

2026.03.17

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

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

3933

2025.07.29

FrankenPHP集成Laravel详细教程
FrankenPHP集成Laravel详细教程

本专题提供FrankenPHP集成Laravel的详细配置指南,全面解析运行原理、开发环境搭建、Caddyfile配置、Octane工作模式、数据库连接、队列任务、定时任务和生产环境优化,解决部署过程中常见的报错与兼容性问题。

0

2026.10.08

热门下载

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

精品课程

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

共101课时 | 20.8万人学习

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

共39课时 | 4.8万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn