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

  • “营销”不是你“负面”的挡箭牌(营销的不是产品,而是认知)

    “营销”不是你“负面”的挡箭牌(营销的不是产品,而是认知)

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

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

  • python 匿名函数(python 匿名函数用法)

    python 匿名函数(python 匿名函数用法)

  • oppo a3耳机模式怎么关闭(oppoa3耳机模式)

    oppo a3耳机模式怎么关闭(oppoa3耳机模式)

  • 手机通知栏不显示信息怎么设置(手机通知栏看不见)

    手机通知栏不显示信息怎么设置(手机通知栏看不见)

  • 平板激活出错怎么恢复(平板激活出错怎么解决)

    平板激活出错怎么恢复(平板激活出错怎么解决)

  • word空白页怎么自制封面(word空白页怎么删除最后一页)

    word空白页怎么自制封面(word空白页怎么删除最后一页)

  • qq钱包积分怎么不见了(qq钱包积分怎么获得)

    qq钱包积分怎么不见了(qq钱包积分怎么获得)

  • 苹果11pro max电池能用多久(苹果11pro max电池参数)

    苹果11pro max电池能用多久(苹果11pro max电池参数)

  • 蓝牙热点和wifi热点谁更耗电(蓝牙热点和wifi热点哪个网速快)

    蓝牙热点和wifi热点谁更耗电(蓝牙热点和wifi热点哪个网速快)

  • 抖音允许个人发广告吗(抖音允许个人发作品吗)

    抖音允许个人发广告吗(抖音允许个人发作品吗)

  • 帮别人微信实名认证有什么风险(帮别人微信实名认证会怎么样)

    帮别人微信实名认证有什么风险(帮别人微信实名认证会怎么样)

  • qq相册的照片久了为什么会模糊(qq相册的照片久了会丢吗)

    qq相册的照片久了为什么会模糊(qq相册的照片久了会丢吗)

  • qq删除好友后空间点赞还在吗(qq删除好友后空间为什么还能显示动态)

    qq删除好友后空间点赞还在吗(qq删除好友后空间为什么还能显示动态)

  • hdi板与普通pcb的区别(hdi板是用在什么上的)

    hdi板与普通pcb的区别(hdi板是用在什么上的)

  • 三星手机的OTG设置在哪

    三星手机的OTG设置在哪

  • macbook和air的区别(macbook 和air)

    macbook和air的区别(macbook 和air)

  • 小米手机fast boot什么意思(小米手机fastboot 无法开机)

    小米手机fast boot什么意思(小米手机fastboot 无法开机)

  • 怎样移动应用软件(怎样移动应用软件图标)

    怎样移动应用软件(怎样移动应用软件图标)

  • 手机微信分身怎么弄(手机微信分身怎么登录不上)

    手机微信分身怎么弄(手机微信分身怎么登录不上)

  • ps混合模式在哪里(ps混合模式在哪个窗口)

    ps混合模式在哪里(ps混合模式在哪个窗口)

  • 怎么在excel中查找关键字(怎么在excel中查重复项)

    怎么在excel中查找关键字(怎么在excel中查重复项)

  • 手机怎么拍2寸照片(手机怎么拍2寸蓝底照片)

    手机怎么拍2寸照片(手机怎么拍2寸蓝底照片)

  • 运算器是执行什么和什么运算的部件(运算器是执行什么的器件)

    运算器是执行什么和什么运算的部件(运算器是执行什么的器件)

  • 淘宝apass会员取消了吗(淘宝apass会员消费多少)

    淘宝apass会员取消了吗(淘宝apass会员消费多少)

  • 华为荣耀10游戏模式在哪里开启(荣耀10的游戏模式)

    华为荣耀10游戏模式在哪里开启(荣耀10的游戏模式)

  • 减免税款的会计分录摘要
  • 怎么从营业执照上看是不是一般纳税人
  • 科目余额表一定要编吗
  • 员工住院的发票可以做账吗
  • 成品油跨月发票红字冲销步骤
  • 权益法核算的好处
  • 申请发票增额有没有什么条件
  • 企业职工遣散费标准
  • 来料加工企业的人工工资计入什么费用
  • 进项税转出申报表能填负数吗
  • 材料税款抵扣
  • 进口材料海关到港
  • 进项转出再差额征收待抵扣
  • 汽车销售公司购进车辆怎么做账
  • 房地产预缴增值税是含税还是不含税
  • 开发商按揭贷款担保责任有哪些
  • 单次劳务费税率
  • 安装工程开发票
  • 增值税怎么勾选
  • 福利费开专票怎么处理
  • 何时进行文化事业建设
  • 邮政通信业
  • 商品和安装能开什么发票
  • 房子报废
  • 库存现金长短款怎么算
  • 代理进口业务受托方账务处理流程
  • 企业延期缴纳税款
  • 工商年报人数是12月人数吗
  • 增值税减免算什么费用
  • 出口退税申请流程
  • php常用函数
  • macbookpro桌面整理
  • 网速不稳定的解决方法
  • 企业分红的会计科目
  • 定向增发后送股成本价
  • 预算周转金会计怎么做账
  • 建筑公司结算会计
  • matlab绘图总结
  • 长期借款账务处理会计分录怎么写
  • css实现文字颜色渐变
  • html前端开发教程
  • php的foreach
  • 政府性基金账务处理
  • php static变量
  • 技术服务增值税申报表怎么填
  • 增值税发票货物名称要求
  • sql报数字溢出
  • 电子承兑提示付款提前几天
  • sqlserver时间格式化时分秒
  • 期初余额调整怎么做凭证
  • 收到一张普通发票怎么做账
  • 房地产项目公司组织架构
  • 事业单位破产清算开户流程
  • 企业一次性伤残就业补助金是由保险赔付吗
  • 会计凭证保管期限30年是哪一年开始的
  • 工程结算怎么结转收入
  • 计划成本下
  • 溢价发行股票的交易费用
  • 金税盘缴销发票
  • 国税地税合并的时间
  • sqlserver数据库恢复挂起状态
  • win1020h2版好不好
  • pdv是什么格式文件
  • powershow是什么意思
  • win10官方升级工具升级
  • windows8如何调用摄像头
  • linux新手入门教程
  • vim安装ycm
  • python转换语句
  • 使用jquery操作dom
  • jquery input checked
  • js窗口关闭触发事件
  • 我置顶你也只顶你
  • ajax支持浏览器back按钮吗
  • python各进制符号
  • jquery实现图片横向移动
  • python socket模块
  • 辽宁省国家税务局官网
  • 要深化税收制度改革健全
  • 怎么查询手机发票
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设