如何在点击用户姓名时动态加载并显示其详细信息(左右分栏交互实现)

酷雪小哥_3982

酷雪小哥_3982

2026-03-21

758人浏览

原创

如何在点击用户姓名时动态加载并显示其详细信息(左右分栏交互实现)

本文介绍一种基于 php + html + javascript 的左右分栏式用户详情展示方案:左侧列表渲染用户缩略信息,右侧容器根据点击事件动态显示对应用户的完整数据,避免重复请求与页面重载。

本文介绍一种基于 php + html + javascript 的左右分栏式用户详情展示方案:左侧列表渲染用户缩略信息,右侧容器根据点击事件动态显示对应用户的完整数据,避免重复请求与页面重载。

在构建管理后台或 CRM 类系统时,常见的「左列表–右详情」布局(如联系人面板、投资者档案页)需兼顾性能与用户体验。核心挑战在于:如何让右侧详情区响应左侧任意用户的点击,并精准匹配、高亮、展示其专属数据? 本教程提供一套轻量、可维护、无框架依赖的实现思路。

✅ 核心设计思路

不推荐将右侧详情区域硬编码为单个静态模板(如原问题中仅写死一个

),而应采用 服务端预渲染 + 前端条件显隐 的组合策略:
  • 服务端:在右侧容器内,使用与左侧完全一致的 while 循环,为每一个用户生成一份结构相同的详情区块,并统一添加 data-user-id="" 属性;
  • 前端:通过 JavaScript 监听左侧用户项的点击事件,提取 data-user-id,再查找右侧对应 data-user-id 的 .chat-list 元素,将其设为 active-chat 并显示,同时隐藏其他详情块。

这样既避免了 AJAX 异步请求带来的延迟与复杂状态管理,又保证了 SEO 友好性与首屏加载完整性。

✅ 实现步骤与代码示例

1. 左侧用户列表(保持不变,仅增强语义)

确保每个 标签携带唯一且可识别的 data-user-id:


  • user
    ,
  • ✅ 注意:使用 htmlspecialchars() 防止 XSS,尤其当字段可能含 HTML 或特殊字符时。

    2. 右侧详情容器(关键改造点)

    将原静态单块结构,替换为循环生成所有用户详情块,每块独立封装、默认隐藏:

    <div class="chat-box p-9" style="height: calc(100vh - 428px)" data-simplebar="">
      <?php // 复用相同查询逻辑(注意:生产环境建议提取为函数或使用 prepared statement 防注入)
      $InvMeta = mysqli_query($con, "SELECT * FROM investors_meta ORDER BY 1 DESC");
      if ($_SESSION['useradmin'] === 'Investor') {
        $InvMeta = mysqli_query($con, "SELECT * FROM investors_meta WHERE inv_id = " . (int)$_SESSION['uid'] . " ORDER BY 1 DESC");
      }
    
      while ($row = mysqli_fetch_assoc($InvMeta)) {
        $FetchInvData = mysqli_query($con, "SELECT * FROM users WHERE userId = " . (int)$row['inv_id']);
        $inv = mysqli_fetch_assoc($FetchInvData);
        if (!$inv) continue; // 跳过无关联用户数据的记录
      ?><div class="chat-list chat" data-user-id="<?php echo (int)$row['inv_id']; ?>">
          <div class="hstack align-items-start mb-7 pb-1 justify-content-between">
            <div class="d-flex align-items-center gap-3">
              <img src="assets/dist/images/profile/user-4.jpg" alt="user"    style="max-width:90%"   style="max-width:90%" class="rounded-circle"><div>
                <h6 class="fw-semibold fs-4 mb-0"><?php echo htmlspecialchars($inv['full_name']); ?></h6>
                <p class="mb-0">— <?php echo htmlspecialchars($inv['role'] ?? 'N/A'); ?></p>
                <p class="mb-0">— <?php echo htmlspecialchars($inv['company'] ?? 'N/A'); ?></p>
              </div>
            </div>
          </div>
          <div class="row">
            <div class="col-4 mb-7">
              <p class="mb-1 fs-2">Phone</p>
              <h6 class="fw-semibold mb-0"><?php echo htmlspecialchars($inv['mobile'] ?? '-'); ?></h6>
            </div>
            <div class="col-8 mb-7">
              <p class="mb-1 fs-2">Email</p>
              <h6 class="fw-semibold mb-0">
                <a href="mailto:<?php%20echo%20htmlspecialchars(%24inv['userEmail']);%20?>">
                  <?php echo htmlspecialchars($inv['userEmail']); ?></a>
              </h6>
            </div>
            <div class="col-12 mb-9">
              <p class="mb-1 fs-2">Address</p>
              <h6 class="fw-semibold mb-0"><?php echo htmlspecialchars($inv['address'] ?? '-'); ?></h6>
            </div>
            <!-- 更多字段依此类推 -->
          </div>
          <div class="border-bottom pb-7 mb-4">
            <p class="mb-2 fs-2">Notes</p>
            <p class="mb-3 text-dark"><?php echo nl2br(htmlspecialchars($inv['notes'] ?? '')); ?></p>
          </div>
          <div class="d-flex align-items-center gap-2">
            <button class="btn btn-primary fs-2 edit-btn" data-id="<?php echo (int)$row['inv_id']; ?>">Edit</button>
            <button class="btn btn-danger fs-2 delete-btn" data-id="<?php echo (int)$row['inv_id']; ?>">Delete</button>
          </div>
        </div>
      <?php } ?>
    </div>

    ✅ 关键点:

    • 所有 .chat-list 初始无 active-chat 类(由 JS 控制);
    • 每个块的 data-user-id 与左侧严格一致(类型转换 (int) 提升健壮性);
    • 字段输出均做 htmlspecialchars() 和空值兜底处理,保障安全与稳定性。

    3. 前端交互逻辑(JavaScript)

    在页面底部或独立 JS 文件中加入以下脚本:

    <script>
    document.addEventListener('DOMContentLoaded', function () {
      // 缓存 DOM 元素
      const userLinks = document.querySelectorAll('.chat-user[data-user-id]');
      const chatLists = document.querySelectorAll('.chat-list[data-user-id]');
    
      // 点击左侧用户触发详情切换
      userLinks.forEach(link => {
        link.addEventListener('click', function () {
          const targetId = this.getAttribute('data-user-id');
          if (!targetId) return;
    
          // 移除所有 active 状态
          chatLists.forEach(el => el.classList.remove('active-chat'));
    
          // 显示目标详情块
          const targetChat = Array.from(chatLists).find(
            el => el.getAttribute('data-user-id') === targetId
          );
          if (targetChat) {
            targetChat.classList.add('active-chat');
          }
        });
      });
    
      // 初始化:默认显示第一个用户(可选)
      if (chatLists.length > 0 && !chatLists[0].classList.contains('active-chat')) {
        chatLists[0].classList.add('active-chat');
      }
    });
    </script>

    ✅ 补充说明:

    • 使用 DOMContentLoaded 确保 DOM 加载完成后再绑定事件;
    • Array.from().find() 兼容性良好(IE11+),如需支持更老浏览器可用 for 循环;
    • active-chat 类应定义 CSS display: block(其余默认 display: none),例如:
      .chat-list { display: none; }
      .chat-list.active-chat { display: block; }

    ⚠️ 注意事项与最佳实践

    • SQL 安全:示例中直接拼接 $_SESSION['uid'] 存在风险,务必改用预处理语句(PDO/MySQLi prepared statements) 替代字符串拼接;
    • 性能考量:若用户量极大(>500),服务端一次性渲染全部详情可能影响首屏速度,此时建议改用「懒加载 + AJAX」模式;
    • 样式隔离:确保 .chat-list 默认隐藏(display: none),且 active-chat 能正确覆盖;
    • 无障碍支持:为 .chat-user 添加 role="button" 与 tabindex="0",并监听 Enter/Space 键以支持键盘操作;
    • 移动端适配:在小屏幕下,可结合 Bootstrap 的 d-none d-lg-block 隐藏左侧列表,点击返回按钮恢复,提升体验。

    ✅ 总结

    本文所呈现的方案,以最小侵入方式解决了「点击左侧用户 → 右侧显示对应详情」这一高频需求。它不依赖外部框架,兼容传统 PHP 项目结构,兼具开发效率、运行性能与长期可维护性。只要确保前后端 data-user-id 一致性、做好安全过滤、辅以简洁的 JS 控制逻辑,即可快速落地一个专业级的双栏交互界面。

    PHP速学视频免费教程(入门到精通)
    PHP速学视频免费教程(入门到精通)

    PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

    下载

    相关标签:

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

    相关专题

    更多
    js获取数组长度的方法
    js获取数组长度的方法

    在js中,可以利用array对象的length属性来获取数组长度,该属性可设置或返回数组中元素的数目,只需要使用“array.length”语句即可返回表示数组对象的元素个数的数值,也就是长度值。php中文网还提供JavaScript数组的相关下载、相关课程等内容,供大家免费下载使用。

    2023.06.20

    5526

    5

    js刷新当前页面
    js刷新当前页面

    js刷新当前页面的方法:1、reload方法,该方法强迫浏览器刷新当前页面,语法为“location.reload([bForceGet]) ”;2、replace方法,该方法通过指定URL替换当前缓存在历史里(客户端)的项目,因此当使用replace方法之后,不能通过“前进”和“后退”来访问已经被替换的URL,语法为“location.replace(URL) ”。php中文网为大家带来了js刷新当前页面的相关知识、以及相关文章等内容

    2023.07.04

    1349

    3

    js四舍五入
    js四舍五入

    js四舍五入的方法:1、tofixed方法,可把 Number 四舍五入为指定小数位数的数字;2、round() 方法,可把一个数字舍入为最接近的整数。php中文网为大家带来了js四舍五入的相关知识、以及相关文章等内容

    2023.07.04

    5444

    6

    js删除节点的方法
    js删除节点的方法

    js删除节点的方法有:1、removeChild()方法,用于从父节点中移除指定的子节点,它需要两个参数,第一个参数是要删除的子节点,第二个参数是父节点;2、parentNode.removeChild()方法,可以直接通过父节点调用来删除子节点;3、remove()方法,可以直接删除节点,而无需指定父节点;4、innerHTML属性,用于删除节点的内容。

    2023.09.01

    1020

    4

    JavaScript转义字符
    JavaScript转义字符

    JavaScript中的转义字符是反斜杠和引号,可以在字符串中表示特殊字符或改变字符的含义。本专题为大家提供转义字符相关的文章、下载、课程内容,供大家免费下载体验。

    2023.09.04

    1976

    5

    js生成随机数的方法
    js生成随机数的方法

    js生成随机数的方法有:1、使用random函数生成0-1之间的随机数;2、使用random函数和特定范围来生成随机整数;3、使用random函数和round函数生成0-99之间的随机整数;4、使用random函数和其他函数生成更复杂的随机数;5、使用random函数和其他函数生成范围内的随机小数;6、使用random函数和其他函数生成范围内的随机整数或小数。

    2023.09.04

    3825

    4

    如何启用JavaScript
    如何启用JavaScript

    JavaScript启用方法有内联脚本、内部脚本、外部脚本和异步加载。详细介绍:1、内联脚本是将JavaScript代码直接嵌入到HTML标签中;2、内部脚本是将JavaScript代码放置在HTML文件的`<script>`标签中;3、外部脚本是将JavaScript代码放置在一个独立的文件;4、外部脚本是将JavaScript代码放置在一个独立的文件。

    2023.09.12

    5013

    6

    Js中Symbol类详解
    Js中Symbol类详解

    javascript中的Symbol数据类型是一种基本数据类型,用于表示独一无二的值。Symbol的特点:1、独一无二,每个Symbol值都是唯一的,不会与其他任何值相等;2、不可变性,Symbol值一旦创建,就不能修改或者重新赋值;3、隐藏性,Symbol值不会被隐式转换为其他类型;4、无法枚举,Symbol值作为对象的属性名时,默认是不可枚举的。

    2023.09.20

    3280

    5

    java访问控制修饰符介绍
    java访问控制修饰符介绍

    java访问控制修饰符有四种,分别是public、protected、private、默认访问修饰符。详细介绍:1、public,public是最宽松的访问控制修饰符,被修饰的类、方法和变量可以被任何其他类访问,当一个类、方法或变量被声明为public时,它们可以在任何地方被访问,无论是同一个包中的类还是不同包中的类;2、protected修饰符等等。

    2023.09.20

    1048

    7

    热门下载

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

    精品课程

    更多
    热门推荐
    /
    最新课程
    phpStudy极速入门视频教程
    phpStudy极速入门视频教程

    共6课时 | 54.7万人学习

    独孤九贱(4)_PHP视频教程
    独孤九贱(4)_PHP视频教程

    共89课时 | 134.1万人学习