如何实现聊天窗口输入,最新文本置于最下方?

一、原理利用 MutationObserver 对象对元素的监听能力

MutationObserver 接口提供了监视对 DOM 树所做更改的能力。
MDN参考文档:https://developer.mozilla.org/zh-CN/docs/Web/API/MutationObserver

二、具体实现

1 创建一个MutationObserver 对象,并传入一个回调函数。

// 创建一个观察器实例并传入回调函数
const observer = new MutationObserver(callback);

2 对创建的观察器实例进行元素的绑定、同时设置需要监听哪些属性。

// 选择需要观察变动的节点
const targetNode = document.getElementById("some-id");

// 观察器的配置(需要观察什么变动)
const config = { attributes: true, childList: true, subtree: true };

observer.observe(targetNode, config);

3 关键的 callback 函数,这里在监听到(比如该元素增加了子元素之后)触发后,如何处理滚动条

// 当观察到变动时执行的回调函数
const callback = (mutationsList, observer) => {
     mutationsList[0].target.scrollTop = mutationsList[0].target.scrollHeight;
};
## 关于 callback 的 mutationsList 对象常用属性
1.type:表示变化的类型,可以是 "attributes"(属性变化)、"characterData"(文本内容变化)或 "childList"(子节点变化)。
2.target:表示发生变化的节点,返回一个 DOM 元素对象。
3.addedNodes:在子节点变化时,表示添加的新节点的集合(NodeList)。
4.removedNodes:在子节点变化时,表示被移除的节点的集合(NodeList)。
5.attributeName:在属性变化时,表示发生变化的属性名称。
6.oldValue:在属性或文本内容变化时,表示变化前的属性值或文本内容。
7.previousSibling:在子节点变化时,表示发生变化的节点的前一个兄弟节点。
8.nextSibling:在子节点变化时,表示发生变化的节点的后一个兄弟节点。

mutationsList.forEach((mutation) => {
    console.log('变化类型:', mutation.type);
    console.log('发生变化的节点:', mutation.target);
    console.log('添加的新节点:', mutation.addedNodes);
    console.log('被移除的节点:', mutation.removedNodes);
    console.log('发生变化的属性名称:', mutation.attributeName);
    console.log('变化前的属性值/文本内容:', mutation.oldValue);
    console.log('前一个兄弟节点:', mutation.previousSibling);
    console.log('后一个兄弟节点:', mutation.nextSibling);
    // 进行其他处理...
  });

4 组件卸载之后,需要清除观察器。

// 停止观察
observer.disconnect();

创建一个 MutationObserver 对象,并将一个回调函数作为参数传递给构造函数。回调函数将在 DOM 变化时被调用。

回调函数通过修改目标元素的 scrollTop 属性,将滚动条位置设置为滚动内容的高度,实现将对话框滚动到底部的效果。

使用 observer.observe() 方法将 dom 元素作为观察目标,并通过传递一个配置对象来指定需要观察的变化类型。其中,childList: true 表示监听子节点的添加或删除操作。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
汇编语言实现文本输入窗口的具体步骤如下: 1. 设置窗口的位置和大小,以及背景颜色。 2. 初始化文本输入框,包括文本输入框的位置、大小、边框样式等。 3. 接收用户输入的字符,并在文本输入框中显示出来。可以使用 BIOS 中的 16 位中断函数来实现键盘输入的检测。 4. 处理用户输入的特殊字符,例如回车键、退格键等。 5. 将用户输入的字符串传递给程序的其他部分进行处理。 下面是一个简单的汇编语言实现文本输入窗口的示例代码: ``` ; 定义窗口位置和大小 input_window_x db 50 input_window_y db 50 input_window_width db 100 input_window_height db 30 ; 定义窗口背景颜色 input_window_color db 0x0F ; 初始化文本输入框 init_textbox: ; 设置文本输入框位置和大小 mov ah, 0x10 mov al, 0x02 mov bh, 0x00 mov bl, input_window_color mov dh, input_window_height mov dl, input_window_width mov ch, input_window_y mov cl, input_window_x int 0x10 ; 显示光标 mov ah, 0x01 mov cx, 0x0607 int 0x10 ret ; 接收用户输入的字符 get_input: ; 检测键盘输入 mov ah, 0x00 int 0x16 ; 判断是否为特殊字符 cmp ah, 0x0E je backspace cmp ah, 0x0D je enter jmp display_char ; 处理退格键 backspace: ; 获取光标位置 mov ah, 0x03 int 0x10 ; 判断是否到达文本框边缘 cmp dl, input_window_x je end_backspace ; 删除上一个字符 dec dl mov ah, 0x0E mov al, 0x20 mov bh, 0x00 mov bl, input_window_color int 0x10 mov ah, 0x03 int 0x10 jmp end_backspace ; 处理回车键 enter: ; 将用户输入的字符串传递给程序的其他部分进行处理 ; ... ; 清空文本输入框 mov ah, 0x0E mov al, 0x0D mov bh, 0x00 mov bl, input_window_color int 0x10 mov ah, 0x0E mov al, 0x0A mov bh, 0x00 mov bl, input_window_color int 0x10 mov ah, 0x0E mov al, 0x20 mov bh, 0x00 mov bl, input_window_color int 0x10 mov ah, 0x02 mov dl, input_window_width mov dh, input_window_height mov cl, input_window_x mov ch, input_window_y int 0x10 mov ah, 0x01 mov cx, 0x0607 int 0x10 ret ; 显示字符 display_char: ; 判断是否到达文本框边缘 mov bh, 0x00 mov bl, input_window_color mov ah, 0x03 int 0x10 cmp dl, input_window_x + input_window_width je end_display_char ; 显示字符 mov ah, 0x0E mov bh, 0x00 mov bl, input_window_color int 0x10 jmp end_display_char end_backspace: jmp get_input end_display_char: mov ah, 0x02 mov dl, 0x20 mov dh, 0x01 mov cl, dl mov ch, dh int 0x10 jmp get_input ``` 这段代码实现了一个简单的文本输入窗口,用户可以在窗口输入文本,并且可以使用回车键和退格键进行操作。请注意,这只是一个简单的示例,实际实现中可能需要更多的功能和细节处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值