vue2实现带表情输入框

通过HTML标签的contenteditorable属性实现一个带表情图片输入的输入框

  • 实现效果如下
    在这里插入图片描述
  • 这里主要是通过contenteditorable属性操作dom,在点击表情的时候往对应位置添加img标签
  • 主要实现代码如下(vue2)
<template>
  <div class="o-input">
    <div class="head">
      <i class="emoji-btn iconfont icon-xiaolian" title="表情">
        <div class="emoji-box">
          <img
            v-for="(item, index) in emojiList"
            :key="index"
            :src="item.src"
            :title="item.name"
            @click.stop="handleEmoji(item)"
          />
        </div>
      </i>
      <i class="iconfont icon-tupian" title="图片"></i>
      <i class="iconfont icon-wenjianjia" title="文件"></i>
    </div>
    <div
      @click="clickInput"
      @input="inputHandle"
      @keyup="keydownEvent"
      class="input-box"
      ref="inputBox"
      contenteditable="true"
    ></div>
    <div class="send-btn">
      <button>发送</button>
    </div>
  </div>
</template>

<script>
import {
      emojiList } from "./emoji";
import {
      parseToText } from './util';
export default {
     
  name: "o-input",
  data() {
     
    return {
     
      emojiList: emojiList,
    };
  },
  methods: {
     
    keydownEvent(e){
     
      if(e.keyCode === 13) {
     
        let range = window.getSelection().getRangeAt(0);
        range.endContainer.setAttribute("name", "o-input-div---")
      }
    },
    handleEmoji(emoji) {
     
      var selection = window.getSelection(); // 获取光标
      if ( // 如果没有焦点或者焦点不在输入框内,聚焦到输入框
        selection.anchorNode !== this.$refs.inputBox &&
        !this.$refs.inputBox.contains(selection.anchorNode)
      ) {
     
        // 聚焦到输入框
        selection.removeAllRanges();
        this.$refs.inputBox.focus();
        if (this.$refs.inputBox.lastChild)
          selection.getRangeAt(0).setStartAfter(this.$refs.inputBox.lastChild);
        selection.collapseToEnd();
      }
      // 创建节点
      let img = document.createElement("img");
      img.src = emoji.src;
      img.className = "in-img";
      img.setAttribute("name", emoji.regName);

      let range = selection.getRangeAt(0);
      range.deleteContents();

      range.insertNode(img);
      range = range.cloneRange();
      range.setStartAfter(img);
      range.collapse();
      selection.removeAllRanges();
      selection.addRange(range);
      this.inputHandle();
    },
    // 点击输入框内的图标时,移动光标到对应位置
    clickInput(e) {
     
      // 如果点击的不是HTML标签,无需处理
      if (!(e.target instanceof HTMLImageElement)) {
     
        return;
      }
      let target = e.target;
      // 获取点击图片的中心位置
      let targetX = target.x + Math.floor(target.width / 2);

      let selection = window.getSelection(); // 获取光标
      let range = selection.getRangeAt(0);

      range = range.cloneRange();
      range.setStartBefore(target);
      if (e.x < targetX) {
     
        range.setEndBefore(target);
      } else {
     
        range.setEndAfter(target);
      }

      range.collapse();
      selection.removeAllRanges();
      selection.addRange(range);
    },

    inputHandle(){
     
      let html = this.$refs.inputBox.innerHTML;
      let text = parseToText(html);
      console.log(text);
    }
  },
};
</script>

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
基于Vue2.0实现在线客服的方法有多种。首先,你可以使用已经存在的基于Vue2.0开发的在线客服系统,如引用所提到的。该系统包括服务端和客户端,并具有支持1个客服对多个用户、客户选择客服、输入框支持文本、图片、表情、文件传输、粘贴图片和文本表情混合等特性。你可以按照该系统的文档或示例来进行集成和配置。 另外,如果你想自己实现在线客服功能,你可以根据你的需求来编写自定义的代码。一个常见的方法是使用Vue组件来创建聊天窗口和通信功能。你可以创建一个聊天组件,其中包括输入框、消息列表等子组件。在组件中,你可以使用Vue的事件机制来处理用户和客服之间的通信。例如,当用户发送消息时,你可以通过触发一个自定义事件将消息发送给服务端。服务端可以使用WebSocket或其他通信方式将消息转发给相应的客服。客服收到消息后,可以通过服务端将回复发送回前端并显示在消息列表中。 此外,你还可以使用第三方库或插件来简化开发过程。例如,引用所提到的_MEIQIA函数可以在Vue模板中直接调用,从而实现在线客服功能。 综上所述,实现Vue2.0的在线客服功能的方法包括使用已经存在的在线客服系统、自定义编写代码来实现通信功能以及使用第三方库或插件来简化开发过程。具体选择哪种方法取决于你的需求和技术背景。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值