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

  • 苹果13promax机身尺寸是多大(苹果13promax机身材质)

    苹果13promax机身尺寸是多大(苹果13promax机身材质)

  • 抖音转发给朋友的顺序怎么删除(抖音转发给朋友的顺序是怎么来的)

    抖音转发给朋友的顺序怎么删除(抖音转发给朋友的顺序是怎么来的)

  • 支付宝最近转账人员怎么删除(支付宝最近转账银行卡怎么删除)

    支付宝最近转账人员怎么删除(支付宝最近转账银行卡怎么删除)

  • 荣耀30pro如何退出屏幕朗读模式(华为荣耀30pro怎么退出一个程序)

    荣耀30pro如何退出屏幕朗读模式(华为荣耀30pro怎么退出一个程序)

  • oppo手机抖音怎么设置权限(oppo手机抖音怎么投屏到电视上)

    oppo手机抖音怎么设置权限(oppo手机抖音怎么投屏到电视上)

  • 苹果键盘大写键在哪里(苹果键盘大写键 删除键 数字键变颜色了)

    苹果键盘大写键在哪里(苹果键盘大写键 删除键 数字键变颜色了)

  • 苹果x听筒声音小是不是坏了(苹果X听筒声音小怎么清理干净)

    苹果x听筒声音小是不是坏了(苹果X听筒声音小怎么清理干净)

  • cpu三级缓存是什么意思(cpu的三级缓存是什么意思)

    cpu三级缓存是什么意思(cpu的三级缓存是什么意思)

  • 抖音短视频没有播放量怎么回事(抖音短视频没有数据分析怎么回事)

    抖音短视频没有播放量怎么回事(抖音短视频没有数据分析怎么回事)

  • 宽带灯怎么才正常(宽带灯光怎么闪才正常)

    宽带灯怎么才正常(宽带灯光怎么闪才正常)

  • 闲鱼可以两个手机同时登录吗(闲鱼两个手机登录同一个账号会有影响吗?)

    闲鱼可以两个手机同时登录吗(闲鱼两个手机登录同一个账号会有影响吗?)

  • 小米6x闪充在哪设置(小米6怎么开启闪充)

    小米6x闪充在哪设置(小米6怎么开启闪充)

  • 机械鼠标旁边的两个按键是干嘛的(机械鼠标底部)

    机械鼠标旁边的两个按键是干嘛的(机械鼠标底部)

  • ipadair2能用apple pencil(ipadair2能用的触控笔)

    ipadair2能用apple pencil(ipadair2能用的触控笔)

  • 1000gb等于多少g(1000gb等于多少mb)

    1000gb等于多少g(1000gb等于多少mb)

  • 华为pot一al10是什么型号(华为pot al10多少钱)

    华为pot一al10是什么型号(华为pot al10多少钱)

  • 微博怎么一键删除所有微博(微博怎么一键删除动态)

    微博怎么一键删除所有微博(微博怎么一键删除动态)

  • 怎么合并视频(手机怎么合并视频)

    怎么合并视频(手机怎么合并视频)

  • 快剪辑如何加图片(快剪辑如何加图片文字)

    快剪辑如何加图片(快剪辑如何加图片文字)

  • 抖音资料为什么被锁定(抖音资料为什么暂时被锁定)

    抖音资料为什么被锁定(抖音资料为什么暂时被锁定)

  • oppoa83禁止安装怎么解除(oppo禁止安装程序,要怎么设置才能解除?)

    oppoa83禁止安装怎么解除(oppo禁止安装程序,要怎么设置才能解除?)

  • 苹果8怎么清理系统内存(苹果8怎么清理运行中的软件)

    苹果8怎么清理系统内存(苹果8怎么清理运行中的软件)

  • Postman进阶篇(二)-console控制台(查看接口日志、调试代码)(postman入门)

    Postman进阶篇(二)-console控制台(查看接口日志、调试代码)(postman入门)

  • Windows7系统修改TrustedInstaller权限文件(无法删除文(怎么更改win7)

    Windows7系统修改TrustedInstaller权限文件(无法删除文(怎么更改win7)

  • 视同销售增值税申报表怎么填写
  • 注册公司不开账户可以吗
  • 未交增值税借方表示什么
  • 金税盘技术维护费怎么申报
  • 房地产行业企业所得税政策
  • 直接支付和授权支付方式的区别与联系
  • 必须一般纳税人
  • 企业应交所得税怎么算
  • 个人所得税已申报税额合计是什么意思
  • 员工劳动保险赔多少钱
  • 商品已发出未开票未收款怎么做账
  • 建筑业如何开票
  • 取得企业增值税发票
  • 政府补贴可以税前扣除填写在哪里
  • 房产税税率和应纳税额
  • 农产品没有进项税怎么算
  • 中方人员取得的工资、薪金所得,征收个人所得税有特别规定吗?
  • 长期待摊费用属于什么科目借贷方向
  • 收代扣代收代征手续费会计分录
  • 企业风险应对的基本类型包括
  • 企业所得税可以弥补几年亏损
  • 归还银行贷款怎么做分录
  • 小微企业所得税减免政策2023
  • 公司采购商品支付货款未开票会计分录
  • 企业增加的留存收益计入
  • 主营业务利润计算
  • 药品推广服务费怎么开票
  • vue打开窗口
  • cmos是bios参数设置的
  • php做
  • 多交的社保怎么做分录
  • centos只有lo
  • 厂房拆迁补偿多少钱一平
  • 会计分录的方法与步骤
  • 固定资产转卖怎么开票
  • 保险公司应收账款管理现状及存在的问题
  • 模态框无法弹出
  • 部门差旅费预算表
  • 基于Java+SpringBoot+vue+element驾校管理系统设计和实现
  • yolov5官方
  • php处理并发有哪些技术
  • 增值税返还需要交增值税吗
  • python2.7 协程
  • 尾款忘记支付,交易关闭怎么办
  • 申报表填完后下一步是什么
  • 建安类企业包括哪些公司
  • 进项加计扣除主项怎么算
  • ado连接access数据库
  • 员工福利开的专票怎么做分录
  • 增值税的预缴税怎么算
  • 税号指的是什么
  • 核销单取消后出口收汇流程
  • 代垫水电费的账务处理
  • 预付款对应的发票是什么
  • 政府会计准则具体准则的作用
  • mysql必知必会 pdf完整版
  • sqlserver性能优化5种方式
  • sql数据库清除日志
  • centos访问网页命令
  • winxp系统如何安装
  • 503 service unavailable错误说明
  • mac怎么预览cr3
  • 注意 Win/WP8.1开发者账户现已迁移到全新Win10开发者中心仪表盘
  • win10打不开应用市场
  • win10多任务视图不排序怎么设置
  • python挑战
  • PHP+MySQL+jQuery随意拖动层并即时保存拖动位置实例讲解
  • linux里面vim
  • 如何制作批处理
  • cocos2dx 4.0
  • jquery 报表
  • 利用js脚本模拟鼠标点击事件
  • javascript简介和语法
  • jquery查找节点
  • python三种类型
  • js框架开发实例
  • 医保月底结算规定是什么
  • 山东地域分布
  • 企业完税证明怎么打印
  • 大疆小白控和普通控哪个信号好
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设