首页 > 其他分享 >光标自动定位到起始位置contenteditable="true" ,v-html绑定内容,div可编辑时,光标移到最前面

光标自动定位到起始位置contenteditable="true" ,v-html绑定内容,div可编辑时,光标移到最前面

时间:2024-03-03 21:45:26浏览次数:32  
标签:contenteditable isChange value html 组件 true 光标 赋值

出现这个问题原因:

(1)通过打断点可以看到,当你输入的时候触发input事件,提交值给父组件中的v-model;

(2)但因为在子组件中又监听了v-model的值,所以整体形成了闭环;

(3)还需要重点说明的是光标问题,contenteditable与v-html所在的元素值的改变如果不是通过输入而是通过赋值实现,光标就会跑到最前面;

所以以输入中文为例,你刚打了一个字母,立马就触发了监听与变动,光标移到最前面,自然无法完成整个正常的输入。

解决办法:

只有当blur的时候再做赋值操作(isChange为true),focus状态下不做赋值(isChange为false);

至于初始为true的原因是在父组件中直接给绑定的变量赋值时子组件中还是需要触发赋值的(isChange为true);

<!-- Created by dreamsqin on 2019/9/5 -->
<template>
  <div
    class="div-editable"
    contenteditable="true"
    v-html="innerText"
    @input="changeText"
    @focus="isChange = false"
    @blur="blurFunc"></div>
</template>

<script>
  export default {
    name: 'DivEditable',
    props: {
      value: {
        type: String,
        default: ''
      }
    },
    data() {
      return {
        innerText: this.value,
        isChange: true
      }
    },
    watch: {
      value() {
        if (this.isChange) {
          this.innerText = this.value
        }
      }
    },
    methods: {
      changeText() {
        this.$emit('input', this.$el.innerHTML)
      },
      blurFunc() {
        this.isChange = true
        this.$emit('blurFunc')
      }
    }
  }
</script>

<style lang="scss">
  .div-editable{
    width: 100%;
    height: 100%;
    overflow-y: auto;
    word-break: break-all;
    outline: none;
    user-select: text;
    white-space: pre-wrap;
    text-align: left;
    &[contenteditable=true]{
      user-modify: read-write-plaintext-only;
      &:empty:before {
        content: attr(placeholder);
        display: block;
        color: #ccc;
      }
    }
  }
</style>

解决办法:

只有当blur的时候再做赋值操作(isChange为true),focus状态下不做赋值(isChange为false);

至于初始为true的原因是在父组件中直接给绑定的变量赋值时子组件中还是需要触发赋值的(isChange为true);
父组件调用

<template>
  <div class="test-page">
    <div class="contain">
      <div-editable
        v-model="testContent"
        @blurFunc="blurHighLight"></div-editable>
      <el-input
        class="input-style"
        v-model="testContent"></el-input>
      <el-button
        class="button-style"
        @click="changeText">改变值</el-button>
    </div>
  </div>
</template>

<script>
  import DivEditable from '@/components/DivEditable'
  export default {
    name: 'TestPage',
    data() {
      return {
        testContent: 'dreamsqin'
      }
    },
    components: {
      DivEditable
    },
    methods: {
      blurHighLight() {
        // 这里做数据过滤或样式变更操作
      },
      changeText() {
        this.testContent = '【标签1】dreamsqin'
        this.blurHighLight()
      }
    }
  }
</script>

<style lang="scss">
  .test-page{
    height: 100%;
    display: flex;
    align-items: center;
    justify-content: center;
    .contain{
      width: 600px;
      height: 250px;
      border: 2px solid #000;
      .input-style,.button-style{
        margin-top: 10px;
      }
      .text-blue{
        color: #2080F7;
      }
    }
  }
</style>

 

<div  ref="editableDiv" class="contain"  v-html="innerText" contenteditable="true"  @input="inputText" @blur="inputBlur" @focus="inputFocus"></div>

value: {
    type: String,
    default: ''
}

innerText: this.value,
isBlur: true,

watch: {
    value() {
        if (this.isBlur) {
            this.innerText = this.value
        }
    }
},

// 监听输入框内容
inputText() {
    /*this.$emit('input', this.$refs.editor.innerHTML);*/
    this.value = this.$refs.editableDiv.innerHTML;
},
inputFocus() {
    this.isBlur = false;
},
inputBlur() {
    this.isBlur = true;
},

 

参照原文:
https://www.cnblogs.com/dreamsqin/p/11466197.html
https://juejin.cn/post/7089030626229092359

标签:contenteditable,isChange,value,html,组件,true,光标,赋值
From: https://www.cnblogs.com/shy1766IT/p/18050775

相关文章

  • 对于购物中心HTML前端页面的优化
    在对同学上学期的购物中心HTML前端页面项目进行学习后,我对它进行了优化。在原先的基础上,给它的注册、忘记密码按钮增加了跳转接口,使得这两个功能可以实现跳转,并且在商品展示页增加了返回登录页面的接口。原始代码列表:优化后代码列表:代码文件:原始登录页.html:点击查看代码<......
  • html基础知识
    第一章html简单介绍1.1html定义html:超文本标记语言(HyperTextMarkupLanguage);它的作用是控制页面的结构,页面的内容。1.2web最基本html:用于对网页元素进行整理和分类css:用于设置网页元素的版式、颜色、大小等外观样式javascript:网页模型的定义及交互的编写第二章html常见......
  • 常用日期和时间标准对比:HTML, ISO 8601, RFC 3339, RFC 5322
    1.HTML,ISO8601,RFC3339,RFC5322对比日期和时间,对于不同系统和平台之间的数据交换和互操作至关重要。本文将对比HTML标准、ISO8601、RFC3339和RFC5322,为读者提供参考。表格文字版见文末-附1.1.标准链接HTML标准:https://html.spec.whatwg.org/multipage......
  • html 乱码
    一般中文乱码的原因:1、meta标签设置的编码格式与实际文件的编码格式不符,解决方案:将meta标签和文件实际编码设置统一<metacharset="UTF-8"/>2、未设置编码格式,使用了utf-8以外的编码,解决方案:设置meta标签为对应的编码或将文件的编码格式改为utf-83、文件本身已经乱码,用vsco......
  • Vue学习笔记27--v-html
    1.v-bind:单向绑定解析表达式,可简写为:xxx2.v-model:双向数据绑定3.v-for:遍历数组、对象、字符串4.v-on:绑定事件监听,可简写为@5.v-if:条件渲染——动态控制节点是否存在6.v-else:条件渲染——动态控制节点是否存在7.v-show:条件渲染——空调控制节点是否展示8.v-text:......
  • webpack5多入口的时候HtmlWebpackPlugin怎么处理多个html文件
    constHtmlWebpackPlugin=require('html-webpack-plugin');module.exports={entry:{app1:'./src/app1.js',app2:'./src/app2.js'},output:{filename:'[name].bundle.js',path:path.resolve......
  • javaweb01-html&css
    HTML-CSS基础介绍html:超文本标记语言学习标签css:层叠样式表学习样式基础标签&样式-新浪新闻biao标题标题排版(标签介绍)标题标签h1、h2水平线标签hr图片标签img超链接a标题样式css引入方式:行内样式:内嵌样式:外联样式:<link颜色表示形式:关键字:redrbg表示法:#rgb(......
  • Java中使用Jsoup实现网页内容爬取与Html内容解析并使用EasyExcel实现导出为Excel文件
    场景Pythont通过request以及BeautifulSoup爬取几千条情话:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/87348030Node-RED中使用html节点爬取HTML网页资料之爬取Node-RED的最新版本:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/124182289Jsoup......
  • HTML 基础语法
    HTML基础语法【一】HTML概述HTML(HypertextMarkupLanguage)是一种标记语言,用于创建网页结构和内容。它是Web页面的基础,通过使用一系列的HTML标签和属性,可以描述网页的各种元素,如文本、图像、链接、表格等。HTML文档由HTML标签和文本组成,每个标签用于定义文档中的不同部分或元......
  • PDFUtils (解析PDF 中的文本 和 图片 PDF 转 HTML HTML 转 PDF)
    引入pdfbox依赖<dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.19</version></dependency>packagecom.icil.swif......