前端培训-初级阶段-场景实战(2019-05-09)-聊天框-发送框

简介: 前端最基础的就是 HTML+CSS+Javascript。掌握了这三门技术就算入门,但也仅仅是入门,现在前端开发的定义已经远远不止这些。前端小课堂(HTML/CSS/JS),本着提升技术水平,打牢基础知识的中心思想,我们开课啦(每周四)。初级阶段已经完结,之后会针对之前提到过的内容,对实际场景进行分享。正好前段时间我不是一直在加班做聊天的功能嘛。今天我们就来说一说其中遇到的东西。

我们要讲什么?


聊天功能中的发送框的实现及一些常规操作的实现。


  1. contentEditable


  1. Node 与 Element


  1. 插入功能(表情、截图等等)


  1. 粘贴功能


  1. 拖入功能


测试地址-测试下面的特性


关键词 文字 换行 图片
input × ×
textarea ×
contentEditable


contentEditable


你会说这东西我知道,给元素加上就可以编辑内容。老铁,这么简单当然不行了。


  1. 当你按下Enter/Return键在可编辑区域中创建一个新的文本行时,不同主流浏览器对此有不同处理(Firefox 插入
    、IE/Opera将使用<p>、 Chrome/Safari 将使用 <div>)


  1. css 也可以支持同样的功能-webkit-user-modify,值有
  1. inherit(继承);
  2. initial(默认);
  3. read-only(只读);
  4. read-write(读写);
  5. read-write-plaintext-only(读写、非富文本);
  6. unset(未设置);当一个属性定义了unset值,如果该属性是默认继承属性,该值等同于inherit,如果该属性是非继承属性,该值等同于initial


  1. 同上 contentEditable 属性支持的也不是逻辑值。plaintext-only 就是其中最亮的仔。
    最早还是在张鑫旭大佬-小tip: 如何让contenteditable元素只能输入纯文本哪里看的到的


当然我们用的还是富文本的样式。因为我们里面需要表情


Node 与 Element


Node


Node 是一个接口,许多 DOM API 对象的类型会从这个接口继承。它允许我们使用相似的方式对待这些不同类型的对象;比如, 继承同一组方法,或者用同样的方式测试。以下接口都从 Node 继承其方法和属性:

Document, Element, Attr, CharacterData (which Text, Comment, and CDATASection inherit), ProcessingInstruction, DocumentFragment, DocumentType, Notation, Entity, EntityReference----------------- https://developer.mozilla.org...

  1. Node.nodeName

返回一个包含该节点名字的DOMString。节点的名字的结构和节点类型不同。
HTMLElement 的名字跟它所关联的标签对应,比如 HTMLAudioElement 对应的是 'audio'
Text 节点对应 '#text'
Document 节点对应 '#document'


  1. Node.nodeType


Name Value status
ELEMENT_NODE 1
ATTRIBUTE_NODE 2 warn
TEXT_NODE 3
CDATA_SECTION_NODE 4
ENTITY_REFERENCE_NODE 5 warn
ENTITY_NODE 6 warn
PROCESSING_INSTRUCTION_NODE 7
COMMENT_NODE 8
DOCUMENT_NODE 9
DOCUMENT_TYPE_NODE 10
DOCUMENT_FRAGMENT_NODE 11
NOTATION_NODE 12 warn


上面两个属于比较重要的


Element


Element是非常通用的基类,所有 Document对象下的对象都继承它. 这个接口描述了所有相同种类的元素所普遍具有的方法和属性。 这些继承自Element并且增加了一些额外功能的接口描述了具体的行为. 例如, HTMLElement 接口是所有HTML元素的基础接口, 而 SVGElement 接口是所有SVG元素的基本接口.大多数功能在类的层次中进一步制定.在web以外的语言,像 XUL 可以通过 XULElement 接口, 同样也实现了Element接口.

Node 与 Element 差别


Node 中是会包含文本节点的。比如Text。

而 Element 包含的都是标签节点。


插入功能


如果换成 DOM 操作,好像功能还蛮简单的 appendChildinsertBeforereplaceChild好像就基本可以搞定了。但是换到富文本中呢?我们需要解决几个问题


  1. 获取当前焦点位置


  1. 在文本内容中插入内容


  1. 在节点内容中插入内容


  1. 其实还有一点,插入的时候会单击其他位置,导致焦点丢失,所以我们需要记住,然后设置到指定位置。


获取当前的焦点位置


window.getSelection();这个可以用来获取焦点位置。


anchorNode 指向用户开始选择(按下鼠标键)的地方,而 focusNode 指向用户结束选择(松开鼠标键)的地方。


注意不能与选区的起始位置和终止位置混淆,因为开始选择的位置可能在结束选择位置的前面,也可能在结束选择位置的后面,这取于选择文本时鼠标移动的方向(也就是按下鼠标键和松开鼠标键的位置)。


isCollapsed 布尔值,用于判断选区的起始点和终点是否在同一个位置。


//可以用这段代码来观察
setInterval(()=>{
    var selection=window.getSelection();
    console.log(selection)
},1000)

bVbsxIO.webp.jpg


文本内容中插入内容


从上面的内容中,我们可以看到,在文本中是一个 Node 节点,那我应该如何插入节点呢?这其实就是调用 insertData 这个api就好了。但是,怎么能如此简单呢?我们插入的是 DOM 而不是简单的文本,所以这个操作不能用。


bVbsxI9.webp.jpg


这里我们要用的其实是splitText,用于在焦点处分割开内容。然后再after增加内容。

bVbsxJX.webp.jpg

bVbsxKk.webp.jpg


在节点中插入内容


这个就比较简单了。节点的话,直接加入进去就好了。因为节点不存在说中间插入。但是呢,当你在节点之后的时候,你需要获取其中所有的 nodes 然后根据 offset找到点。childNodeschildren 该使用那个呢?这个就涉及到上面说到的 NodeElement 的区别,留个小作业,自己试一下吧。友情提示,报错的时候记得看是不是 anchorNodeText 节点。


bVbsxOr.webp.jpg


记录焦点位置&整合应用


既然点击会失去焦点,那么我们在blur的时候记录。然后给显示回去就OK了。

测试地址,其实还有一个效果没处理,那就是选区处理。可以当做一个课后作业。


粘贴功能


这个功能很坑,因为还是富文本。所以粘贴进来的是有样式的。但是我们不需要样式,所以我们要过滤掉所有的标签。但是又因为我们可以复制粘贴图片。所以我们需要过滤出来我们的图片。


方案有两种

  1. 获取文本,图片会变成alt属性标识的值(我用的是这个)


  1. 获取HTML,需要自己去过滤处理。


粘贴进来的内容,我们需要处理 paste 事件。 e.clipboardData 是获取剪贴板对象。提供了 getData 来获取剪贴板内容。比如 getData('text'); 获取文字内容。getData('text/html'); 获取html格式内容。


tips:

  1. 可以复制单图片。会在粘贴板中 files 里面。


  1. 不可以执行 setData 方法,看上去是浏览器厂商出于安全方向考虑。所以不能直接人为替换剪贴板内容达到目的。那么我们要注意 e.preventDefault();,用来阻止默认的事件。


拖拽功能


这个功能没实现,感觉上很难,达不到原生的那种感觉,也有可能是我api没找到,希望会的人告我一下。


说一下我能给出的方案,因为不能 setData 所以方案还是考虑阻止默认的


  1. 分开处理,内部拖拽使用系统操作。外部拖拽禁止。


  1. 都使用自己的处理但是拿不到焦点,针对这个问题,可以做到增加提示,然后追加。


  1. 拖拽的话,可以有文件级别的。判断如果是文本文件之类的,可以读取文件内容。


后记


主讲人文章-浏览器科普

感谢评论区的回复, document.execCommand --MDN 的支持用起来的确会少控制一些逻辑。

相关文章
|
6月前
|
前端开发 JavaScript 索引
前端性能优化:虚拟滚动技术原理与实战
前端性能优化:虚拟滚动技术原理与实战
794 80
|
7月前
|
存储 消息中间件 前端开发
PHP后端与uni-app前端协同的校园圈子系统:校园社交场景的跨端开发实践
校园圈子系统校园论坛小程序采用uni-app前端框架,支持多端运行,结合PHP后端(如ThinkPHP/Laravel),实现用户认证、社交关系管理、动态发布与实时聊天功能。前端通过组件化开发和uni.request与后端交互,后端提供RESTful API处理业务逻辑并存储数据于MySQL。同时引入Redis缓存热点数据,RabbitMQ处理异步任务,优化系统性能。核心功能包括JWT身份验证、好友系统、WebSocket实时聊天及活动管理,确保高效稳定的用户体验。
434 4
PHP后端与uni-app前端协同的校园圈子系统:校园社交场景的跨端开发实践
|
10月前
|
安全 前端开发 开发工具
【01】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-项目开发实战-优雅草卓伊凡拟开发一个一站式家政服务平台-前期筹备-暂定取名斑马家政软件系统-本项目前端开源-服务端采用优雅草蜻蜓Z系统-搭配ruoyi框架admin后台-全过程实战项目分享-从零开发到上线
【01】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-项目开发实战-优雅草卓伊凡拟开发一个一站式家政服务平台-前期筹备-暂定取名斑马家政软件系统-本项目前端开源-服务端采用优雅草蜻蜓Z系统-搭配ruoyi框架admin后台-全过程实战项目分享-从零开发到上线
483 5
【01】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-项目开发实战-优雅草卓伊凡拟开发一个一站式家政服务平台-前期筹备-暂定取名斑马家政软件系统-本项目前端开源-服务端采用优雅草蜻蜓Z系统-搭配ruoyi框架admin后台-全过程实战项目分享-从零开发到上线
|
11月前
|
前端开发 API
通义灵码企业级检索增强-前端自研场景采纳率提升DEMO
通义灵码企业级检索增强DEMO展示了通过对话方式检索企业内部知识的能力,特别是在前端自研场景中。例如,上传标准化组件库后,系统能准确推荐trace ID等组件的规范写法,显著提升采纳率8个百分点,效果明显。
174 2
|
存储 前端开发 JavaScript
前端状态管理:Vuex 核心概念与实战
Vuex 是 Vue.js 应用程序的状态管理模式和库。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。本教程将深入讲解 Vuex 的核心概念,如 State、Getter、Mutation 和 Action,并通过实战案例帮助开发者掌握在项目中有效使用 Vuex 的技巧。
|
Web App开发 缓存 监控
前端性能优化实战:从代码到部署的全面策略
前端性能优化实战:从代码到部署的全面策略
266 1
|
Web App开发 前端开发 JavaScript
前端性能优化实战:从代码到部署的全面指南
前端性能优化实战:从代码到部署的全面指南
284 1
|
缓存 监控 前端开发
前端性能优化实战:从加载速度到用户体验
前端性能优化实战:从加载速度到用户体验
|
存储 人工智能 前端开发
前端大模型应用笔记(三):Vue3+Antdv+transformers+本地模型实现浏览器端侧增强搜索
本文介绍了一个纯前端实现的增强列表搜索应用,通过使用Transformer模型,实现了更智能的搜索功能,如使用“番茄”可以搜索到“西红柿”。项目基于Vue3和Ant Design Vue,使用了Xenova的bge-base-zh-v1.5模型。文章详细介绍了从环境搭建、数据准备到具体实现的全过程,并展示了实际效果和待改进点。
1031 14
|
JavaScript 前端开发 程序员
前端学习笔记——node.js
前端学习笔记——node.js
337 0

热门文章

最新文章

  • 1
    前端如何存储数据:Cookie、LocalStorage 与 SessionStorage 全面解析
  • 2
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(五):背景属性;float浮动和position定位;详细分析相对、绝对、固定三种定位方式;使用浮动并清除浮动副作用
  • 3
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(六):全方面分析css的Flex布局,从纵、横两个坐标开始进行居中、两端等元素分布模式;刨析元素间隔、排序模式等
  • 4
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(一):CSS发展史;CSS样式表的引入;CSS选择器使用,附带案例介绍
  • 5
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(八):学习transition过渡属性;本文学习property模拟、duration过渡时间指定、delay时间延迟 等多个参数
  • 6
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(九):强势分析Animation动画各类参数;从播放时间、播放方式、播放次数、播放方向、播放状态等多个方面,完全了解CSS3 Animation
  • 7
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(二):CSS伪类:UI伪类、结构化伪类;通过伪类获得子元素的第n个元素;创建一个伪元素展示在页面中;获得最后一个元素;处理聚焦元素的样式
  • 8
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(四):元素盒子模型;详细分析边框属性、盒子外边距
  • 9
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(七):学习ransform属性;本文学习 rotate旋转、scale缩放、skew扭曲、tanslate移动、matrix矩阵 多个参数
  • 10
    【面试题】20个常见的前端算法题,你全都会吗?
  • 1
    前端如何存储数据:Cookie、LocalStorage 与 SessionStorage 全面解析
    521
  • 2
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(九):强势分析Animation动画各类参数;从播放时间、播放方式、播放次数、播放方向、播放状态等多个方面,完全了解CSS3 Animation
    195
  • 3
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(八):学习transition过渡属性;本文学习property模拟、duration过渡时间指定、delay时间延迟 等多个参数
    192
  • 4
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(七):学习ransform属性;本文学习 rotate旋转、scale缩放、skew扭曲、tanslate移动、matrix矩阵 多个参数
    147
  • 5
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(六):全方面分析css的Flex布局,从纵、横两个坐标开始进行居中、两端等元素分布模式;刨析元素间隔、排序模式等
    252
  • 6
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(五):背景属性;float浮动和position定位;详细分析相对、绝对、固定三种定位方式;使用浮动并清除浮动副作用
    365
  • 7
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(四):元素盒子模型;详细分析边框属性、盒子外边距
    160
  • 8
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(三):元素继承关系、层叠样式规则、字体属性、文本属性;针对字体和文本作样式修改
    96
  • 9
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(二):CSS伪类:UI伪类、结构化伪类;通过伪类获得子元素的第n个元素;创建一个伪元素展示在页面中;获得最后一个元素;处理聚焦元素的样式
    162
  • 10
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(一):CSS发展史;CSS样式表的引入;CSS选择器使用,附带案例介绍
    228