位置: IT常识 - 正文

富文本实现@选择人(富文本功能)

编辑:rootadmin
准备工作 npm i wangeditor --save npm i caret-pos --save 组件: <!--富文本--> <div :id="editorEleId" @keydown="onKeyDownInput($event)" @click="onClickEditor" ></ ...

推荐整理分享富文本实现@选择人(富文本功能),希望有所帮助,仅作参考,欢迎阅读内容。

富文本实现@选择人(富文本功能)

文章相关热门搜索词:富文本怎么用,富文本js,富文本js,实现富文本编辑器,富文本使用,富文本类型,实现富文本编辑器,实现富文本编辑器,内容如对您有帮助,希望把文章链接给更多的朋友!

准备工作

npm i wangeditor --savenpm i caret-pos --save

组件:

<!--富文本--><div :id="editorEleId" @keydown="onKeyDownInput($event)" @click="onClickEditor"></div><!-- 成员选择 --> <div class="userPopupList" :style="{left: left + 'px', top: top + 'px'}" v-show="show"> <el-input v-model="userName" ref="input"></el-input> <ul> <li v-for="user in protectPersons.filter((item) => item.workNick.includes(this.userName))" :key="user.userId" @click="createSelectElement(user.workNick,user.userId)" > <el-avatar :size="22" :src="user.icon" class="m-r-10" style="vertical-align: middle" > <img src="../../assets/images/defaultIcon.gif"/> </el-avatar> <span>{{user.workNick}}</span> </li> </ul></div>.userPopupList{ position: fixed; z-index: 9999; /deep/input{ border:none; background: transparent; } ul{ max-height: 200px; overflow-y: auto; border: 1px solid #dbdada; background: #fff; padding: 10px 10px 0; border-radius: 3px; li{ margin-bottom: 5px; padding: 5px 10px; &:hover{ background: #f6f5f5; } } }}position:any = {};left:number = 0;top:number = 0;show:boolean = false;isRendering: boolean = false;userName: string = '';users:any = []; ...富文本初始化this.editor.config.onchange = () => { // 生成@的标签的时候会触发渲染、此时不要记录光标坐标 if (this.isRendering === false) { this.setRecordCoordinates() // 记录坐标 }else { this.isRendering = false; }};// 每次点击获取更新坐标onClickEditor() { this.setRecordCoordinates()}// 获取当前光标坐标setRecordCoordinates() { try { // getSelection() 返回一个 Selection 对象,表示用户选择的文本范围或光标的当前位置。      if(!this.show){       const selection:any = window.getSelection();       this.position = {       range: selection.getRangeAt(0),       selection: selection       }      } } catch (error) { console.log(error, '光标获取失败了~') }}// keydown触发事件 记录光标onKeyDownInput(e:any) { const isCode = ((e.keyCode === 229 && e.key === '@') || (e.keyCode === 229 && e.code === 'Digit2') || e.keyCode === 50) && e.shiftKey if (isCode) { this.setRecordCoordinates(); // 保存坐标 this.getPosition(); // 显示选择框,定时原因:1、@会插入到input中,2、光标位置也是input的,会导致插入位置错误 setTimeout(()=>{ this.show = true this.$nextTick(()=>{ (this.$refs.input as any).focus(); }) },200) }}//弹窗列表 - 选人 - 生成@的内容createSelectElement(name:string, id:string, type = 'default') { // 获取当前文本光标的位置。 const { range } = this.position // 生成需要显示的内容 let spanNodeFirst:any = document.createElement('span') spanNodeFirst.className = 'user-node' spanNodeFirst.style.color = '#409EFF' spanNodeFirst.innerHTML = `@${name}&nbsp;` // @的文本信息 spanNodeFirst.dataset.id = id // 用户ID、为后续解析富文本提供 spanNodeFirst.contentEditable = false // 当设置为false时,富文本会把成功文本视为一个节点。 // 需要在字符前插入一个空格否则、在换行与两个@标签连续的时候导致无法删除标签 let spanNode = document.createElement('span'); spanNode.innerHTML = '&nbsp;'; //创建一个新的空白的文档片段,拆入对应文本内容 let frag = document.createDocumentFragment() frag.appendChild(spanNode); frag.appendChild(spanNodeFirst); frag.appendChild(spanNode); // 如果是键盘触发的默认删除面前的@,前文中我们没有阻止@的生成所以要删除@的再插入ps:如果你是数组遍历的请传入type 不然会一直删除你前面的字符。 if (type === 'default') { const textNode = range.startContainer; range.setStart(textNode, range.endOffset - 1); range.setEnd(textNode, range.endOffset); range.deleteContents(); } this.isRendering = true; // 判断是否有文本、是否有坐标 if ((this.editor.txt.text() || type === 'default')&& this.position && range) { range.insertNode(frag) } else { // 如果没有内容一开始就插入数据特别处理 this.editor.txt.append(`<span data-id="${id}" contentEditable="false">@${name}&nbsp;</span>`) } this.show = false; this.userName = '';}// 获取当前光标位置getPosition () { const ele:any = this.editor.$textElem.elems[0]; const pos = position(ele) const off = offset(ele) const parentW = ele.offsetWidth // 这个是弹窗列表 const childEle:any = document.getElementsByClassName("userPopupList") const childW = childEle.offsetWidth // 弹框偏移超出父元素的宽高 if (parentW - pos.left < childW) { this.left = off.left - childW } else { this.left = off.left } this.top = off.top - 4}//提交评论sure(ev: any) { ... const users = document.querySelectorAll('.user-node'); let userIds:string[] = []; users.forEach((item:any) => { userIds.push(item.getAttribute('data-id')) }) ...}
本文链接地址:https://www.jiuchutong.com/zhishi/310445.html 转载请保留说明!

上一篇:Python如何实现时间累加的计算器(python @time)

下一篇:python如何查看hdf5文件(Python如何查看中风患者两表的数据量)

  • 小米手环怎么听音乐(小米手环怎么听音乐不需要手机)

    小米手环怎么听音乐(小米手环怎么听音乐不需要手机)

  • 小米手机智能助理怎么关闭(小米手机智能助理接听电话)

    小米手机智能助理怎么关闭(小米手机智能助理接听电话)

  • word怎么只改英文字体(word怎么只改英文)

    word怎么只改英文字体(word怎么只改英文)

  • 支付宝通讯录黑名单在哪里看(支付宝通讯录黑名单怎么设置)

    支付宝通讯录黑名单在哪里看(支付宝通讯录黑名单怎么设置)

  • 电脑怎么修改ppt背景图片(电脑怎么修改图片尺寸和像素)

    电脑怎么修改ppt背景图片(电脑怎么修改图片尺寸和像素)

  • word选中不相连文字(word选中不相连文字快捷键)

    word选中不相连文字(word选中不相连文字快捷键)

  • 微信打招呼频繁多久解除(微信打招呼频繁怎么解决)

    微信打招呼频繁多久解除(微信打招呼频繁怎么解决)

  • 华为jdn2一w09是哪款平板(华为jdn2-l09是什么型号)

    华为jdn2一w09是哪款平板(华为jdn2-l09是什么型号)

  • 微信有人投诉可以查到是谁投诉的吗(别人微信投诉我,我会收到提示吗)

    微信有人投诉可以查到是谁投诉的吗(别人微信投诉我,我会收到提示吗)

  • id地址是啥意思(id地址是啥意思呀)

    id地址是啥意思(id地址是啥意思呀)

  • 华为mate30pro几个摄像头(华为mate30pro几个系统)

    华为mate30pro几个摄像头(华为mate30pro几个系统)

  • 抖音私信功能禁封多久(抖音私信功能禁用怎么解除掉)

    抖音私信功能禁封多久(抖音私信功能禁用怎么解除掉)

  • oppo录制屏幕怎么没有声音(oppo录制屏幕怎么关闭)

    oppo录制屏幕怎么没有声音(oppo录制屏幕怎么关闭)

  • xsmax通话声音小怎么办

    xsmax通话声音小怎么办

  • 荣耀9人脸识别怎么设置(荣耀80人脸识别怎么设置)

    荣耀9人脸识别怎么设置(荣耀80人脸识别怎么设置)

  • 考虫网课过期了怎么看(考虫网课过期了还能看吗)

    考虫网课过期了怎么看(考虫网课过期了还能看吗)

  • 如何给页码插全角空格(页码如何全部设置)

    如何给页码插全角空格(页码如何全部设置)

  • 小米手机为什么打不了电话了(小米手机为什么别人打电话打不进来)

    小米手机为什么打不了电话了(小米手机为什么别人打电话打不进来)

  • iwatch3能测血压么(iwatch3能测血压吗)

    iwatch3能测血压么(iwatch3能测血压吗)

  • 柬埔寨电话怎么打(柬埔寨电话怎么激活)

    柬埔寨电话怎么打(柬埔寨电话怎么激活)

  • vivox27返回键设置(vivox27手机返回键)

    vivox27返回键设置(vivox27手机返回键)

  • 开通来电秀要钱吗(来电秀要钱不)

    开通来电秀要钱吗(来电秀要钱不)

  • 苹果手机圆浮球在哪里(苹果手机圆浮球怎么调到右上角去)

    苹果手机圆浮球在哪里(苹果手机圆浮球怎么调到右上角去)

  • 什么是ChatGPT(什么是CHATGPT)

    什么是ChatGPT(什么是CHATGPT)

  • 印花税进什么费用
  • 不动产增值税税率变化
  • 工程材料发票备注要求
  • 零申报还要抄税吗
  • 购进货物未取得增值税专用发票可以抵扣进项税额吗
  • 结转完工入库产品成本计算
  • 工会经费0.008申报
  • 短期借款的账务处理实训
  • 卖自用轿车要缴什么税
  • 土地转让如何缴纳增值税
  • 蓝字发票作废流程视频
  • 私立医院收到投诉信
  • 资金型股东溢价进入
  • 商品过期可以向商家索要赔偿吗
  • 应付账款预收账款
  • 在杂志上发表论文
  • 民办幼儿园怎么给老师交五险一金
  • 运输公司购买机票怎么买
  • 票据质押放流贷的风险归谁
  • 各地土地使用税区域差距大
  • 劳务外包收入公式是什么
  • 企业之间的往来款现金流
  • 如何知道家里网络是多少兆
  • 内置管理员无法打开此应用
  • 事业单位需要交个人所得税吗
  • 开立异地银行结息通知
  • 设置背景图片大小和元素的大小一致的代码
  • 企业期末结转本期实现的各项收入
  • 实名办税人员承担什么责任
  • php输出空格语句
  • unlinkhist.dat怎么删除
  • 工业企业采购部工作职责
  • 旅行社代订的机票可以退吗
  • 应发工资与应税的区别
  • 织梦如何采集文章
  • 钢筋增值税专票几个点
  • 补交以前年度环保税会计分录
  • 农产品增值税免税发票怎么抵扣
  • 使用SQL server创建数据库和表
  • 临时工和正式工工资不一样违法吗
  • 普通费用发票不入账会有什么后果吗
  • 劳动仲裁经济补偿金写多了
  • 利润表中本月数,本期金额指什么
  • 公司账户转到公司账户要多久
  • 独资合伙公司
  • 分期付款购入固定资产该如何做账务处理呢?
  • 现金收货款要填什么信息
  • 企业为职工租房合法吗
  • 与其他企业联合投资一个项目要怎么做账务处理?
  • 销售折扣含义
  • 公司购买银行理财产品怎么做账
  • 预付账款没有发票吗
  • 损益类科目如何填写手工总账
  • 日常费用报销表格
  • 史上最简单的不读书法成甲
  • mysql密码总是输入错误
  • win7打开浏览器很慢
  • win10系统微软账号退不了怎么办
  • 远程桌面 登录
  • mac10.15系统
  • freebsd安装mysql
  • 苹果电脑mac系统怎么升级
  • mac清理所有数据
  • centos which
  • linux允许ping
  • hpm是什么格式的文件
  • linux中qq怎么添加快捷键启动功能?
  • cocos2dx 3.17
  • [置顶] 此外,车牌号:458143(懂得都懂[吃瓜])
  • nodejs微信小程序开发工具
  • vue中使用类class
  • javascript的介绍
  • unity3d的作用
  • jQuery Ajax页面局部加载方法汇总
  • 税务关系转移社保怎么办理
  • 成都高新区税务局办税服务厅电话
  • 北京四合院为什么出名那么多
  • 广东省电子税务局app
  • 三国杀马钧获取
  • 婚育证明可以开假的吗
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设