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

  • mi 10 lite zoom是什么型号

    mi 10 lite zoom是什么型号

  • 微信如何解绑苏康码(微信怎么解绑苏康码)

    微信如何解绑苏康码(微信怎么解绑苏康码)

  • 爱奇艺画中画可以调节大小吗(爱奇艺画中画什么意思)

    爱奇艺画中画可以调节大小吗(爱奇艺画中画什么意思)

  • 华为畅享10如何隐藏应用(华为畅享10如何关闭HD)

    华为畅享10如何隐藏应用(华为畅享10如何关闭HD)

  • iphonex快充多少w(iphonex快充用多少w的)

    iphonex快充多少w(iphonex快充用多少w的)

  • 滴滴有拉货平台吗(滴滴拉货平台在网上交钱司服填什么单子)

    滴滴有拉货平台吗(滴滴拉货平台在网上交钱司服填什么单子)

  • 红米10x和荣耀x10对比(红米10x和荣耀畅玩20)

    红米10x和荣耀x10对比(红米10x和荣耀畅玩20)

  • 锐龙3600相当于i几(锐龙3600相当于英特尔什么水平)

    锐龙3600相当于i几(锐龙3600相当于英特尔什么水平)

  • 3a快充和5a快充区别(3a快充和5a快充哪个好)

    3a快充和5a快充区别(3a快充和5a快充哪个好)

  • 苹果xr无面容可以买吗(苹果xr无面容可以拍照或视频吗)

    苹果xr无面容可以买吗(苹果xr无面容可以拍照或视频吗)

  • 怎么把照片以文件形式发送(怎么把照片以文件形式发送jpg)

    怎么把照片以文件形式发送(怎么把照片以文件形式发送jpg)

  • 手机有流量有话费为什么上不了网(手机有流量有话费但是无法连接网络)

    手机有流量有话费为什么上不了网(手机有流量有话费但是无法连接网络)

  • 第一个分组计算机网络出现于(第一个分组计算机出现于哪一年)

    第一个分组计算机网络出现于(第一个分组计算机出现于哪一年)

  • 1080p和720p哪个更清晰(1080p和720p哪个更流畅)

    1080p和720p哪个更清晰(1080p和720p哪个更流畅)

  • 苹果更新系统后一直白苹果(苹果更新系统后怎么恢复以前的系统)

    苹果更新系统后一直白苹果(苹果更新系统后怎么恢复以前的系统)

  • 抖音号丢了怎么找回(抖音号丢了怎么办?有没有电话)

    抖音号丢了怎么找回(抖音号丢了怎么办?有没有电话)

  • 京东签到提醒如何取消(京东签到在哪儿)

    京东签到提醒如何取消(京东签到在哪儿)

  • 怎样把图片背景变成透明(怎样把图片背景颜色变白色)

    怎样把图片背景变成透明(怎样把图片背景颜色变白色)

  • 无损转mp3后音质变吗(无损转mp3后音质不好)

    无损转mp3后音质变吗(无损转mp3后音质不好)

  • 手机通话语音会保留吗(手机通话语音会中断吗)

    手机通话语音会保留吗(手机通话语音会中断吗)

  • vivo系统相册在哪里找(vivo手机系统相册)

    vivo系统相册在哪里找(vivo手机系统相册)

  • 几点发快手容易上热门(几点发快手容易上同城热门)

    几点发快手容易上热门(几点发快手容易上同城热门)

  • pubglite下载慢怎么办(pubg下载很慢怎么办)

    pubglite下载慢怎么办(pubg下载很慢怎么办)

  • qq特别关心铃声修改(QQ特别关心铃声怎么取消)

    qq特别关心铃声修改(QQ特别关心铃声怎么取消)

  • 银行利息支出税前扣除标准
  • 哪些费用类专票可以抵扣
  • 所得税年度纳税申报表 从业人数怎么填
  • 商家为什么要做广告?
  • 印花税退税流程怎么操作
  • 纳税人从两处取得收入汇算清缴可以扣除2个60000吗
  • 一般纳税人企业所得税政策最新2023税率
  • 多计费用以前年度损益调整
  • 造价服务费收费标准计算器
  • 企业的耕地占用税怎么算
  • 劳动合同解除和终止的经济补偿
  • 有进项没有销项可以零申报吗
  • 这几点政府补助会计新准则值得关注
  • 详解出口退税的涵义
  • 暂估入账没有调增,以后年度怎么调整
  • 暂估成本冲回之后成本变为负的
  • 股权取得
  • 印花税计提和缴纳凭证
  • 资产增加,负债增加
  • 外贸企业出口收入确定
  • 是否所有电池产品都需在进口环节缴纳消费税?
  • 商品残次品怎样定义
  • 存货盘亏进项税额转出会计分录怎么做
  • win10怎么清空
  • 收到销项负数发票怎么抵扣
  • win11 应用商店
  • 工资税后补扣是什么意思
  • 生产运维是干什么的
  • 经营租赁与融资租赁的含义
  • 非货币性资产交换的记忆口诀
  • php实现上传文件
  • 详解php字符串替换
  • 跨行政区域是跨省吗
  • 购买财务软件的费用
  • thinkphp6项目
  • php的session
  • React - Redux Hooks的使用细节详解
  • 图像去噪的原理
  • 微信php源码
  • 通过点击office文件按钮可以选择设置系统选项
  • python opencv如何获取图片尺寸
  • 营业外收入会计分录怎么做
  • 优秀员工奖励现金是工资还是福利
  • 以前年度损益调整怎么做账
  • 申报水利基金的流程
  • Bootstrap table 控制表格高度固定(行高固定)并且不受数据量影响
  • 如何用织梦在本地搭建网站
  • python画3d图形
  • phpcms安装
  • 固定资产是价税合计吗
  • 查验发票显示红冲是什么意思
  • 员工的医药费计入什么科目
  • 活动策划费属于哪个开票项目
  • 退税登记怎么办理
  • SQL Server性能优化工具Profiler
  • 挂靠的项目如何做账?
  • 安全基金提取会计分录
  • 代扣代缴的增值税怎么做账
  • 发出存货的计价应当采用
  • 应付账款可以用现金支付吗
  • 收到所得税退税的账务处理
  • 发票只能用一次吗
  • mysql 备份和恢复
  • innodb update 锁
  • skydrive pro
  • 苹果电脑怎么锁文件夹
  • windows注册表简单应用
  • winxp系统介绍
  • mac如何自行检测硬盘信息
  • linux使用curl进行接口测试
  • cocos2dx引擎优化
  • android图形架构
  • unity小游戏代码
  • linux系统如何搜索文件内容
  • java项目的命名规则
  • python3 编码转换
  • androidapk网站
  • 烟草什么品牌好
  • 广西纳税申报流程
  • 大乐透中奖查询走势图
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设