加入收藏 | 设为首页 | 会员中心 | 我要投稿 厦门网 (https://www.xiamenwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

Web聊天工具的富文本输入框

发布时间:2019-03-08 11:17:05 所属栏目:建站 来源:Jrain-前端玩具盆
导读:最近折腾 Websocket,打算开发一个聊天室应用练练手。在应用开发的过程中发现可以插入 emoji ,粘贴图片的富文本输入框其实蕴含着许多有趣的知识,于是便打算记录下来和大家分享。 仓库地址:chat-input-box 预览地址:https://codepen.io/jrainlau/p...

回到上一步的 paste.js 函数,把其中的 TODO() 改写成 chooseImg() 即可:

  1. const imgEvent = {  
  2.   target: {  
  3.     files: [pasteFile]  
  4.   }  
  5. }  
  6. chooseImg(imgEvent, (url) => {  
  7.   resolve(url)  
  8. }) 

回到浏览器,如果我们复制一张图片并在输入框中执行粘贴的动作,将可以在控制台看到打印出了以 data:image/png;base64 开头的图片地址。

输入框中插入内容

经过前面两个步骤,我们后已经可以读取剪贴板中的文本内容和图片内容了,接下来就是把它们正确的插入输入框的光标位置当中。

对于插入内容,我们可以直接通过 document.execCommand 方法进行。关于这个方法详细用法可以在MDN文档里面找到,在这里我们只需要使用 insertText 和 insertImage 即可。

  1. document.querySelector('.editor').addEventListener('paste', async (e) => {  
  2.     const result = await onPaste(e)  
  3.     const imgRegx = /^data:image/png;base64,/  
  4.     const command = imgRegx.test(result) ? 'insertImage': 'insertText'   
  5.     document.execCommand(command, false, result)  
  6. }) 

但是在某些版本的 Chrome 浏览器下,insertImage 方法可能会失效,这时候便可以采用另外一种方法,利用 Selection 来实现。而之后选择并插入 emoji 的操作也会用到它,因此不妨先来了解一下。

当我们在代码中调用 window.getSelection() 后会获得一个 Selection 对象。如果在页面中选中一些文字,然后在控制台执行 window.getSelection().toString(),就会看到输出是你所选择的那部分文字。

与这部分区域文字相对应的,是一个 range 对象,使用 window.getSelection().getRangeAt(0) 即可以访问它。range 不仅包含了选中区域文字的内容,还包括了区域的起点位置 startOffset 和终点位置 endOffset。

我们也可以通过 document.createRange() 的办法手动创建一个 range,往它里面写入内容并展示在输入框中。

对于插入图片来说,要先从 window.getSelection() 获取 range ,然后往里面插入图片。

  1. document.querySelector('.editor').addEventListener('paste', async (e) => {  
  2.   // 读取剪贴板的内容  
  3.   const result = await onPaste(e)  
  4.   const imgRegx = /^data:image/png;base64,/  
  5.   // 如果是图片格式(base64),则通过构造range的办法把<img>标签插入正确的位置  
  6.   // 如果是文本格式,则通过document.execCommand('insertText')方法把文本插入  
  7.   if (imgRegx.test(result)) {  
  8.     const sel = window.getSelection()  
  9.     if (sel && sel.rangeCount === 1 && sel.isCollapsed) {  
  10.       const range = sel.getRangeAt(0)  
  11.       const img = new Image()  
  12.       img.src = result  
  13.       range.insertNode(img)  
  14.       range.collapse(false)  
  15.       sel.removeAllRanges()  
  16.       sel.addRange(range)  
  17.     }  
  18.   } else {  
  19.     document.execCommand('insertText', false, result)  
  20.   }  
  21. }) 

这种办法也能很好地完成粘贴图片的功能,并且通用性会更好。接下来我们还会利用 Selection,来完成 emoji 的插入。

插入 emoji

(编辑:厦门网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读