草庐IT

javascript - 聊天框滚动到底部?

coder 2024-04-27 原文

我使用 PHP 创建了一个简单的聊天框。我希望它能够加载所有新消息并滚动到 chatbox 的底部。我正在使用 AJAX 重新加载新消息,但似乎无法使其向下滚动到新消息出现的底部。

我已经尝试使用 down.scrollTop = down.scrollHeight; 但无法使其正常运行。

有什么帮助吗?

<div id="tab3">
    <h2>Chat Room</h>

    <div id="c-input_wrap">
        <div id="chatlog">
            Loading chat please wait...
        </div>


        <div id="chatwrap">
            <div id="chatinput">
                <form name="chatbox" class="userchat">
                    <input class="userchat" name="message" type="text" autocomplete="off" onkeydown="if (event.keyCode == 13) document.getElementById('chatbutton').click()" autofocus/><br>
                    <input class="userchat" id="chatbutton" name="submitmsg" type="button" onclick="submitChat()" value="Send" />
                </form>
            </div>
        </div>
    </div>
</div>

<script>
var form = document.querySelector('form[name="chatbox"]');
form.addEventListener("submit", function (event) {
    event.preventDefault();
});

function submitChat() {
    if(chatbox.message.value == '') {
        alert('Error: Missing Fields.');
        return;
    }
    var message = chatbox.message.value;
    var xmlhttp = new XMLHttpRequest();

    xmlhttp.onreadystatechange = function() {
        if(xmlhttp.readyState==4&&xmlhttp.status==100) {
            document.getElementById('chatlog').innerHTML = xmlhttp.responseText;
        }
    }
    xmlhttp.open('GET','chat.php?message='+message, true);
    xmlhttp.send();
    chatbox.reset();
}

$(document).ready(function(e) {
    $.ajaxSetup({cache:false});
    setInterval(function() {$('#chatlog').load('logs.php');}, 200);
});
</script>

CSS:

#tabs {
    overflow: hidden;
    max-width: 100%;
    margin: 0;
    padding: 0;
    list-style: none;
}

#tabs li {
    float: left;
    margin: 0px -15px 0 0;
}

#tabs a {
    float: left;
    position: relative;
    padding: 0 20px;
    height: 0;
    line-height: 30px;
    text-transform: uppercase;
    font-weight: bold;
    text-decoration: none;
    color: #FFFFFF;
    border-right: 20px solid transparent;
    border-bottom: 30px solid #3D3D3D;
    opacity: .3;
    filter: alpha(opacity=30);
    transition: all .5s;
}

#tabs a:hover,  #tabs a:focus {
    border-bottom-color: rgba(255,0,4,0.60);
    opacity: 1;
    filter: alpha(opacity=100);
}

#tabs a:focus {
    outline: 0;
}

#tabs #current {
    z-index: 10;
    border-bottom-color: #3d3d3d;
    opacity: .8;
    filter: alpha(opacity=100);
    cursor: default;
}

#content {
    background-color: rgba(0,0,0,0.10);
    border-top: 3px solid rgba(61,61,61,0.80);
    padding: 2em;/*height: 220px;*/
    overflow-y: auto;
    height: 85%;
}

#content h2,  #content h3,  #content p {
    margin: 0 0 15px 0;
}

#chatlog {
    position: absolute;
    margin-left: auto;
    margin-right: auto;
    left: 0;
    right: 0;
    padding: 0;
    text-align: left;
    font-family:"Gill Sans", "Gill Sans MT", "Myriad Pro", "DejaVu Sans Condensed", Helvetica, Arial, sans-serif;
    color: #000000;
    background-color: rgba(255,255,255,0.70);
    border-top: solid 2px rgba(235,0,3,0.70);
    width: 95%;
    height: 88%;
    overflow-y: auto; 
    word-wrap: break-word;
}

#c-input_wrap {
    position: absolute;
    margin-left: auto;
    margin-right: auto;
    left: 0;
    right: 0;
    padding: 0;
    height: 63%;
}

#chatinput {
    position: absolute;
    margin-left: auto;
    margin-right: auto;
    left: 27%;
    right: 25%;
    width: 70%;

}

#chatwrap {
    position: absolute;
    height: 40px;
    width: 95%;
    margin-left: auto;
    margin-right: auto;
    left: 0;
    right: 0;
    bottom: -10px;
}



input.userchat {
    display: inline-block;
    float: left;
    margin-left: 0;
    width: 50%;
    padding: 10px;
    border: none;
    border-bottom: solid 2px #3D3D3D;
    transition: border, background-color .75s;
    background-color: rgba(255,255,255,0.70);
    font-weight: bold;
    line-height: 18px;
    color: #000000;
}

input:focus.userchat {
    background-color: rgba(255,255,255,0.90);
    border-bottom: solid 2px rgba(235,0,3,0.69);
    outline: 0;
    color: rgba(61,61,61,1.00);
    font-weight: bold;
}

input[type=button].userchat {
    display: block;
    margin-top: -23px;
    margin-left: 2px;
    text-align: center;
    padding-left: 2px;
    float: left;
    width: 40px;
    font-family: "Gill Sans", "Gill Sans MT", "Myriad Pro", "DejaVu Sans Condensed", Helvetica, Arial, sans-serif;
    color: rgba(61,61,61,0.70);
    font-size: 16px;
    background: rgba(255,255,255,0.70); 
    border-bottom: solid 2px #3D3D3D;
    cursor :pointer;
    transition: all .75s;
}

input[type=button].userchat:hover,
input[type=button].userchat:focus  {
    font-family: "Gill Sans", "Gill Sans MT", "Myriad Pro", "DejaVu Sans Condensed", Helvetica, Arial, sans-serif;
    color: #000000;
    font-size: 16px;
    border-bottom: solid 2px rgba(235,0,3,0.69);
    background: rgba(255,255,255,0.90); 
    cursor: pointer;
}

聊天.php:

<?php
    error_reporting(E_ALL & ~E_NOTICE);
    session_start();

    if  (isset($_SESSION['id'])) {
        $userId = $_SESSION['id'];
        $username = $_SESSION['username'];
        $userLabel = $_SESSION['nickname'];
    }

    $connect = mysqli_connect("", "", "", "webclyde_root");
    mysqli_select_db($connect, "webclyde_root");
    $message = $_REQUEST['message'];

    mysqli_query($connect, "INSERT INTO chat (name, message) VALUES ('$userLabel', '$message')");

    $result1 = mysqli_query($connect, "SELECT * FROM chat ORDER by id");
    while ($extract = mysqli_fetch_assoc($result1)) {
        echo $extract['name'] . ": " . $extract['message'];
    }
?>

日志.php

<?php
    error_reporting(E_ALL & ~E_NOTICE);
    session_start();

    if  (isset($_SESSION['id'])) {
        $userId = $_SESSION['id'];
        $username = $_SESSION['username'];
        $userLabel = $_SESSION['nickname'];
    }

    $connect = mysqli_connect("", "", "", "webclyde_root");
    mysqli_select_db($connect, "webclyde_root");    
    $result1 = mysqli_query($connect, "SELECT * FROM chat ORDER by id");
    while ($extract = mysqli_fetch_assoc($result1)) {
        echo "<br>" . $extract['name'] . ": " . $extract['message'];
    }
?>

最佳答案

要使其具有动画效果,您可以使用 jQuery .animate() 函数。

使用:

var log = $('#chatlog');
log.animate({ scrollTop: log.prop('scrollHeight')}, 1000);

jsFiddle 示例:http://jsfiddle.net/00xsrck8/

或者不使用动画:

var log = $('#chatlog');
log.animate({ scrollTop: log.prop('scrollHeight')}, 0);

使用提供的 css 来完成这个任务。请参阅 jsfiddle:http://jsfiddle.net/00g2LnqL/

关于javascript - 聊天框滚动到底部?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33641208/

有关javascript - 聊天框滚动到底部?的更多相关文章

  1. ruby-on-rails - 使用 javascript 更改数据方法不会更改 ajax 调用用户的什么方法? - 2

    我遇到了一个非常奇怪的问题,我很难解决。在我看来,我有一个与data-remote="true"和data-method="delete"的链接。当我单击该链接时,我可以看到对我的Rails服务器的DELETE请求。返回的JS代码会更改此链接的属性,其中包括href和data-method。再次单击此链接后,我的服务器收到了对新href的请求,但使用的是旧的data-method,即使我已将其从DELETE到POST(它仍然发送一个DELETE请求)。但是,如果我刷新页面,HTML与"new"HTML相同(随返回的JS发生变化),但它实际上发送了正确的请求类型。这就是这个问题令我困惑的

  2. ruby - Ruby 中的 `&:capitalize` 到底是什么? - 2

    我刚读了这个答案Convertingupper-casestringintotitle-caseusingRuby.有如下一行代码"abc".split(/(\W)/).map(&:capitalize).join&:capitalize到底是什么?在我自己将它放入irb之前,我会告诉你,它不是有效的ruby​​语法。它必须是某种Proc对象,因为Array#map通常需要一个block。但事实并非如此。如果我单独将它放入irb,我会得到syntaxerror,unexpectedtAMPER。 最佳答案 foo(&a_proc_o

  3. ruby - 在 Mechanize 中使用 JavaScript 单击链接 - 2

    我有这个:AccountSummary我想单击该链接,但在使用link_to时出现错误。我试过:bot.click(page.link_with(:href=>/menu_home/))bot.click(page.link_with(:class=>'top_level_active'))bot.click(page.link_with(:href=>/AccountSummary/))我得到的错误是:NoMethodError:nil:NilClass的未定义方法“[]” 最佳答案 那是一个javascript链接。Mechan

  4. (附源码)vue3.0+.NET6实现聊天室(实时聊天SignalR) - 2

    参考文章搭建文章gitte源码在线体验可以注册两个号来测试演示图:一.整体介绍  介绍SignalR一种通讯模型Hub(中心模型,或者叫集线器模型),调用这个模型写好的方法,去发送消息。  内容有:    ①:Hub模型的方法介绍    ②:服务器端代码介绍    ③:前端vue3安装并调用后端方法    ④:聊天室样例整体流程:1、进入网站->调用连接SignalR的方法2、与好友发送消息->调用SignalR的自定义方法 前端通过,signalR内置方法.invoke()  去请求接口3、监听接受方法(渲染消息)通过new signalR.HubConnectionBuilder().on

  5. 智能客服 | 浅谈人工智能聊天机器人ChatGPT - 2

    2022年底,OpenAI的预训练模型ChatGPT给人工智能领域的爱好者和研究人员留下了深刻的印象和启发,他展现的惊人能力将人工智能的研究和应用热度推向高潮,网上也充斥着和ChatGPT的各种聊天,他可以作诗、写小说、写代码、讨论疫情问题等。下面就是一些他的神回复:人命关天的坑: 写歌,留给词作者的机会不多了。。。 回答人类怎么样面对人工智能: 什么是ChatGPT?借用网上的一段介绍,ChatGPT是由人工智能研究实验室OpenAI在2022年11月30日发布的全新聊天机器人模型,一款人工智能技术驱动的自然语言处理工具。它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动

  6. javascript - jQuery 的 jquery-1.10.2.min.map 正在触发 404(未找到) - 2

    我看到有关未找到文件min.map的错误消息:GETjQuery'sjquery-1.10.2.min.mapistriggeringa404(NotFound)截图这是从哪里来的? 最佳答案 如果ChromeDevTools报告.map文件的404(可能是jquery-1.10.2.min.map、jquery.min.map或jquery-2.0.3.min.map,但任何事情都可能发生)首先要知道的是,这仅在使用DevTools时才会请求。您的用户不会遇到此404。现在您可以修复此问题或禁用sourcemap功能。修复:获取文

  7. ruby-on-rails - 我将 Rails3 与 tinymce 一起使用。如何呈现用户关闭浏览器javascript然后输入xss? - 2

    我有一个用Rails3编写的站点。我的帖子模型有一个名为“内容”的文本列。在帖子面板中,html表单使用tinymce将“content”列设置为textarea字段。在首页,因为使用了tinymce,post.html.erb的代码需要用这样的原始方法来实现。.好的,现在如果我关闭浏览器javascript,这个文本区域可以在没有tinymce的情况下输入,也许用户会输入任何xss,比如alert('xss');.我的前台会显示那个警告框。我尝试sanitize(@post.content)在posts_controller中,但sanitize方法将相互过滤tinymce样式。例如

  8. ruby - 使用 Ruby 构建聊天应用程序 - 2

    我正在尝试构建一个纯粹使用Ruby的聊天应用程序。有一个similarquestion较早发布,但我有不同的相关查询。我看过thisexample(与之前发布类似问题的人所提到的相同)。示例中的代码似乎对我不起作用。在终端上运行ruby​​脚本,并连接到url:http://localhost:1234在我的浏览器中,我无限期地遇到“正在从本地主机传输数据...”消息。此处的1234是所提供示例中使用的端口号。我无法弄清楚我运行失败的原因是什么。可能是我需要在执行脚本时在命令行中指定一些东西,或者我应该通过其他地方(可能是浏览器)开始聊天(输入输出)。我无法弄清楚到底该做什么。你能帮我

  9. ruby - 使用 Selenium WebDriver 启用/禁用 javascript - 2

    出于某种原因,我必须为Firefox禁用javascript(手动,我们按照提到的步骤执行http://support.mozilla.org/en-US/kb/javascript-settings-for-interactive-web-pages#w_enabling-and-disabling-javascript)。使用Ruby的SeleniumWebDriver如何实现这一点? 最佳答案 是的,这是可能的。而是另一种方式。您首先需要查看链接Selenium::WebDriver::Firefox::Profile#[]=

  10. ruby - Watir-Webdriver 是否支持点击目标为 javascript 的链接? - 2

    我是Ruby和Watir-Webdriver的新手。我有一套用VBScript编写的站点自动化程序,我想将其转换为Ruby/Watir,因为我现在必须支持Firefox。我发现我真的很喜欢Ruby,而且我正在研究Watir,但我已经花了一周时间试图让Webdriver显示我的登录屏幕。该站点以带有“我同意”区域的“警告屏幕”开头。用户点击我同意并显示登录屏幕。我需要单击该区域以显示登录屏幕(这是同一页面,实际上是一个表单,只是隐藏了)。我整天都在用VBScript这样做:objExplorer.Document.GetElementsByTagName("area")(0).click

随机推荐