添加新消息时滚动到底部

2024-01-06

我正在制作一个聊天机器人。当用户给出新输入或通过 API 发送数据时,我想滚动到聊天框的底部。

它不滚动,滚动只是停留在同一位置,但数据正在添加到聊天框中

我已经尝试过其他聊天机器人的代码,但它也不起作用

var outputArea = $('#chat-output');
$('#user-input-form').on('submit', function (e) {
  e.preventDefault();

  var message = $('#user-input').val();

  outputArea.append(`
    <div class='bot-message'>
      <div class='message'>
        ${message}
      </div>
    </div>
  `);



  const req = https.request(options, (res) => {
    res.setEncoding('utf8');
    res.on('data', (d) => {
      const myobj = JSON.parse(d);
      if ('narrative' in myobj.conversationalResponse.responses[0]) {
        const temp = myobj.conversationalResponse.responses[0].narrative.text;
        outputArea.append(`
      <div class='user-message'>
        <div class='message'>
          ${temp}
        </div>
      </div>
    `);
      } else if ('imageUrl' in myobj.conversationalResponse.responses[0]) {
        const img = myobj.conversationalResponse.responses[0].imageUrl;
        if ('narrative' in myobj.conversationalResponse.responses[1]) {
          const text_r = myobj.conversationalResponse.responses[1].narrative.text;
          outputArea.append(`
      <div class='user-message'>
      <div class ="message">
      ${text_r}
      <a href=""></a>
      </div>
      </div>
    `);
        } else {
          outputArea.append(`
      <div class='user-message'>
        <div class='message'>
         <img src="" width="300" height="200">
        </div>
      </div>
    `);
        }
      }
    });
  });

  req.on('error', (error) => {
    console.error(error);
  });

  req.write(data);
  req.end();

  $('#user-input').val('');
.form-container {
  width: 400px;
  height: 450px;
  padding: 10px;
  background-color: white;
  overflow: scroll;
  position: relative;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="chat-popup" id="myForm">
<div class="form-container">

  <div class="chat-output" id="chat-output">
    <div class="user-message">
      <div class="message">Hi! I'm Bot, what's up?</div>
    </div>
  </div>
  <div class="chat-input">
    <form action="#0" id="user-input-form" autocomplete="off">
      <input type="text" id="user-input" class="user-input" placeholder="Talk to the bot.">
    </form>
  </div>
  </br></br>
  <button type="button" class="btn cancel" onclick="closeForm()">Close</button>
</div>
</div>

另一个有趣的方法是使用纯 CSS,使用flex-direction方法,它通过为内容创建一个包装器来工作inside滚动元素。

我在下面制作了一个快速演示(带有一个按钮和一些用于添加新项目的 JavaScript)。您还可以查看这个单独的演示页面 https://code.hnldesign.nl/scrolltobottom/.

诀窍在于使用反转内容方向column-reverse在滚动条中。由于物品位于另一个容器中,因此它们不会“翻转”,而是始终排列在底部。事实上,每当添加内容时,这都会使滚动条滚动到底部。

额外的好处:保持滚动位置(主要是*)

另外,这是我非常喜欢这个方法的一点;每当用户开始滚动(向上)时,添加内容时滚动条不会丢失其滚动位置。因此,如果它已经滚动(默认情况下或由用户)到底部,它只会“粘”到底部。这可确保不会出现烦人的内容跳跃,从而提供更好的用户体验。

* 大多数情况下,因为只有 iOS Safari 不支持overflow-anchor,因此无论用户滚动位置如何,它都会始终滚动容器。看https://developer.mozilla.org/en-US/docs/Web/CSS/overflow-anchor#browser_compatibility https://developer.mozilla.org/en-US/docs/Web/CSS/overflow-anchor#browser_compatibility

Demo

let scrollerContent = document.getElementById('scrollerContent');

document.getElementById('addItems').addEventListener('click', function() {
  let newChild = scrollerContent.lastElementChild.cloneNode(true);
  newChild.innerHTML = "Item " + (scrollerContent.children.length + 1);
  scrollerContent.appendChild(newChild);
});
.scroller {
    overflow: auto;
    height: 100px;
    display: flex;
    flex-direction: column-reverse;
    overflow-anchor: auto !important; /*  See https://developer.mozilla.org/en-US/docs/Web/CSS/overflow-anchor */
}

.scroller .scroller-content .item {
    height: 20px;
    transform: translateZ(0); /* fixes a bug in Safari iOS where the scroller doesn't update */
}
<div class="scroller">
  <div class="scroller-content" id="scrollerContent">
    <div class="item">Item 1</div>
    <div class="item">Item 2</div>
    <div class="item">Item 3</div>
    <div class="item">Item 4</div>
    <div class="item">Item 5</div>
    <div class="item">Item 6</div>
    <div class="item">Item 7</div>
    <div class="item">Item 8</div>
    <div class="item">Item 9</div>
    <div class="item">Item 10</div>
  </div>
</div>
<br/><br/>
<button id="addItems">Add more items</button>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

添加新消息时滚动到底部 的相关文章

  • 如何获取数组中最后 5 个元素(不包括第一个元素)?

    在 JavaScript 数组中 如何获取最后 5 个元素 排除第一个元素 1 55 77 88 would return 55 77 88 添加其他示例 1 55 77 88 99 22 33 44 would return 88 99
  • 如何向尚未添加到页面的元素注册 Javascript 事件处理程序

    我正在尝试构建一个greasemonkey 脚本 它将根据用户与其他动态创建的数据表的交互动态创建数据表 我的问题是 每次创建表时 我都必须进行两次传递 一次用于创建表 另一次用于获取表中我想要添加事件处理程序的所有对象 通过 id 并添加
  • 当我“显示:无”一个 SVG 时,另一个(独立的)SVG 会以不同的方式呈现

    我已经伤透了几个小时了 这没有任何意义 我将遇到的问题减少到这个codepen https codepen io Octopous pen OJORpJQ https codepen io Octopous pen OJORpJQ HTML
  • 如何使用 CSS 将 div 置于表格中心?

    我正在尝试向我的网站之一添加幻灯片 整个页面布局在一个 HTML 表格中 我非常讨厌它并且没有选择 我想将我的幻灯片放在该特定列的中心 我的 CSS 如下所示 slideshow position relative slideshow IM
  • Django 1.6 的静态文件

    我花了一整天但没有任何作用 我在这里看到了至少 20 篇关于同一主题的帖子 它们各不相同 有不同的建议 但没有一个对我有用 使用 Python 2 7 运行 Django 1 6 我正在尝试从 django 教程加载民意调查应用程序的 cs
  • Angular-Datatables + Angular-xeditable:取消可编辑行

    当组合 Angular DataTables 和 Angular XEditable 时 添加新行时会取消可编辑行 这是jsfiddle https jsfiddle net faj61h5d 10 示例操作如下 1 这是初始状态 2 将第
  • 如何在参数上使用 .reduce() 而不是特定的数组或对象?

    我想定义一个函数 flatten 将多个元素展平为一个数组 我知道以下是不可能的 但本质上我想这样做 var flatten function var flattened arguments reduce function acc elem
  • 有没有办法在 TypeScript 2+ 中全局添加类型定义?

    我有一堆简单的 ts files 不是项目 即独立的 ts 脚本 他们使用一些 Node js 功能 TypeScript 和节点类型定义通过安装 npm install g typescript npm install g types n
  • 正则表达式 - 避免表达式中出现字符串

    我正在尝试创建一个应该匹配以下情况的正则表达式 如果单词完全匹配 first second third 那么匹配应该失败 但如果它周围有任何字符 那么应该匹配该字符串 我还需要避免字符串中的某些字符集 如果这些字符是字符串的一部分 则匹配结
  • 如何使用 PHP 从 MySQL 查询中按升序对值进行排序?

    我使用以下 PHP 脚本从 MySQL 表中获取和更改数据 并将结果打印在 HTML 表中 我希望按升序对数据进行排序 utilization percentage变量 它是由创建的 total client time total avai
  • 在IOS中,引导模式中的iframe无法滚动

    我在引导程序模态体内有一个 iframe div class modal fade div class modal dialog div class modal content div class modal header div div
  • 如何为 ng-repeat orderBy 创建回调?

    寻找一种方法让 AngularJS 的 ng repeat orderBy 过滤器在完成渲染后执行回调 Markup div table thead tr th Name th th Age th tr thead tbody tr tr
  • while 循环元素状态 cypress

    我有一个问题 我想单击一个按钮直到它消失 但次数可能会有所不同 所以我想检查可见性状态 当可见 true时单击按钮 当可见 false时结束测试 但问题是我不知道如何循环从获取元素到末尾的所有链 单击按钮一次 由于中断而停止 如果我删除中断
  • Tween JS 基础知识之三个 JS 立方体

    我是 Tween JS 的新手 尝试使用 Tween 制作一个向右移动的简单动画 下面是我在 init 函数中的代码 我使用的是三个 JS var geometry new THREE CylinderGeometry 200 200 20
  • 如果在 HTML 标记中使用自定义属性会发生什么?

    这个问题与以下内容无关jQuery本身 但我发现了一个名为Metadata found there http docs jquery com Plugins Metadata metadata其中一个示例使用自定义标签属性 li li 问
  • 如何在 jQuery 中检查复选框是否被选中?

    我需要检查checked复选框的属性 并使用 jQuery 根据选中的属性执行操作 例如 如果age复选框被选中 然后我需要显示一个文本框来输入age 否则隐藏文本框 但下面的代码返回false默认情况下 if isAgeSelected
  • Javascript / jQuery - 转换特殊 html 字符

    我有一个pre元素中包含一些 html 代码 该代码中有特殊字符 例如 lt 所以它不会破坏页面 然后我有一个 javascript 函数 它获取此 pre 元素的内容 突出显示它 使用 codemirror 并用突出显示的文本替换元素内容
  • html 表格顶部对齐?

    我怎样才能让图像和内容向右顶部对齐 如你所见 我尝试了 valign top table border 0 cellspacing 0 cellpadding 0 tbody tr valign top td valign top img
  • 按钮轮廓大于按钮尺寸

    我试图制作一个带有 3 个点的按钮 虽然它带来了奇怪的问题 当你点击它时 你会注意到在焦点模式下有一座奇怪的 山 button letter spacing 2px padding top 4em padding bottom 8em li
  • 使用 stopPropagation() 处理 React 事件委托

    我有一个 React 项目 应该可以放置在任何网站上 我的想法是 我托管一个 javascript 文件 人们放置一个具有特定 ID 的 div 然后 React 在该 div 中进行渲染 到目前为止 除了点击事件之外 这是有效的 这些事件

随机推荐

  • 如何使用redirect_to向url添加hash参数?

    如何使用redirect to向url添加hash参数 例如 http localhost products 页 2 http localhost products 7Bpage 2 最好的方法就是这样做 redirect to actio
  • 如何更好地可视化给定文本的单词关联?

    我特别想要的是根据文档中的出现方式将与文档中的名词相关的所有动词和形容词可视化 我在 Python 中找不到任何函数 所以我编写了自己的基本函数 如下所示 然而 可视化仍有一些不足之处 import nltk import pandas a
  • 宏不在 Visual Studio 2010 中运行

    宏位于Visual Studio 2010 http en wikipedia org wiki Microsoft Visual Studio Visual Studio 2010无法再启动 它们不会在宏 IDE 的第一行中命中断点 没有
  • 使用打字稿反应 useTable 钩子

    所以我有一个带有 js Table 的 JavaScript 类 在 Javascript 中它的使用如下 import useTable useFilters useAsyncDebounce useSortBy usePaginatio
  • RequireJS - 将参数传递到模块中进行初始化[重复]

    这个问题在这里已经有答案了 可能的重复 如何在使用 AMD 时在 Backbone js 中加载引导模型 require js https stackoverflow com questions 9916073 how to load bo
  • 具有外键和与同一模型的多对多关系的 Django 模型

    我有一个 django 模型如下 class Subscription models Model Transaction models ManyToManyField Transaction blank True null True Use
  • 使用 jquery 检测单击了哪个列表元素(列表是动态添加的)

    Case1 列表已经存在于 html 中 ul li One li li Two li ul 使用检测到单击的 li 元素 list1 li bind click function alert this html 上面工作正常 Case 2
  • 在C++中从JNI调用Java Jar代码

    我正在尝试模仿这个 http snuggletex sourceforge net maven xref uk ac ed ph snuggletex samples MinimalExample html http snuggletex
  • 为什么 cmath pow 给出的答案不准确?

    在 C 11 中 pow 1061 6 1426567426713180416 检查最后 3 位数字 我确信结果是错误的 因为 1061 6 1426567426713180361 但另一种方法做得对 long a 1 for int i
  • 如何在web.config转换过程中添加文件?

    我正在使用 Visual Studio 2012 开发一个网站 web config 当前在其转换中包含以下文件 web 调试 config web Release config 我最近在我的项目中添加了一个新的构建配置 名为 Stagin
  • 从字典中随机输入

    从 C 字典中获取随机条目的最佳方法是什么 我需要从字典中获取一些随机对象以显示在页面上 但是我无法使用以下内容 因为字典无法通过索引访问 Random rand new Random Dictionary lt string object
  • Magento Grid - 将平面表连接到 EAV 后排序和过滤工作不正确

    我有 2 个定制系列 具有平面数据的常见集合 我需要将他们加入到客户选择中 它与innerJoin 配合使用效果很好 但对连接字段进行过滤和排序不起作用 我该如何解决这个问题 prepareCollection 示例 collection
  • 如何在给定分支中查找文件

    我注意到 在进行代码查看时 我公司的人们通常只给出完成工作的分支 而没有其他任何信息 所以我想一定有一种简单的方法来找出给定分支中具有版本的所有文件 这与查找所有文件是一样的 这已经改变了 是的 我不知道在某个分支中查找文件的预期 简单方法
  • 简单&小,纯javascript灯箱(对话框覆盖)? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有谁知道一个用纯 JavaScript 构建的小型 功能有限的灯箱 这是针对可嵌入小部件的 因此不使用
  • 如何在 C/C++ 中将字符串从 UTF8 转换为 Latin1?

    我的问题很简单 但到目前为止我找不到解决方案 如何转换UTF8编码string到 latin1 编码string在 C 中不使用任何额外的库 如 libiconv 到目前为止我能找到的每个例子都是用于 latin1 到 UTF8 的转换 t
  • 在新的弹出窗口中打开标题位置?

    我想看看是否可以打开这样的标题位置 if GET id 99993 header Location page php 并让它在 jQuery 弹出窗口中打开 prettyPhoto 是一个在线 jQuery 弹出窗口 我正常的 a href
  • 如何从 Java 中的输入文本中删除标点符号?

    我正在尝试使用 Java 中用户的输入获取一个句子 我需要将其变为小写并删除所有标点符号 这是我的代码 String words instring split s for int i 0 i lt words length i words
  • Powershell - 检索内部异常以输出(socketException)

    我最近开始深入研究 Powershell 中的错误处理 我注意到一些我不太理解的东西 我不知道这种行为来自哪里 我有一个简单的函数 它使用以下命令检查域名 System Net DNS GetHostByName 如果这个变量传递给一个不存
  • 删除集合列表的重复项

    我有一个集合列表 L set 1 4 set 1 4 set 1 2 set 1 2 set 2 4 set 2 4 set 5 6 set 5 6 set 3 6 set 3 6 set 3 5 set 3 5 实际上在我的例子中是倒数元
  • 添加新消息时滚动到底部

    我正在制作一个聊天机器人 当用户给出新输入或通过 API 发送数据时 我想滚动到聊天框的底部 它不滚动 滚动只是停留在同一位置 但数据正在添加到聊天框中 我已经尝试过其他聊天机器人的代码 但它也不起作用 var outputArea cha