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

酷雪小哥_3982

酷雪小哥_3982

2026-03-21

271人浏览

原创

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

本文详解如何通过 php 后端数据预加载 + 前端 javascript 事件绑定,实现左侧用户列表点击后,右侧实时显示对应用户详情的响应式交互效果,避免重复请求、保持布局稳定且代码可维护。

本文详解如何通过 php 后端数据预加载 + 前端 javascript 事件绑定,实现左侧用户列表点击后,右侧实时显示对应用户详情的响应式交互效果,避免重复请求、保持布局稳定且代码可维护。

在构建用户管理类后台界面(如投资者管理系统)时,常见的左右分栏布局需满足:左栏为可滚动用户列表,右栏为当前选中用户的完整详情面板。关键挑战在于——不能将右栏内容嵌入循环生成(否则所有用户详情同时渲染,造成性能浪费与 DOM 冗余),也不能每次点击都发起 AJAX 请求(增加延迟与服务压力)。最佳实践是:服务端一次性预加载全部用户数据并隐藏渲染,前端通过 data-user-id 属性精准控制显隐逻辑。

✅ 推荐实现方案:服务端预加载 + 前端动态切换

1. 左侧用户列表(保持原结构,仅增强语义)

确保每个用户项携带唯一标识:

<a href="javascript:void(0)" class="px-4 py-3 bg-hover-light-black d-flex align-items-center chat-user" data-user-id="<?php echo htmlspecialchars($row['inv_id']); ?>">
  <span class="position-relative">
    <img src="assets/dist/images/profile/user-4.jpg" alt="user"    style="max-width:90%"   style="max-width:90%" class="rounded-circle"></span>
  <div class="ms-6 d-inline-block w-75">
    <h6 class="mb-1 fw-semibold"><?php echo htmlspecialchars($inv['full_name']); ?></h6>
    <span class="fs-2 text-body-color d-block">
      <?php echo htmlspecialchars($inv['mobile']); ?>, <?php echo htmlspecialchars($inv['userEmail']); ?></span>
  </div>
</a>

✅ 注意:使用 htmlspecialchars() 防止 XSS 攻击;data-user-id 是后续 JS 匹配的核心依据。

2. 右侧详情区(重构为「模板容器」+ 多个隐藏详情块)

将原静态详情

替换为 循环生成的多个带 data-user-id 的详情区块,初始全部隐藏:
<div class="chat-box p-9" style="height: calc(100vh - 428px)" data-simplebar="">
  <?php // 重新执行相同查询(确保数据一致性)
  $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);

    // 安全转义输出内容
    $fullName = htmlspecialchars($inv['full_name'] ?? 'N/A');
    $mobile = htmlspecialchars($inv['mobile'] ?? 'N/A');
    $email = htmlspecialchars($inv['userEmail'] ?? 'N/A');
    $address = htmlspecialchars($inv['address'] ?? 'N/A');
    $city = htmlspecialchars($inv['city'] ?? 'N/A');
    $country = htmlspecialchars($inv['country'] ?? 'N/A');
    $notes = nl2br(htmlspecialchars($inv['notes'] ?? 'No notes.'));
    ?><div class="chat-list chat user-detail" data-user-id="<?php echo (int)$row['inv_id']; ?>" style="display: none;">
      <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="<?php echo $fullName; ?>"    style="max-width:90%"   style="max-width:90%" class="rounded-circle"><div>
            <h6 class="fw-semibold fs-4 mb-0"><?php echo $fullName; ?></h6>
            <p class="mb-0">Investor</p>
            <p class="mb-0">— Portfolio Management System</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 $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%20%24email;%20?>"><?php echo $email; ?></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 $address; ?></h6>
        </div>
        <div class="col-4 mb-7">
          <p class="mb-1 fs-2">City</p>
          <h6 class="fw-semibold mb-0"><?php echo $city; ?></h6>
        </div>
        <div class="col-8 mb-7">
          <p class="mb-1 fs-2">Country</p>
          <h6 class="fw-semibold mb-0"><?php echo $country; ?></h6>
        </div>
      </div>
      <div class="border-bottom pb-7 mb-4">
        <p class="mb-2 fs-2">Notes</p>
        <p class="mb-0 text-dark"><?php echo $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>

3. 前端交互逻辑(轻量、可靠、无框架依赖)

在页面底部添加初始化脚本:

<script>
document.addEventListener('DOMContentLoaded', function () {
  // 缓存常用元素
  const userLinks = document.querySelectorAll('.chat-user');
  const detailContainers = document.querySelectorAll('.user-detail');

  // 点击左侧用户触发显示
  userLinks.forEach(link => {
    link.addEventListener('click', function () {
      const targetId = this.getAttribute('data-user-id');

      // 隐藏所有详情
      detailContainers.forEach(el => el.style.display = 'none');

      // 显示匹配详情(若存在)
      const targetDetail = document.querySelector(`.user-detail[data-user-id="${targetId}"]`);
      if (targetDetail) {
        targetDetail.style.display = 'block';

        // 可选:滚动到顶部,提升体验
        targetDetail.closest('.chat-box').scrollTop = 0;
      }
    });
  });

  // 【进阶建议】首次加载默认显示第一个用户详情
  if (userLinks.length > 0 && detailContainers.length > 0) {
    const firstId = userLinks[0].getAttribute('data-user-id');
    const firstDetail = document.querySelector(`.user-detail[data-user-id="${firstId}"]`);
    if (firstDetail) firstDetail.style.display = 'block';
  }
});
</script>

⚠️ 关键注意事项

  • SQL 安全性:所有 $_SESSION['uid'] 和 $row['inv_id'] 必须强制类型转换(如 (int))或使用 PDO 预处理,杜绝 SQL 注入。
  • 性能权衡:此方案适合用户量 ≤ 500 条的场景;若数据量极大,应改用「懒加载 + AJAX」模式。
  • 样式隔离:.user-detail { display: none; } 应定义在 CSS 中,而非内联,便于统一维护。
  • 无障碍支持:为 .chat-user 添加 role="button" 和 aria-expanded 属性,提升可访问性。
  • 错误兜底:JS 中应检查 targetDetail 是否存在,避免空引用报错。

该方案兼顾开发效率、运行性能与代码可读性,是 PHP + Bootstrap 类项目中实现用户详情联动的经典范式。

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

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

下载

相关标签:

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

相关专题

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

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

2023.06.20

5506

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

3805

4

如何启用JavaScript
如何启用JavaScript

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

2023.09.12

4993

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万人学习