有时候我们希望实现点击一段div内文本时就能直接进行编辑,当然使用文本框、富文本等也可以实现,但终究有些麻烦。

目录

效果预览

参数介绍

封装与使用

使用效果差异

plaintext-only 的效果

使用contenteditable = "true" 的效果


效果预览

今天我给大家介绍的这种方式是直接使用div的 contenteditable 属性,即可实现div的文本编辑效果。

参数介绍

首先介绍一下 contenteditable 属性,一般情况下使用的是 true 和 false (允许编辑与不可编辑),因为看了一篇文章详细介绍的时候提到了谷歌可以实现纯文本输入的方式,所以以上是使用了 plaintext-only 。

参考链接中的描述截图

封装与使用

现在直接贴出我写好的组件代码吧,要讨论使用 true 和 plaintext-only 的区别,感兴趣的朋友可以在最后查看。

封装的组件:ytDivEdit

<template><div class="yt-div-edit"contenteditable="plaintext-only"@input="changeDivText($event)"@focus="divFocus"@blur="divBlur"v-html="value">{{value}}</div>
</template><script>export default {name: 'ytDivEdit',data() {return {editText: ""}},props: {value: {type: String,default: ""}},created() {this.editText = this.value},methods: {// 文本改变时事件changeDivText(event) {this.editText = event.target.innerHTML},divFocus() {this.editText = this.value},divBlur() {this.$emit("input", this.editText)}}}
</script>

以上代码思路毕竟直观,通过绑定三个事件,其中@input事件是每一次输入时都会有响应的,所以我使用了一个内部变量editText来存储;当得到焦点时,将外部的值赋值到内部变量;而在失去焦点时,才一次性地把输入的内容抛出事件以更新绑定值。

其中注意的是@input事件需要用到 $event 来捕捉事件,这样能够得到直接得到输入的内容。

使用,其中的 description 就是与之绑定的变量

<yt-div-edit class="description" v-model="description"></yt-div-edit>

如果需要改成 true,那么直接在上面第3行中修改就可以了。

使用效果差异

这里只写true 和 plaintext-only,其他的留给大家去探讨哈。

plaintext-only 的效果

使用 plaintext-only 的使用,所保存的内容比较简单,仅保留文本,换行是以回车符的形式保存。

后端返回的换行是以\n作为转义符换行

使用contenteditable = "true" 的效果

此处特地粘贴了一个带有底纹样式的内容在上面,我们会发现在保存时,会连带样式代码也一起保留在里面了。

因为太长了这里贴出来给大家看看

前端传递:
description: "我现在来测试一下使用div编辑框的效果&nbsp;<div>使用div编辑的好处是可以直接点击文本就进行修改,换行的内容则以回车的形式保存</div><div><br></div><div>现在是直接使用<span style="background-color: rgb(246, 246, 246); color: rgb(51, 51, 51); font-family: Consolas, Monaco, &quot;Andale Mono&quot;, &quot;Ubuntu Mono&quot;, monospace; font-size: 13px;">contenteditable="true"的形式</span></div>"后端返回:
"description":"我现在来测试一下使用div编辑框的效果&nbsp;<div>使用div编辑的好处是可以直接点击文本就进行修改,换行的内容则以回车的形式保存</div><div><br></div><div>现在是直接使用<span style=\"background-color: rgb(246, 246, 246); color: rgb(51, 51, 51); font-family: Consolas, Monaco, &quot;Andale Mono&quot;, &quot;Ubuntu Mono&quot;, monospace; font-size: 13px;\">contenteditable=\"true\"的形式</span></div>"

使用true时,换行是通过新建一个div来实现的,如果是间隔空行,则以 br 来填充。

另外,可以直接可以直接复制粘贴带样式的html代码,也就是可以保留一定的样式效果,但是代码就比较长了咯。其实这里还有一点不太方便的地方,就是复制的样式带有一定的黏性,即使换行了还会依然保留。

至于以上的问题需要如何解决,请点击下方的参考链接。

参考链接:

https://blog.csdn.net/z736248591/article/details/88083366

https://my.oschina.net/u/3680343/blog/1588420

Vue中实现div编辑效果,及contenteditable设置为plaintext-only与true的区别相关推荐

  1. 前端进阶必备技能:Vue中如何定制动画效果

    作为前端程序员,前端火起来的短短几年里技术更新迭代特别快,不仅是新的框架繁多,Vue,React,Angular轮番上场,各种工具,插件,库也是琳琅满目,就连基础的JavaScript语法的更新也是年 ...

  2. Angular5实现组件缓存(RouteReuseStrategy)类似vue中的keep-alive的效果

    Angular和React中实现组件的缓存是没有类似vue中的<keep-alive></keep-alive>这种很爽的方式的,但是并不意味着Angular和React不能实 ...

  3. Vue中使用LayUI没有效果

    Vue中使用LayUI 使用webpack打包项目: 在主HTML页面中引入Layui的css文件和脚本文件 例如使用form模块,在当前Vue实例挂载的时候,引入模块 这里我用的时form表单的模块 ...

  4. vue中excel的编辑、导入、导出

    目录 方案 x-data-spreadsheet + xlsx luckysheet + luckyexcel + exceljs + file-saver 效果 x-data-spreadsheet ...

  5. vue中禁止ios橡皮筋效果(亲测有效)

    相信有很多前端的朋友都遇到过这个问题,这个问题真的很头疼.ios的橡皮筋效果会带来一些莫名其妙的bug.如果直接对body禁止的话,那整个页面都无法滑动了.所以我今天带来一个解决方案.原博客找不到了, ...

  6. Vue中实现拖拽效果

    Vue2项目中遇到需求要求页面左侧部分实现拖拽效果 实现效果: 1665739151500 实现代码: 一.使用盒子包裹需要拖拽的区域,并绑定ref 二.使用$ref获取DOM信息 具体代码(这个方法 ...

  7. Vue中图片实现毛玻璃效果

    举例(Ant Design 的 Image 组件的官方示例图片): 实现: <div class="background"><div class="ba ...

  8. Vue中实现图片放大镜效果代码 复制即可用

    页面布局的结构如下: <div class="spec-preview"><img :src="xxx" /><div class ...

  9. 055——VUE中vue-router之路由参数的随意设置与伪静态链接地址处理:

    <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8" ...

最新文章

  1. controlfile
  2. Linux.NET学习手记(2)
  3. PHP学习笔记-数组
  4. OO实现ALV TABLE 四:ALV的显示样式
  5. 关于javafx支持IOS、android等智能手机解决方案
  6. error MSB6006: cmd.exe exited with code 3
  7. TeamCity : .NET Core 插件
  8. vim php psr,VIM-PHPer的福利, 将你的VIM打造成为不次于PHPStorm的IDE
  9. Linux进阶之进程与线程
  10. 直线算法(Bresenham)
  11. 前端零基础入门: 用css设置文字样式
  12. FDDB人脸检测测试集使用方法
  13. java构造函数注释_@Autowired的使用:推荐对构造函数进行注释
  14. 兴义智力象机器人_中科院科普讲师专家赴黔西南州做科普报告巡讲
  15. 火狐浏览器Firebug控制台显示本页面不包含 javascript的解决方案 debugger 无效解决方案
  16. Sklearn中的StratifiedKFold与stacking模型的融合方法
  17. StringRedisTemplate、opsForValue、setIfAbsent、setIfPresent、getAndSet、increment、decrement用法
  18. Go和Rust计算性能大比武
  19. Java期末作业-各种系统设计
  20. win10配置lua环境

热门文章

  1. 2.6.30内核Netfilter的简单例子、四(filterIp)
  2. CreateProcess失败返回错误代码998
  3. 信息文明时代之西方文明历史的重构谭
  4. 风尚云网学react-React的一些疑惑及解答
  5. go程序员面试算法宝典 pdf_Go程序员面试算法宝典__目录
  6. Tcl -- set
  7. MCU学习笔记---LPC55S69三色灯轮询
  8. 2022年下半年系统架构设计师下午真题及答案解析
  9. linux刷新profile文件,linux的/etc/profile、~/.profile、~/.bashrc、~./bash_profile这几个配置文件...
  10. 那些年薪百万的程序员“咸鱼翻身”没有透露的秘密