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

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

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

然后就可以在 onPaste 事件里面直接使用了:

  1. document.querySelector('.editor').addEventListener('paste', async (e) => {  
  2.     const result = await onPaste(e)  
  3.     console.log(result)  
  4. }) 

上面的代码支持文本格式,接下来就要对图片格式进行处理了。玩过 <input type="file"> 的同学会知道,包括图片在内的所有文件格式内容都会储存在 File 对象里面,这在剪贴板里面也是一样的。于是我们可以编写一套通用的函数,专门来读取 File 对象里的图片内容,并把它转化成 base64 字符串。

粘贴图片

为了更好地在输入框里展示图片,必须限制图片的大小,所以这个图片处理函数不仅能够读取 File 对象里面的图片,还能够对其进行压缩。

新建一个 chooseImg.js 文件:

  1. /**  
  2.  * 预览函数  
  3.  *  
  4.  * @param {*} dataUrl base64字符串  
  5.  * @param {*} cb 回调函数  
  6.  */  
  7. function toPreviewer (dataUrl, cb) {  
  8.   cb && cb(dataUrl)  
  9. }  
  10. /**  
  11.  * 图片压缩函数  
  12.  *  
  13.  * @param {*} img 图片对象  
  14.  * @param {*} fileType  图片类型  
  15.  * @param {*} maxWidth 图片最大宽度  
  16.  * @returns base64字符串  
  17.  */  
  18. function compress (img, fileType, maxWidth) {  
  19.   let canvas = document.createElement('canvas')  
  20.   let ctx = canvas.getContext('2d')  
  21.   const proportion = img.width / img.height  
  22.   const width = maxWidth  
  23.   const height = maxWidth / proportion  
  24.   canvas.width = width  
  25.   canvas.height = height  
  26.   ctx.fillStyle = '#fff'  
  27.   ctx.fillRect(0, 0, canvas.width, canvas.height)  
  28.   ctx.drawImage(img, 0, 0, width, height)  
  29.   const base64data = canvas.toDataURL(fileType, 0.75)  
  30.   canvas = ctx = null  
  31.   return base64data  
  32. }  
  33. /**  
  34.  * 选择图片函数  
  35.  *  
  36.  * @param {*} e input.onchange事件对象  
  37.  * @param {*} cb 回调函数  
  38.  * @param {number} [maxsize=200 * 1024] 图片最大体积  
  39.  */  
  40. function chooseImg (e, cb, maxsize = 200 * 1024) {  
  41.   const file = e.target.files[0]  
  42.   if (!file || !//(?:jpeg|jpg|png)/i.test(file.type)) {  
  43.     return  
  44.   }  
  45.   const reader = new FileReader()  
  46.   reader.onload = function () {  
  47.     const result = this.result  
  48.     let img = new Image()  
  49.     if (result.length <= maxsize) {  
  50.       toPreviewer(result, cb)  
  51.       return  
  52.     }  
  53.     img.onload = function () {  
  54.       const compresscompressedDataUrl = compress(img, file.type, maxsize / 1024)  
  55.       toPreviewer(compressedDataUrl, cb)  
  56.       img = null  
  57.     }   
  58.     img.src = result  
  59.   }  
  60.   reader.readAsDataURL(file)  
  61. }  
  62. export default chooseImg 

关于使用 canvas 压缩图片和使用 FileReader 读取文件的内容在这里就不赘述了,感兴趣的读者可以自行查阅。

(编辑:厦门网)

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

热点阅读