div仿input的使用

2023-05-16

需求描述,输入框支持文本输入,以及支持标签在对应节点的插入。

1、首先封装组件,通过父子组件传参的方式进行数据的处理

  • 用富文本插件体积略大
  • 通过div标签的contenteditable属性来处理成仿input
  • 同时要处理在输入时,光标位置的问题。
  <div
    ref="divInput"
    class="edit-div"
    style="-webkit-user-select: auto"
    :contenteditable="canEdit"
    @blur="onBlur"
    @input="changeText($event)"
    @keyup.space="changeSpace($event)"
    @keyup.enter="changeEnter($event)"
    @paste="onPaste"
    @focus="onFocus"
    placeholder="请输入消息内容"
    slot="title"
    v-html="innerText"
  ></div>
 
 props: {
    value: {
      type: String,
      default: "",
    },
    canEdit: {
      type: Boolean,
      default: false,
    },
  },
data() {
    return {
      innerText: this.value,
      isLocked: false,
    };
  },
  watch: {
    value() {
      if (!this.isLocked && !this.innerHTML) {
        this.innerText = this.value;
      }
    },
  },
  methods: {
    getRefBlur() {
      this.$refs.divInput.blur();
    },
    getRefFocus() {
      this.$refs.divInput.focus();
    },
    onBlur() {
      this.$emit("onblurChange", this.$el.innerHTML);
      this.isLocked = false;
    },
    // 主要用于处理光标得定位问题
    keepLastIndex(obj) {
      if (window.getSelection) {
        obj.focus();
        var range = window.getSelection();
        range.selectAllChildren(obj);
        range.collapseToEnd();
      } else if (document.selection) {
        var range = document.selection.createRange(); //创建选择对象
        // var range = document.body.createTextRange();
        range.moveToElementText(obj); //range定位到obj
        range.collapse(false); //光标移至最后
        range.select();
      }
    },
    changeSpace(e) {
      let that = this;
      setTimeout(() => {
        that.keepLastIndex(e.target);
      }, 30);
      this.$emit("keyupSpace", this.$el.innerHTML);
    },
    changeEnter(e) {
      let that = this;
      setTimeout(() => {
        that.keepLastIndex(e.target);
      }, 30);
      this.$emit("keyupEnter", this.$el.innerHTML);
    },
    changeText($event) {
      let that = this;
      setTimeout(() => {
        that.keepLastIndex($event.target);
      }, 30);
      that.$emit("input", that.$el.innerHTML);
    },
    // 输入框粘贴事件
    onPaste(event) {
      this.$emit("onPaste", event);
    },

2、在父组件中引入,并且传参

 <contenteditable-Input
                    ref="imitate"
                    id="imitate"
                    class="imitate-input imitate-placeholder js-imitate-input"
                    :canEdit="!item.readonlyFlag"
                    @onblurChange="onblurChange($event, item)"
                    @onFocus="getFocus"
                    @onPaste="onPaste"
                    v-html="item.temView"
                    @input="contentedInput($event, item)"
                    @keyupSpace="contentedKeySpace($event, item)"
                    @keyupEnter="contentedKeyEnter($event, item)"
                    @changeKeyup="changeKeyup($event, item)"
                  >
                  </contenteditable-Input>
  • 需要注意的一点是,通过div仿的input框它的返回值是innerHTML,是输入框中所有文本字符串,同时在输入的时候可能会引起键盘的闪烁,
  • 我的解决方案就是,通过自定义变量进行赋值,在最后保存时将自定义的变量对后端要求的字段进行复制,同时页面中的item.temView是后端要求字段。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

div仿input的使用 的相关文章

随机推荐

  • tftp命令怎么传输文件,5步掌握tftp命令的使用方法

    FTP让用户得以下载存放于远端主机的文件 xff0c 也能将文件上传到远端主机放置 tftp是简单的文字模式ftp程序 xff0c 它所使用的指令和FTP类似 IIS7服务器管理工具可以批量管理 定时上传下载 同步操作 数据备份 到期提醒
  • filezilla ftp设置,7步完成filezilla ftp设置

    FTP服务器 File Transfer Protocol Server 是在互联网上提供文件存储和访问服务的计算机 xff0c 它们依照FTP协议提供服务 FTP是文件传输协议 xff0c 就是专门用来传输文件的协议 这篇文章主要介绍fi
  • 8uftp无法取得目录列表,解决8uftp无法取得目录列表的问题只需4步

    最近发现自己买的香港空间出现一个很严重的问题 xff0c ftp连接时无法取得目录列表 xff0c 因为之前一直固定在一家买空间 xff0c 所以善良的我很自然的打电话给这位老朋友让他赶紧起床看一看 xff0c 当时是凌晨两点半 几分钟后
  • 大数据ftp软件,2步完成大数据ftp软件的连接与命令操作

    ftp软件是什么软件 xff0c 可能有人会回答说不知道 xff0c 因为一般只有从事网站管理的工作者会使用的多一点 但不是每个人生来就会的 xff0c 所以刚开始肯定都会学习怎么使用ftp软件 这篇文章就来告诉大家大数据ftp软件大数据f
  • PID算法控制平衡小车直立

    1 平衡小车直立控制 xff1a 如果我们要控制一根木棍在手上直立 xff0c 需要两个步骤 gt 托着木棒的手可以移动 gt 眼睛能看到木棒的倾斜角度和倾斜趋势 xff08 角速度 xff09 类比到平衡小车中 xff0c 同理想让小车保
  • 数据结构 - 链式队列

    1 链式队列 链式队列 xff1a 用链表形式实现的队列 链表结点为队列数据存储区 xff0c 链表结点包括两部分数据存储 区和指针存储区 数据存储区 xff1a 存放真实有效数据的区域 指针存储区 xff1a 存放下一个链表结点的地址 2
  • Sugar BI:如何在下钻中改变地图范围

    下钻是指在点击本图表的某一部分时 xff0c 可以打开一个新的图表或超链接 xff0c 进而查看与图表此部分相关的详细信息 Sugar BI支持无限层级的下钻 xff0c 只要下钻的弹出展示的图表也是支持下钻的 xff0c 就可以继续配置进
  • darknet_ros部署及测试

    一 darknet ros部署 1 创建ROS工作空间 span class token function mkdir span p catkin ws src span class token builtin class name cd
  • ensp 查看命令(display)

    ensp 查看命令 xff08 display xff09 span class token number 1 span display this span class token comment 查看当前配置过的命令 span span
  • 关于HTTP 和 HTTPS

    什么是http 超文本传输协议 Http xff0c HyperText Transfer Protocol 是互联网上应用最为广泛的一种网络协议 xff0c 设计Htto最初的目的是提供一种发布和接收HTML页面的方法 xff0c 他可以
  • 关于事件流的简单理解

    JS事件 1 首先 xff0c 什么是事件 xff1f JavaScript和Html发生交互是通过事件来实现的 xff0c 事件 xff0c 就是文档或浏览器窗口发生一些特定的交互的瞬间 2 什么是事件流 xff1f 事件流就是 xff0
  • Vue中引入自定义公共组件方法以及步骤

    什么是公共组件 xff0c 公共组件的使用场景 项目中如果多个页面都显示有相同的区域内容 xff0c 则该公共区域内容可以封装成公共组件进行使用 步骤 xff1a 1 创建自定义公共组件 xff0c 在src下的components目录中自
  • vue中的data为什么是一个函数

    首先 xff1a 组件是一个可复用的Vue实例 xff0c 一个组件被创建好之后 xff0c 就可能被用在各个地方 xff0c 而组件不管被复用多少次 xff0c 组件中data数据都应该是相互隔离 xff0c 互不影响的 xff0c 基于
  • Vue中key值的作用

    Vue中key值的作用 首先v for 在列表渲染时 xff0c 我们可以用v for基于一个数组来渲染一个列表 v for指令需要使用item in arr形式的特殊语法来进行渲染列表 xff0c arr是源数据 xff0c span c
  • 电商后台管理项目d01

    电商后台管理项目d01 1 项目技术栈 2 项目初始化 3 Element UI 的按需引入 4 路由配置 5 Axios 的封装 6 实现登录功能 7 完成首页部分 8 用户管理 用户列表 9 权限管理 1 角色
  • react之jsx语法规则

    希望在之后的日子里 xff0c 能够时常更新 xff01 定义虚拟DOM时 xff0c 不要写引号 标签中混入JSX表达式时 xff0c 要用 样式的类名不要用class属性 xff0c 要是用clsaaName属性 lt h1 class
  • 电子凭证文件上传

    最近 xff0c 一直在做一些关于文件上传 xff0c 以及凭证导出打印的工作 xff0c 做一些记录 xff0c 方便日后的查阅 对了 xff0c 我在这里用的是antDesign这个第三方组件 文件上传 vue模板中 lt p gt l
  • 可视化图表API格式要求有哪些?Sugar BI详细代码示例(2)

    Sugar BI中的每个图表可以对应一个数据 API xff0c 用户浏览报表时 xff0c 选定一定的过滤条件 xff0c 点击 查询 按钮将会通过 API 拉取相应的数据 xff1b 前面说过 xff0c 为了确保用户数据的安全性 xf
  • "Warning: GetWindowMenuPopup failed! "

    对mdi程序中一个弹出菜单警告原因的分析 作者 laomai 网址 http blog csdn net laomai xff08 转载时请注明出处 xff09 一 引子 最近在编译一个别人的mdi程序代码 xff0c 在调试程序时 vc6
  • div仿input的使用

    需求描述 xff0c 输入框支持文本输入 xff0c 以及支持标签在对应节点的插入 1 首先封装组件 xff0c 通过父子组件传参的方式进行数据的处理 用富文本插件体积略大通过div标签的contenteditable属性来处理成仿inpu