Django聊天应用-当有新消息加入时不能自动向下滚动聊天框

xuo3flqw  于 2023-01-18  发布在  Go
关注(0)|答案(1)|浏览(160)

所以我用Django Channels,Javascript和HTML/CSS做了一个聊天应用。我真的不太熟悉前端,但到目前为止,我的聊天应用似乎一切正常,除了聊天框本身在添加新消息时不会向下移动。
我把我的CSS类.chatbox设置为overflow: scroll,但是添加这个类不会在插入新消息时使框自动滚动。我假设基于研究,我需要修改我的javascript脚本,但是我真的不知道从哪里开始。再次强调,请慢一点,哈哈,我对前端不太熟悉。
当前Javascript:

<script>
    const chatLog = document.querySelector('#chat-log');
    const chatSocket = new WebSocket("ws://" + window.location.host + "/");

    if (!chatLog.hasChildNodes()) {
      const emptyText = document.createElement('h3')
      emptyText.id = 'emptyText'
      emptyText.innerText = 'No Messages'
      emptyText.className = 'empty Text'
      chatLog.appendChild(emptyText)
    };

    chatSocket.onopen = function (e) {
      console.log("The connection was setup successfully !");
    };

    chatSocket.onclose = function (e) {
      console.log("Something unexpected happened !");
    };

    document.querySelector("#id_message_send_input").focus();
    document.querySelector("#id_message_send_input").onkeyup = function (e) {
      if (e.keyCode == 13) {
        document.querySelector("#id_message_send_button").click();
      }
    };

    document.querySelector("#id_message_send_button").onclick = function (e) {
      var messageInput = document.querySelector("#id_message_send_input");
      message = messageInput.value;
      chatSocket.send(JSON.stringify({ message: message, username : "{{request.user.username}}"}));
      messageInput.value = "";
    };

    chatSocket.onmessage = function (e) {
      const data = JSON.parse(e.data);
      const messageElement = document.createElement('div');
      const userId = data['user_id']
      const loggedInUserId = JSON.parse(document.getElementById('user_id').textContent)
      messageElement.innerText = data.username + " : " + data.message;
      //messageElement.className = 'message'
      if (userId === loggedInUserId) {
        messageElement.classList.add('message', 'sender')
      } else {
        messageElement.classList.add('message', 'receiver')
      }

      chatLog.appendChild(messageElement)

      if (document.querySelector('#emptyText')) {
        document.querySelector('#emptyText').remove()
      }
    };
  </script>

当前聊天框CSS:

.chatbox {
    height: 55vh;
    margin-top: 20px;
    overflow: scroll;
}
bogh5gae

bogh5gae1#

我明白你的意思。这是一个痛苦。这取决于什么元素chatLog是。如果它是一个列表项在一个ul,它不会更新它的容器大小自动向下滚动到。所以它不会为其他HTML元素。
我不得不手动解决它,每次添加消息时都设置一个新的大小。
比如:

document.getElementById('chat_content').height = base.offsetHeight-25;

var chat_contents = document.getElementsByClassName('chat_content');
    
for (var i=0; i<chat_contents .length;i++) {
    chat_contents[i].height = document.getElementById('chat_content').height;
}
    
document.getElementById('scrollable_chat_text').height = (base.offsetHeight-76);
    
chat_contents= document.getElementsByClassName('scrollable_chat_text');
for (i=0; i<chat_contents.length;i++) {
    chat_contents[i].height = (base.offsetHeight-76);
}

不要问我关于"25"或"76",这可能是一些像素移位"bs",我当时做了一些设计原因的调整。
我还在末尾添加了一个虚拟行(删除它,添加新的聊天消息,再添加回来),以使它正确地向下滚动到最后

<li><span class="noselect" style="color:#FFFFFF;">ScrollHack</span></li>

让我知道这是否是你的正确方向

相关问题