JavaScript实现简易聊天对话框(加滚动条)

下面是JavaScript实现简易聊天对话框(加滚动条)的完整攻略。

简介

这个项目的目标是实现一个简易的聊天对话框,用户可以在对话框内输入消息,同时页面支持滚动条。

准备工作

首先,我们需要准备一个HTML模板和CSS文件,用于布局和样式调整。模板如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>简易聊天对话框</title>
    <link rel="stylesheet" href="css/style.css">
</head>
<body>
    <div class="chat-container">

        <div class="messages">
            <!-- 消息显示区域 -->
        </div>

        <div class="input-box">
            <textarea id="input-message" placeholder="请输入消息"></textarea>
            <button id="send-btn">发送消息</button>
        </div>

    </div>

    <script src="js/main.js"></script>
</body>
</html>

其中,class="chat-container"是整个聊天界面的容器,class="messages"是消息显示区域的容器,其中我们将在JavaScript中动态添加消息内容。

接下来,我们需要在CSS文件中定义样式,使整个聊天界面看起来更美观。

.chat-container {
    width: 500px;
    margin: 50px auto;
    border: 1px solid #ccc;
    border-radius: 10px;
    background-color: #fff;
    box-shadow: 0 1px 5px rgba(0, 0, 0, 0.2);
}

.messages {
    height: 300px;
    overflow-y: auto;
    padding: 10px;
}

.input-box {
    padding: 10px;
}

#input-message {
    width: 80%;
    height: 60px;
    padding: 10px;
    border-radius: 5px;
    border: 1px solid #ccc;
    resize: none;
    outline: none;
}

#send-btn {
    display: inline-block;
    width: 18%;
    height: 60px;
    margin-left: 2%;
    border-radius: 5px;
    background-color: #36c;
    color: #fff;
    font-size: 16px;
    border: none;
    outline: none;
}

实现过程

添加消息

首先,我们需要在输入框中监听用户的输入,获取到用户输入的内容,并在“发送”按钮被点击时,将输入内容添加到消息显示区域中。

var sendBtn = document.getElementById('send-btn');
var messageInput = document.getElementById('input-message');
var messagesContainer = document.querySelector('.messages');

// 发送消息事件处理函数
function sendMessage() {
    var message = document.createElement('div');
    message.classList.add('message');
    message.innerText = messageInput.value;
    messagesContainer.appendChild(message);
    messageInput.value = '';
}

sendBtn.addEventListener('click', sendMessage);

在这段代码中,我们首先获取“发送”按钮、消息输入框、以及消息显示区域的DOM元素。然后,我们定义了一个名为sendMessage的函数,该函数会在用户点击“发送”按钮时被调用。在函数内部,我们创建了一个<div>元素,并将其添加到消息显示区域中。这里使用createElement函数创建<div>元素,然后使用innerText属性将用户输入的内容赋值给创建的<div>元素的文本部分。最后,我们清空了用户输入的内容,使得下一条消息可以顺利发送。

添加滚动条

接下来,我们需要实现消息显示区域的滚动条功能。我们希望当消息数量超出一定限制时,消息区域会自动出现滚动条,并将滚动条位置固定在最新的一条消息上。

// 自动滚动函数
function autoScroll() {
    var messages = document.querySelectorAll('.messages .message');
    var lastMessage = messages[messages.length - 1];
    var lastMessageTop = lastMessage.offsetTop;

    messagesContainer.scrollTop = lastMessageTop - messagesContainer.offsetHeight + lastMessage.offsetHeight;
}

// 监听消息变化
var observer = new MutationObserver(function(mutations) {
    autoScroll();
});

observer.observe(messagesContainer, { childList: true });

在这段代码中,我们定义了一个名为autoScroll的函数,该函数负责计算滚动条的位置,然后将其固定在最新的消息上。该函数首先获取了所有的消息元素,并从中取出最后一条消息。然后,我们使用offsetTop属性计算出最后一条消息相对于消息显示区域顶部的距离。接下来,我们使用scrollTop属性调整消息显示区域的滚动位置,使得最后一条消息可以完整地显示在消息区域中。

接下来,我们使用MutationObserver函数监听消息显示区域的变化,当子元素改变时,即有新消息添加到消息显示区域时,就会触发autoScroll函数,自动调整滚动条的位置。

示例

示例一

假设我们希望将消息显示区域的消息数量限制为10条,当超过10条时,就会开始显示滚动条。在创建消息元素时,我们可以判断消息数量是否超过10条,在超过限制时,删除最早的一条消息,然后再添加新的一条消息。

// 发送消息事件处理函数
function sendMessage() {
    var messageCount = document.querySelectorAll('.messages .message').length;

    if (messageCount >= 10) {
        messagesContainer.firstElementChild.remove();
    }

    var message = document.createElement('div');
    message.classList.add('message');
    message.innerText = messageInput.value;
    messagesContainer.appendChild(message);
    messageInput.value = '';
}

sendBtn.addEventListener('click', sendMessage);

示例二

假设我们希望能够在后端数据库中保存聊天记录。在每次用户发送消息时,我们不仅将消息添加到消息显示区域中,还可以使用Ajax技术将消息发送到后端保存。

// 发送消息事件处理函数
function sendMessage() {
    var messageCount = document.querySelectorAll('.messages .message').length;

    if (messageCount >= 10) {
        messagesContainer.firstElementChild.remove();
    }

    var message = document.createElement('div');
    message.classList.add('message');
    message.innerText = messageInput.value;
    messagesContainer.appendChild(message);
    messageInput.value = '';

    // 发送消息到后端
    var xhr = new XMLHttpRequest();
    xhr.open('POST', '/api/sendMessage');
    xhr.setRequestHeader('Content-Type', 'application/json;charset=UTF-8');
    xhr.send(JSON.stringify({
        message: messageInput.value
    }));
}

sendBtn.addEventListener('click', sendMessage);

在这段代码中,我们使用了XMLHttpRequest对象向后端发送了一个POST请求,并将用户发送的消息作为JSON对象的属性值发送到后端。后端可以接受到该请求,将消息保存到数据库中。这样,即使用户关闭了聊天界面,也不会丢失聊天记录。

总结

由此可见,实现简易聊天对话框(加滚动条)的过程中,关键在于添加消息和实现滚动条。我们可以通过监听消息数量,实现消息数量的限制。同时,使用MutationObserver函数,可以在新消息添加到消息显示区域时,自动调整滚动条位置。此外,我们还可以通过Ajax技术将消息发送到后端进行保存,从而实现聊天记录的保存。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript实现简易聊天对话框(加滚动条) - Python技术站

(0)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • html-css设置标签样式不起作用的2点原因

    当网站开发遇到设置标签样式不起作用的情况时,可能会因为以下两点原因导致: 1. 样式被其他样式覆盖 在 HTML 中,当相同的元素被多个样式设置时,后面的样式声明会覆盖前面的声明。例如,以下 CSS 样式: p { font-size: 16px; } p { font-size: 20px; } 在这种情况下,p 元素文本大小将为 20 像素,而不是 16…

    css 2023年6月9日
    00
  • CSS样式表教程:浏览器默认样式

    CSS样式表教程:浏览器默认样式 1. 什么是浏览器默认样式 浏览器默认样式是指浏览器在没有CSS样式表的情况下为HTML元素应用的样式。不同的浏览器会有不同的默认样式,因此在网页开发中,了解浏览器默认样式非常重要。 2. 浏览器默认样式的问题 浏览器的默认样式通常都会存在一些问题,如过大的行高、字体太小或太大、不同浏览器之间的表现不一致等等。因此,为了解决…

    css 2023年6月9日
    00
  • 如何用JavaScript实现动态修改CSS样式表

    下面我将详细讲解如何用JavaScript实现动态修改CSS样式表。 一、获取并修改样式表内容 首先,我们需要获取样式表的DOM对象。可以通过以下方式获取: let styleSheet = document.styleSheets[0]; 其中,styleSheets属性返回一个包含页面中所有样式表的数组,我们可以通过数组下标指定所要修改的样式表对象。修改…

    css 2023年6月9日
    00
  • CSS解决链接锚点定位偏移的代码

    当使用锚点进行页面内跳转时,有时候会出现链接跳转后定位偏移的情况,而这个偏移量通常是因为网页布局中的fixed或absolute元素引起的。为了解决这种情况,我们可以使用CSS来删掉这些元素的影响,具体的攻略如下: 攻略 在锚点的目标位置上方添加一个与fixed元素高度相等的空白元素,在空白元素上设置相反的margin-top,即负值等于fixed元素的高度…

    css 2023年6月9日
    00
  • JS实现隔行换色的表格排序

    JS实现隔行换色的表格排序包括以下几个步骤: 获取表格元素 获取表格头部元素,并绑定点击事件,当点击表头时触发排序功能 解析表格数据,将数据存储到一个数组中,每一行数据为一个对象 编写排序函数,根据表头点击事件触发的不同,采用不同的排序方式,例如按照数值大小从小到大或从大到小排序、按照字母表顺序排序等 将排序后的数据重新渲染到表格中,并实现隔行换色的效果 以…

    css 2023年6月10日
    00
  • 收集的web页面html中常用的特殊符号大全

    收集web页面HTML中常用的特殊符号大全是网站制作中常见的需求。下面是完整的攻略: 收集特殊符号的方法 方法一:查看常用特殊符号的列表 打开常用特殊符号大全网站,如 HTML特殊字符列表 或 HTML特殊字符大全。 浏览其中的列表,可按照符号名称或Unicode码进行排序查看。 在需要插入特殊符号的地方,复制符号对应的HTML实体代码或Unicode码即可…

    css 2023年6月11日
    00
  • CSS属性探秘系列(六):margin

    我来为你详细讲解”CSS属性探秘系列(六):margin”的完整攻略。 margin简介 在HTML文档中,每个元素都可以添加外边距(margin)。Margin是元素与外部元素之间的间距。通常用于控制元素之间的距离和布局。Margin可以通过CSS来指定。该属性定义元素四个方向的外边距。 CSS中margin的语法 margin属性在CSS中的用法如下: …

    css 2023年6月9日
    00
  • 深圳字节跳动笔试(小结)

    深圳字节跳动笔试攻略 1. 题目类型和难度 在深圳字节跳动的笔试中,题目类型和难度较为广泛,涉及算法、数据结构、操作系统、计算机网络以及编程语言等方面的知识点。其中算法和数据结构是笔试的重点,占据了大部分的考点。难度方面,整体可以划分为易、中、难三个等级,每个等级的题目数量大致相同。 2. 切入点和备考建议 在备考深圳字节跳动的笔试时,可以从以下几个切入点进…

    css 2023年6月10日
    00
合作推广
合作推广
分享本页
返回顶部