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

Web谈天器材的富文本输入框

发布时间:2019-03-10 01:39:39 所属栏目:建站 来源:Jrain-前端玩具盆
导读:最近折腾 Websocket,规划开拓一个谈天室应用练练手。在应用开拓的进程中发明可以插入 emoji ,粘贴图片的富文本输入框着实蕴含着很多风趣的常识,于是便规划记录下来和各人分享。 客栈地点:chat-input-box 预览地点:https://codepen.io/jrainlau/p...

不管是粘贴文本也好,照旧图片也好,我们的输入框始终是处于聚焦(focus)状态。而当我们从心人情板里选择 emoji 心情的时辰,输入框会先失焦(blur),然后再从头聚焦。因为 document.execCommand 要领必需在输入框聚焦状态下才气触发,以是对付处理赏罚 emoji 插入来说就无法行使了。

上一末节讲过,Selection 可以让我们拿到聚焦状态下所选文本的出发点位置 startOffset 和终点位置 endOffset,假如没有选择文本而仅仅处于聚焦状态,那么这两个位置的值相称(相等于选择文本为空),也就是光标的位置。只要我们可以或许在失焦前记录下这个位置,那么就可以或许通过 range 把 emoji 插入正确的处所了。

起首编写两个器材要领。新建一个 cursorPosition.js 文件:

  1. /**  
  2.  * 获取光标位置  
  3.  * @param {DOMElement} element 输入框的dom节点  
  4.  * @return {Number} 光标位置  
  5.  */  
  6. export const getCursorPosition = (element) => {  
  7.   let caretOffset = 0  
  8.   const doc = element.ownerDocument || element.document  
  9.   const win = doc.defaultView || doc.parentWindow  
  10.   const sel = win.getSelection()  
  11.   if (sel.rangeCount > 0) {  
  12.     const range = win.getSelection().getRangeAt(0)  
  13.     const preCaretRange = range.cloneRange()  
  14.     preCaretRange.selectNodeContents(element)  
  15.     preCaretRange.setEnd(range.endContainer, range.endOffset)  
  16.     caretOffset = preCaretRange.toString().length  
  17.   }  
  18.   return caretOffset  
  19. }  
  20. /**  
  21.  * 配置光标位置  
  22.  * @param {DOMElement} element 输入框的dom节点  
  23.  * @param {Number} cursorPosition 光标位置的值  
  24.  */  
  25. export const setCursorPosition = (element, cursorPosition) => {  
  26.   const range = document.createRange()  
  27.   range.setStart(element.firstChild, cursorPosition)  
  28.   range.setEnd(element.firstChild, cursorPosition)  
  29.   const sel = window.getSelection()  
  30.   sel.removeAllRanges()  
  31.   sel.addRange(range)  

有了这两个要领往后,就可以放入 editor 节点内里行使了。起首在节点的 keyup 和 click 变乱里记录光标位置:

  1. let cursorPosition = 0  
  2. const editor = document.querySelector('.editor')  
  3. editor.addEventListener('click', async (e) => {  
  4.   cursorPosition = getCursorPosition(editor)  
  5. })  
  6. editor.addEventListener('keyup', async (e) => {  
  7.   cursorPosition = getCursorPosition(editor)  
  8. }) 

(编辑:湖南网)

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

热点阅读