You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用JavaScript实现点击选中div后切换展示对应聊天内容

功能实现方案

1 修改Twig模板

你需要对原有Twig代码做三处调整:

  • 给每个联系人卡片添加自定义属性存储关联用户名,点击时可以直接获取标识
  • 将全量消息数据和当前登录用户ID注入前端全局变量,供JS过滤使用
  • 清空原有写死的消息结构,留空容器供JS动态渲染内容

修改后的Twig核心代码如下:

{% set msg_details = query().from('messages').get() %}
{% set to_add = to_name %}
{% set to_details = query().from('users_users').where('id', to_add).get() %}

<div class="container">
  <h3 class="text-center">Messaging</h3>
  <div class="messaging">
    <div class="inbox_msg">
      <div class="inbox_people">
        <div class="headind_srch">
          <div class="recent_heading">
            <h4>{{auth_user().first_name}}</h4>
          </div>
          <div class="srch_bar">
            <div class="stylish-input-group">
              <input type="text" class="search-bar" placeholder="Search" >
              <span class="input-group-addon">
                <button type="button"> <i class="fa fa-search" aria-hidden="true"></i> </button>
              </span>
            </div>
          </div>
        </div>
        <div class="inbox_chat">
          {% set newArray = [] %}
          {% for msg in msg_details %}
          {% if msg.to_name not in newArray %}
          <!-- 新增data-username属性存储对应用户名 -->
          <div class="chat_list {% if loop.first %}active_chat{% endif %}" onclick="viewMessage(this)" data-username="{{msg.to_name}}">
            <div class="chat_people">
              <div class="chat_img"> <img src="/images/default-avatar.png" alt="avatar"> </div>
              <div class="chat_ib">
                <h5>{{msg.to_name}} <span class="chat_date">{{msg.time}}</span></h5>
              </div>
            </div>
          </div>
          {% set newArray = newArray|merge([msg.to_name]) %}
          {% endif %}
          {% endfor %}
        </div>
      </div>
      <div class="mesgs">
        <!-- 清空原有写死的消息内容,留空容器供JS渲染 -->
        <div class="msg_history"></div>
      </div>
    </div>
  </div>
</div>

<!-- 注入全局数据供JS使用 -->
<script>
window.allMessages = {{ msg_details|json_encode|raw }};
window.currentUserId = {{ auth_user().id|raw }};
</script>

2 新增JS逻辑

替换原有没用的copyText函数,新增viewMessage点击处理函数,实现消息过滤渲染:

function viewMessage(clickEl) {
  // 1. 获取选中的用户名
  const selectedUsername = clickEl.dataset.username;
  // 2. 过滤出和当前选中用户相关的所有消息
  const relatedMessages = window.allMessages.filter(msg => {
    // 可根据你的数据表字段实际情况调整判断条件
    return msg.to_name === selectedUsername || msg.from_name === selectedUsername;
  });
  // 3. 获取消息容器
  const msgContainer = document.querySelector('.msg_history');
  msgContainer.innerHTML = '';
  // 4. 遍历渲染消息
  relatedMessages.forEach(msg => {
    // 判断是自己发的消息还是收到的消息
    const isMySend = msg.from_name === window.currentUserId;
    let msgHtml = '';
    if (isMySend) {
      msgHtml = `
      <div class="outgoing_msg">
        <div class="sent_msg">
          <p>${msg.message}</p>
          <span class="time_date">${msg.time}</span>
        </div>
      </div>
      `;
    } else {
      msgHtml = `
      <div class="incoming_msg">
        <div class="incoming_msg_img">
          <img src="/images/default-avatar.png" alt="avatar">
        </div>
        <div class="received_msg">
          <div class="received_withd_msg">
            <p>${msg.message}</p>
            <span class="time_date">${msg.time}</span>
          </div>
        </div>
      </div>
      `;
    }
    msgContainer.innerHTML += msgHtml;
  });
  // 5. 切换选中联系人的高亮状态
  document.querySelectorAll('.chat_list').forEach(el => el.classList.remove('active_chat'));
  clickEl.classList.add('active_chat');
}

注意调整点

  • 请根据你的messages表实际字段名调整过滤逻辑,比如如果发送者字段是from_id、接收者是to_id,对应修改判断条件即可
  • 头像路径替换为你项目内的本地资源路径即可

内容的提问来源于stack exchange,提问作者CodeHunt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 14:09:03