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

  • vivos9能开空调吗(vivos9e手机能开空调吗)

    vivos9能开空调吗(vivos9e手机能开空调吗)

  • oppo手机如何删除耗电详情(oppo手机如何删除本地铃声)

    oppo手机如何删除耗电详情(oppo手机如何删除本地铃声)

  • 荣耀x10能进行内存扩展吗(华为荣耀x10能不能装内存卡)

    荣耀x10能进行内存扩展吗(华为荣耀x10能不能装内存卡)

  • 华为荣耀9x屏幕多长(华为荣耀9x屏幕亮度)

    华为荣耀9x屏幕多长(华为荣耀9x屏幕亮度)

  • 漫游记录是什么(漫游记录是什么意思?)

    漫游记录是什么(漫游记录是什么意思?)

  • 升级miui12会清除数据吗(升级miui12后还能退回去吗)

    升级miui12会清除数据吗(升级miui12后还能退回去吗)

  • 微信吃西瓜表情代表什么(微信吃西瓜表情在哪)

    微信吃西瓜表情代表什么(微信吃西瓜表情在哪)

  • airpods二代港版和国行区别(airpods二代港版多少钱)

    airpods二代港版和国行区别(airpods二代港版多少钱)

  • qq克隆什么意思(qq克隆有风险吗)

    qq克隆什么意思(qq克隆有风险吗)

  • 手机qq离线说明什么(qq离线手机端是实时显示么)

    手机qq离线说明什么(qq离线手机端是实时显示么)

  • 腾讯超级视频vip会员有什么用(腾讯超级视频vip会员是什么意思)

    腾讯超级视频vip会员有什么用(腾讯超级视频vip会员是什么意思)

  • 手机充电器是多少w(手机充电器是多少w的)

    手机充电器是多少w(手机充电器是多少w的)

  • 微信未读消息全部读取(微信未读消息全部已读)

    微信未读消息全部读取(微信未读消息全部已读)

  • 手机怎么修改软件图标(手机怎么修改软件数据)

    手机怎么修改软件图标(手机怎么修改软件数据)

  • 酷狗苹果版怎么找本地音乐(酷狗苹果版怎么扫码登录)

    酷狗苹果版怎么找本地音乐(酷狗苹果版怎么扫码登录)

  • 唯品会怎么改登录号码(唯品会怎么更改登录名)

    唯品会怎么改登录号码(唯品会怎么更改登录名)

  • 提炼正文两个步骤(提炼文章)

    提炼正文两个步骤(提炼文章)

  • 怦然心动漫画(怦然心动漫画结局)

    怦然心动漫画(怦然心动漫画结局)

  • 小米8软件闪退(小米软件闪退怎么解决)

    小米8软件闪退(小米软件闪退怎么解决)

  • 抖音发视频怎么配文字(抖音发视频怎么赚钱)

    抖音发视频怎么配文字(抖音发视频怎么赚钱)

  • 苹果手机描述文件是空白的怎么办(苹果手机描述文件在哪里)

    苹果手机描述文件是空白的怎么办(苹果手机描述文件在哪里)

  • 苹果系统降级有风险吗(苹果系统降级有影响吗)

    苹果系统降级有风险吗(苹果系统降级有影响吗)

  • 抖音抖动转场(抖音抖动转场特效怎么弄)

    抖音抖动转场(抖音抖动转场特效怎么弄)

  • Win10 Build 21354 太阳谷ISO镜像版体验报告 含下载地址

    Win10 Build 21354 太阳谷ISO镜像版体验报告 含下载地址

  • 微软和谷歌将修复Win10中使用Chrome浏览器的关键音频问题(微软和google)

    微软和谷歌将修复Win10中使用Chrome浏览器的关键音频问题(微软和google)

  • MAC用“预览”打开指定目录下图片的操作步骤(mac如何打印预览)

    MAC用“预览”打开指定目录下图片的操作步骤(mac如何打印预览)

  • 使用VitePress搭建及部署vue组件库文档(virtono搭建教程)

    使用VitePress搭建及部署vue组件库文档(virtono搭建教程)

  • 什么是土地使用权终结
  • 工资里个人代扣款是什么
  • 税号都是数字吗
  • 进项税额转出忘记填在申报表里
  • 财务报表分析五种方法
  • 住宿费进项税分录
  • 事业支出中的其他支出
  • 奖金属于应付职工薪酬
  • 借别人的公账转账犯法吗
  • 非正常原因导致的存货盘亏或毁损非正常原因是哪些
  • 冲暂估成本的会计分录
  • 预付办公室装修款
  • 城建税当月缴纳要计提吗
  • 单位给职工租房属于福利政策文件
  • 小微企业季度超过45万如何填申报表
  • 地税三方协议是什么意思
  • 外汇网上申报操作流程图
  • 哪些会计凭证不需要依法保存
  • 定额手撕发票怎么买
  • 代理国库税收收缴怎么做账
  • 电商公司购买拍照违法吗
  • 外经证金额没开完需要核销吗
  • win11打开设置
  • 鸿蒙系统桌面布局图片怎么设置
  • win11如何关闭开机自启动项
  • 新版edge浏览器设置背景图片
  • 农业公司收到项目资金
  • 单位出纳的业务有哪些
  • 个税是每个月累计纳税额吗
  • windows 11预览版
  • win10电脑防火墙如何关闭
  • 无线路由器怎么连接
  • 一个完整的php文件有哪些元素组成
  • 软件企业职工培训费税前扣除标准
  • iis制作网页
  • 职工教育经费可以以后年度结转吗
  • 一文教会你何为重绘、回流?
  • vue实战开发项目视频
  • 【机器学习】KNN算法及K值的选取
  • python快速检索
  • 代收水电费交税吗
  • 费用化支出期末一般转入哪个账户?
  • pandas inner join
  • 企业无形资产摊销的会计处理
  • 公司购买烟酒怎么入账
  • 社保费用如何入现金流量表
  • 增值税现代服务业包括哪些内容
  • 预计净残值影响折旧吗
  • 施工企业结算单能不能入账
  • 以前年度出口退税未收汇
  • 存货周转率越高好还是越低好
  • 进口货物的价格组成有哪些
  • 小微企业的认定标准2023最新
  • 如何对会计感兴趣
  • 新公司成立建账流程
  • 中小型企业会计
  • access数据库sql语言
  • Mysql主库死锁了导致从库停止复制
  • cf游戏初始化失败是因为什么
  • wlms.exe是什么
  • windows8怎么更新到最新版本
  • win7自动更新在哪
  • win8系统屏幕亮度调节
  • win7 32位旗舰版电脑城下载
  • Unity3D游戏开发pdf
  • 如何理解闭包,闭包的优缺点
  • unity自动生成
  • 可交互原型是什么
  • linux的ftp命令
  • node.js的express
  • html微信
  • python selectfrommodel
  • js面向对象是什么意思
  • javascript 对象的this指向
  • python 判断字符串编码
  • 土地重置成本价
  • 广西2023新农合报销政策
  • 无房怎么办
  • 税控发票证书密码是什么
  • 劳务报酬预缴税率表
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设