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

  • 360摄像头怎么恢复出厂设置(360摄像头怎么恢复出厂设置解绑手机)

    360摄像头怎么恢复出厂设置(360摄像头怎么恢复出厂设置解绑手机)

  • vivox70怎么设置定时开关机(vivox70怎么设置动态壁纸)

    vivox70怎么设置定时开关机(vivox70怎么设置动态壁纸)

  • oppor9s强制恢复出厂(oppor9sk强制恢复出厂)

    oppor9s强制恢复出厂(oppor9sk强制恢复出厂)

  • 红米k20和红米k20pro手机壳通用吗(红米k20和红米k20pro屏幕是一样的吗)

    红米k20和红米k20pro手机壳通用吗(红米k20和红米k20pro屏幕是一样的吗)

  • 在b站搬运其他人的原创视频,怎么做才对(在B站搬运其他人的原创视频,怎样)

    在b站搬运其他人的原创视频,怎么做才对(在B站搬运其他人的原创视频,怎样)

  • 快手7天无理由退货规则(快手7天无理由退货运费谁出)

    快手7天无理由退货规则(快手7天无理由退货运费谁出)

  • QQ不加好友怎么发信息(qq不加好友怎么发信息)

    QQ不加好友怎么发信息(qq不加好友怎么发信息)

  • 电话号码不用了怎么注销(电话号码不用了微信怎么登录)

    电话号码不用了怎么注销(电话号码不用了微信怎么登录)

  • 信息网络主要划分什么(信息网络的主要构成部分)

    信息网络主要划分什么(信息网络的主要构成部分)

  • 屏幕指纹解锁反应迟钝(屏幕指纹反应比后置指纹慢)

    屏幕指纹解锁反应迟钝(屏幕指纹反应比后置指纹慢)

  • 电脑微信如何使用摄像头(电脑微信如何使用账号登录)

    电脑微信如何使用摄像头(电脑微信如何使用账号登录)

  • 快手一点直播就闪退(快手一直播就卡)

    快手一点直播就闪退(快手一直播就卡)

  • 兄弟是什么(兄弟是什么生肖)

    兄弟是什么(兄弟是什么生肖)

  • 荣耀手环3怎么恢复设置(荣耀手环3怎么调整时间)

    荣耀手环3怎么恢复设置(荣耀手环3怎么调整时间)

  • 魔筷星选开通要收费吗(开通魔筷星选还用交保证金吗)

    魔筷星选开通要收费吗(开通魔筷星选还用交保证金吗)

  • iphonexsm港版支持电信吗(xsmax港版可以用电信卡吗)

    iphonexsm港版支持电信吗(xsmax港版可以用电信卡吗)

  • 快手拍视频怎么延时拍摄(快手拍视频怎么保存到手机相册)

    快手拍视频怎么延时拍摄(快手拍视频怎么保存到手机相册)

  • vivo手机查找(vivo手机查找设备功能在哪里)

    vivo手机查找(vivo手机查找设备功能在哪里)

  • 目前常用的操作系统有哪些(目前常用的操作系统软件有哪三个)

    目前常用的操作系统有哪些(目前常用的操作系统软件有哪三个)

  • 微信朋友圈显示非对方朋友是什么意思(微信朋友圈显示不全)

    微信朋友圈显示非对方朋友是什么意思(微信朋友圈显示不全)

  • mate20pro充电器规格(mate20pro配的充电器)

    mate20pro充电器规格(mate20pro配的充电器)

  • 抖音换发型特效怎么拍(抖音换发型特效在哪里)

    抖音换发型特效怎么拍(抖音换发型特效在哪里)

  • 企业所得税减免所得税额计算公式
  • 外地预缴税金
  • 管理费用中的办公费占比是多少
  • 继续教育容易过吗
  • 发票验旧期限
  • 加计抵扣进项税进营业外收入
  • 贷款公司股权转让合法吗
  • 营业额和合同额的区别
  • 如何合理把公司的钱拿出来
  • 资产总计是期初余额吗
  • 红字发票没有地址和银行信息跨月了无法作废
  • 营业税金及附加包括增值税吗
  • 留抵税额抵减欠税文件
  • 如何加强存货管理内部控制
  • 专项补助资金补助的领域包括
  • 属于制造费用的有
  • 外商投资企业母公司派到境内职员回国后
  • 天猫开发票需要确认收货吗?
  • 事业单位需要写自传吗
  • 内蒙古地税电子税务局app
  • 公司投资另一家公司怎么做科目
  • 美元结汇需要多长时间
  • 一般纳税人财务报表申报流程
  • 工资结算天数
  • 鼠标玩游戏飘怎么回事
  • 财务预提
  • php可变参数
  • 贷款钱到账又被转出去
  • 经营出租设备属于什么科目
  • wordpress抓取网页
  • 电脑中的guest账户在哪里
  • php file_append
  • 员工内部罚款有没有上限和下限
  • 营改增开始时间
  • 金融业贷款损失多少
  • 企业会计的日常行为准则
  • php消息队列kafka
  • joomla中文手册
  • php数学
  • 网络课平台用交税吗
  • 帝国cms真的很好用
  • 购入固定资产的预算会计账务处理
  • 新办商贸企业是国企吗
  • 免征企业所得税的有哪些行业
  • 银行代发工资流程
  • 各种账簿的登记依据和登记方法分别是什么
  • 内账中采购另付的税点算成本还是费用
  • 农副产品普通发票可以抵扣增值税吗
  • 成本票可以用在下个季度吗
  • 注册公司时企业类型为什么没有自然人独资
  • 企业所得税征税范围是
  • 企业发放职工薪酬的账务处理
  • 递延收益确认的递延所得税资产有期限吗
  • 甲公司控股乙公司
  • 劳务公司拿什么挣钱
  • 发票盖发票专用章
  • 委托收款商业汇票
  • mysql中间件有哪些
  • 批量修改 sql
  • win7怎么创建新用户
  • linux系统中用户账户有哪些分类
  • windows安装服务器
  • 电脑图片打印不出来怎么办
  • win10每周更新
  • linux扩充inode
  • win8手提电脑怎么关闭触摸板
  • ajax 编码
  • 第四章之BootStrap表单与图片
  • 安卓手机的手势密码保存在哪个文件
  • Python装饰器实现几类验证功能做法实例
  • unity3d怎样导入资源
  • android 点击按钮如果数据库有数据就更新,没有就创建
  • Unity3D游戏开发(第2版)pdf
  • python3解析json
  • java script课程
  • Python遍历文件夹中的图片
  • python语言文件
  • 广东省地方税务局发票查询
  • 广西地方税务局2017年公务员拟录用
  • 湖北安徽是一个地方吗
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设