位置: 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如何查看中风患者两表的数据量)

  • 如何运用用户习惯进行精准营销?(利用用户和用户之间的关系所造就的营销方式)

    如何运用用户习惯进行精准营销?(利用用户和用户之间的关系所造就的营销方式)

  • 微信可以投屏吗(微信可以投屏吗电视上)

    微信可以投屏吗(微信可以投屏吗电视上)

  • wps公式编辑器怎么调出来(wps公式编辑器怎么打空格)

    wps公式编辑器怎么调出来(wps公式编辑器怎么打空格)

  • 手机怎么查历史足迹(手机怎么查历史火车票记录)

    手机怎么查历史足迹(手机怎么查历史火车票记录)

  • 怎么设置电脑桌面密码(怎么设置电脑桌面动态壁纸)

    怎么设置电脑桌面密码(怎么设置电脑桌面动态壁纸)

  • QQ手机拍视频抖动怎么解决(用qq拍视频)

    QQ手机拍视频抖动怎么解决(用qq拍视频)

  • 苹果se2双卡的吗(iphone se2双卡双待吗?)

    苹果se2双卡的吗(iphone se2双卡双待吗?)

  • 苹果11闪光灯上面的孔是什么(苹果11闪光灯上面那个是什么)

    苹果11闪光灯上面的孔是什么(苹果11闪光灯上面那个是什么)

  • 路由器黄灯是什么意思(路由器黄灯是什么情况图片)

    路由器黄灯是什么意思(路由器黄灯是什么情况图片)

  • 华为荣耀play3什么时候上市(华为荣耀play3什么时候升级鸿蒙)

    华为荣耀play3什么时候上市(华为荣耀play3什么时候升级鸿蒙)

  • 支付宝扫不了二维码怎么办(支付宝扫不了二维码是什么原因)

    支付宝扫不了二维码怎么办(支付宝扫不了二维码是什么原因)

  • 双波浪线边框怎么设置(加双波浪线边框)

    双波浪线边框怎么设置(加双波浪线边框)

  • 苹果手机充电孔变松了怎么修(苹果手机充电孔坏了维修多少钱)

    苹果手机充电孔变松了怎么修(苹果手机充电孔坏了维修多少钱)

  • ps怎么看图片尺寸(ps里面如何看图片尺寸)

    ps怎么看图片尺寸(ps里面如何看图片尺寸)

  • 商家拒绝退款还能退吗(商家拒绝退款还能申请放心吃吗)

    商家拒绝退款还能退吗(商家拒绝退款还能申请放心吃吗)

  • 苹果查找iphone怎么用(苹果查找iphone怎么关闭)

    苹果查找iphone怎么用(苹果查找iphone怎么关闭)

  • 手机怎么拍出好照片(手机怎么拍出好看的月亮)

    手机怎么拍出好照片(手机怎么拍出好看的月亮)

  • 剪映教程音乐识别字幕(如何剪映音乐)

    剪映教程音乐识别字幕(如何剪映音乐)

  • 小米手环4睡眠怎么开启(小米手环4睡眠监测要自己设置睡眠时间吗)

    小米手环4睡眠怎么开启(小米手环4睡眠监测要自己设置睡眠时间吗)

  • 快手以前删的视频恢复(快手以前删的视频在哪里)

    快手以前删的视频恢复(快手以前删的视频在哪里)

  • 11promax双卡双待吗(ipone11promax 双卡双待)

    11promax双卡双待吗(ipone11promax 双卡双待)

  • 小米手机发烫如何处理(小米手机发烫如何降温)

    小米手机发烫如何处理(小米手机发烫如何降温)

  • 华为p30的后面三个摄像头分别有什么作用(华为p30后面三个镜头分别干什么用的)

    华为p30的后面三个摄像头分别有什么作用(华为p30后面三个镜头分别干什么用的)

  • 夏普电视wifi连接失败(夏普电视wifi连接打不开应用商店)

    夏普电视wifi连接失败(夏普电视wifi连接打不开应用商店)

  • 华为mate怎么打开usb调试(华为mate怎么打开开发者选项)

    华为mate怎么打开usb调试(华为mate怎么打开开发者选项)

  • 淘宝怎么删除评价(淘宝怎么删除评价商品)

    淘宝怎么删除评价(淘宝怎么删除评价商品)

  • 织梦dedecms:dedeajax2.js被植入js木马(织梦艺嫣跳舞)

    织梦dedecms:dedeajax2.js被植入js木马(织梦艺嫣跳舞)

  • 冲回多计提费用
  • 出口报关单价比合同价高
  • 运输途中的合理损耗
  • 返利应计入什么科目
  • 发票税号不对还能报销吗
  • 发票入账时间规定是多久
  • 月收入不足10万免增值税的账务处理
  • 企业销售软件需要结转成本吗
  • 房地产企业印花税税目
  • 主营业务成本明细账图
  • 公司支付保险公司保费怎么做账
  • 可抵扣农产品进项税额吗
  • 企业所得税季报时间
  • 单位补缴社保会罚款吗
  • 银行支付结算工作内容
  • 事业单位退休人员独生子女费如何发放
  • 做企业所得税汇算清缴前需要准备什么资料
  • 电子发票怎么缩小比例
  • 投资决策中常用的指标有
  • 企业处理二手车增值税没交,有什么影响
  • 经营租赁的固定资产计提折旧吗
  • 物业预收停车费不退费
  • 多提税金的具体分录
  • 税前金额是不含税金额
  • mac outlook怎么设置邮箱签名
  • 王者荣耀怎么快速获得金币
  • linux系统中怎么编辑文件
  • 材料按计划成本计价下,外购材料结算
  • 周转房维修请示
  • 成本费用包括什么项目
  • linux系统设置中文语言
  • cpqa1000.exe是安全进程吗 cpqa1000进程有什么作用
  • 盈余公积科目是什么科目
  • 公账提取备用金限额
  • 工程审计的目的包括哪些
  • 购货方开具红字发票怎么做账
  • php7数据库操作
  • php上传文件到指定目录
  • 自建办公楼装修要报建吗
  • yii2中dropDownList实现二级和三级联动写法
  • php数组变字符串
  • php中session使用
  • 资产负债表应收账款怎么计算
  • 黄金零售环节增值税的缴纳
  • javaweb购物
  • vue2vue3的区别
  • 企业的会计科目可以任意设置随意修改
  • 注销对公账户要去原支行吗
  • 长期待摊费用账务
  • 边际贡献总额计算公式边际贡献率
  • 财务费用有发票吗
  • 预收货款开具专用发票
  • 利息收入计入借方
  • sqlserver无法打开备份设备
  • 使用mysql命令
  • 补交以前年度的城建税会计分录
  • 建筑企业印花税应税凭证名称
  • 会计分录结转进项怎么算
  • 车辆购置税可以退税吗
  • 已经入库的商品出库了要怎么做会计分录
  • 现金零星金额多少
  • 长期股权投资权益法初始成本的确定
  • windows自带的
  • win10怎么设置pdf默认打开方式是wps
  • win7系统设置wifi热点
  • linux ls常用命令
  • 苹果mac系统怎么安装pip工具
  • 隐藏控制台窗口
  • 开始菜单里没有设置选项
  • win7取消禁用无线网络
  • win8桌面不见了
  • win8怎么查ip地址查询
  • win10预览体验推荐哪个通道
  • glimp使用方法
  • jquery元素选择器有哪些
  • 税务局收垃圾处置费
  • 浙江省国税局地址
  • 沈阳税务机关地区编号
  • 资源税的定义是什么
  • 个体如何申请税收优惠
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设