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

  • 如何有效的运用博客进行推广(如何有效的运用课文中的插图)

    如何有效的运用博客进行推广(如何有效的运用课文中的插图)

  • 钉钉美颜可以调节吗(钉钉美颜调节参数)

    钉钉美颜可以调节吗(钉钉美颜调节参数)

  • 华为P40pro有防水功能吗(华为mate40pro有防水功能吗)

    华为P40pro有防水功能吗(华为mate40pro有防水功能吗)

  • 快手极速版上买的东西怎么查订单(快手极速版+免费下载)

    快手极速版上买的东西怎么查订单(快手极速版+免费下载)

  • snkrs一直很抱歉出错了(snkrs一直很抱歉出错了安卓)

    snkrs一直很抱歉出错了(snkrs一直很抱歉出错了安卓)

  • 手机qq怎么隐藏超会(手机qq怎么隐藏黄钻图标)

    手机qq怎么隐藏超会(手机qq怎么隐藏黄钻图标)

  • Excel表格用斜线怎么一分为三(excel表格用斜线分格)

    Excel表格用斜线怎么一分为三(excel表格用斜线分格)

  • 微信备注修改有上限吗(微信备注修改有影响吗)

    微信备注修改有上限吗(微信备注修改有影响吗)

  • 为什么Word页码从2开始(为什么word页码都是一样的)

    为什么Word页码从2开始(为什么word页码都是一样的)

  • 小米手环收不到微信消息怎么回事(小米手环收不到微信通知)

    小米手环收不到微信消息怎么回事(小米手环收不到微信通知)

  • 电脑desktop什么意思(desktop软件干嘛用的)

    电脑desktop什么意思(desktop软件干嘛用的)

  • 断路器1p2p是什么意思(断路器1p+n和2p的区别)

    断路器1p2p是什么意思(断路器1p+n和2p的区别)

  • 手机复制完找不到粘贴(手机复制的内容不见了在哪找)

    手机复制完找不到粘贴(手机复制的内容不见了在哪找)

  • 除了微信其他软件都连不上网(除了微信其他软件可以应用分身吗)

    除了微信其他软件都连不上网(除了微信其他软件可以应用分身吗)

  • 蓝牙显示已连接但没声音(蓝牙显示已连接,为什么用不了)

    蓝牙显示已连接但没声音(蓝牙显示已连接,为什么用不了)

  • 抖音企业号怎么改名字(抖音企业号怎么恢复个人账号)

    抖音企业号怎么改名字(抖音企业号怎么恢复个人账号)

  • qq群里怎么艾特某个人(qq群里怎么艾特人加图片)

    qq群里怎么艾特某个人(qq群里怎么艾特人加图片)

  • word中默认的行距是多少(word中默认的行距为1.5倍对不对)

    word中默认的行距是多少(word中默认的行距为1.5倍对不对)

  • ipv4的ip地址有多少位(ipv4的ip地址有多少字节)

    ipv4的ip地址有多少位(ipv4的ip地址有多少字节)

  • 2060s配什么cpu(2060s配什么cpu和主板好)

    2060s配什么cpu(2060s配什么cpu和主板好)

  • 小米开发者选项在哪里(小米开发者选项在哪里打开)

    小米开发者选项在哪里(小米开发者选项在哪里打开)

  • 探探能搜索好友吗(探探可以搜索人么)

    探探能搜索好友吗(探探可以搜索人么)

  • 手机照片重命名怎么弄(手机照片重命名被占用怎么办)

    手机照片重命名怎么弄(手机照片重命名被占用怎么办)

  • vivo手机有pay功能吗(vivo手机有没有手机pay)

    vivo手机有pay功能吗(vivo手机有没有手机pay)

  • 手机屏幕死机怎么办(手机死机了屏幕动不了什么原因)

    手机屏幕死机怎么办(手机死机了屏幕动不了什么原因)

  • 微信m4a格式录音怎么弄(微信m4a格式录音视频教学)

    微信m4a格式录音怎么弄(微信m4a格式录音视频教学)

  • win10重置网络没网了(win10重置网络没有安装适配器)

    win10重置网络没网了(win10重置网络没有安装适配器)

  • 重置IE浏览器(重置ie浏览器会有什么影响)

    重置IE浏览器(重置ie浏览器会有什么影响)

  • Hovenweep国家纪念碑的方塔,犹他州 (© Brad McGinley Photography/Getty Images)(国家纪念品)

    Hovenweep国家纪念碑的方塔,犹他州 (© Brad McGinley Photography/Getty Images)(国家纪念品)

  • Web自动化测试怎么做?Web自动化测试的详细流程和步骤(web 自动化测试)

    Web自动化测试怎么做?Web自动化测试的详细流程和步骤(web 自动化测试)

  • 自创商誉可以税前扣除吗
  • 城建税是什么税率
  • 啥叫免抵税额
  • 集团内部两个公司业务可以互相外包吗
  • 未取得发票的费用,在汇算清缴中按利润计算吗
  • 利润分配会计处理例题及解析
  • 加计扣除声明在哪里签章有效
  • 实收资本印花税税率
  • 以土地出资土地增值税
  • 补交本年增值税计提
  • 企业用于存货的支出
  • 公司贷款直接打供应商账户还需要发票吗
  • 增值税应交税费科目
  • 房地产未确认收入情况说明
  • 地税局返的个人所得税手续费多久返还?
  • 增值税发票税率6%是什么
  • 增值税预缴税需要申报吗
  • 全年一次性奖金计税方式2023
  • 商贸企业仓储服务有哪些
  • 进口增值税 海关
  • 税前合同价包含附加税金吗?
  • 单位购进员工餐食材怎做账务处理?
  • 应交税费的会计处理2018
  • edge浏览器下载安装
  • 多计提的增值税和附加税怎么冲减?
  • Omniserv.exe - Omniserv是什么进程 有什么用
  • 支付中间业务收入怎么算
  • 在win7中如何设置屏幕保护程序
  • PHP:xml_parser_create()的用法_XML解析器函数
  • 公寓收费标准
  • 外购货物用于职工福利进项税额可以抵扣吗
  • 缴纳集团公司的税收
  • 增值税征税范围中的货物包括
  • php each list
  • 合伙企业的股息红利要交税吗
  • auto.js 教程
  • 图像自动生成
  • 华为od机试真题2023 pdf
  • php生成文件函数
  • 预付账款借方怎么调平
  • 发票2种
  • 车补贴是要缴纳增值税吗
  • 运输服务的增值税税率到底是6还是9
  • 家庭保洁服务包括什么
  • 会计年度对账
  • 赔偿给客户的产品交增值税吗
  • 增值税普通发票查询
  • 劳务成本科目的分类
  • 开办费用怎么处理
  • 4s店交首付分期多久
  • 无形资产的相关税费
  • 限定性净资产的例子有哪些
  • 借贷不平衡是什么意思
  • 开票和不开票
  • 开票方与付款方不一致问题
  • 残保金计算公式2023年
  • 年终建账于年初建账,在录入期初余额时有什么不一样?
  • 已经开了发票需要退款怎么处理?
  • 汽车销售企业的资产有哪些
  • 出租办公楼收入属于收入吗
  • Windows Server 2008关闭闲置状态的IDE通道
  • 在Linux系统中安装MySQL
  • linux怎么自定义命令
  • 晨枫U盘启动工具哪个版本好用
  • rcapi.exe - rcapi是什么进程 有什么用
  • 安装win8.1一直卡着不动
  • grep正则表达式运用举例
  • win10一周年深色主题
  • cocos2dx ui编辑器
  • shell中判断文件是否存在
  • jquery插件使用教程
  • unity3d打包apk
  • javascript零基础入门书籍
  • 第二章,动态添加按钮(Android)
  • js验证码代码怎么写
  • js缩小图片尺寸
  • 宾馆税务
  • 比利时个人所得税税率
  • 怎么注册山东省电子税务局
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设