IM的@功能

需要使用div转变为富文本内容,监听输入框中的@符号

			<div
				@input="onEditorInput"
				ref="editBox"
				contenteditable="true"
				class="send-text-area"
				@keydown.enter.prevent="sendClick"
			></div>
		// 监听输入框
		onEditorInput(e) {
			// 如果触发 @
			if (this.chatUserMsgActive.sessionType == 'group') {
				if (e.data == '@') {
					// 打开选择弹窗
					this.showAtBox(e);
				} else {
					let selection = window.getSelection();
					this.focusNode = selection.focusNode;
					// 截取@后面的名称作为过滤条件
					let stIdx = this.focusNode.textContent.lastIndexOf('@');
					this.atSearchText = this.focusNode.textContent.substring(stIdx + 1);
					// 删除@时隐藏列表
					if (stIdx == -1 && this.$refs.atBox.show) {
						this.$refs.atBox.close();
					}
				}
			}
		},

		// 显示@列表
		showAtBox(e) {
			this.atSearchText = '';
			let selection = window.getSelection();
			let range = selection.getRangeAt(0);
			// 记录光标所在位置
			this.focusNode = selection.focusNode;
			this.focusOffset = selection.focusOffset;
			// 光标所在坐标
			let pos = range.getBoundingClientRect();
            // 弹窗的坐标,通过函数传入弹窗组件
			this.$refs.atBox.open({
				x: pos.x,
				y: pos.y,
			});
		},

		// 选中@列表的值
		onAtSelect(member) {
			let range = window.getSelection().getRangeAt(0);
			// 选中输入的 @xx 符
			range.setStart(
				this.focusNode,
				this.focusOffset - 1 - this.atSearchText.length,
			);
			range.setEnd(this.focusNode, this.focusOffset);
			range.deleteContents();
			// 创建元素节点
			let element = document.createElement('SPAN');
			element.className = 'at';
			element.dataset.id = member.userId;
			element.contentEditable = 'false';
			element.innerText = `@${member.userName}`;
			range.insertNode(element);
			// 光标移动到末尾
			range.collapse();
			// 插入空格
			let textNode = document.createTextNode('\u00A0');
			range.insertNode(textNode);
			range.collapse();
			this.atSearchText = '';
			this.$refs.editBox.focus();
		},

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值