前端 富文本编辑器原理——从javascript、html、css开始入门(二)

简介: 前端 富文本编辑器原理——从javascript、html、css开始入门

前端 富文本编辑器原理——从javascript、html、css开始入门(一)https://developer.aliyun.com/article/1492714


例:

点击不失去焦点跳转开始和结束,避免失去焦点使用preventDefault

<body>
  <blockquote contenteditable="true">
    <p>Edit this content to add your own quote</p>
  </blockquote>
  <cite contenteditable="true">-- Write your own name here</cite>
  <button onclick="printSelection()">console.log(getSelection)</button>
  <button id='start-id'>jumpt start</button>
  <button id='end-id'>jumpt end</button>
</body>
<script type="text/javascript">
  function printSelection() {
    const selection = window.getSelection()
    console.log('selection', selection)
    console.log('selection.toString()', selection.toString())
    console.log('selection.getRangeAt(0)', selection.getRangeAt(0))
  }
  function jumpStart() {
    let range = window.getSelection().getRangeAt(0);
    let textEle = range.commonAncestorContainer;
    range.setStart(range.startContainer, 0);
    range.setEnd(range.startContainer, 0);
  }
  function jumpEnd() {
    let range = window.getSelection().getRangeAt(0);
    let textEle = range.commonAncestorContainer;
    range.setStart(range.startContainer, textEle.length);
    range.setEnd(range.endContainer, textEle.length);
  }
  window.onload = function() {
    document.getElementById('start-id').addEventListener('click', function(e) {
      jumpStart()
    })
    document.getElementById('start-id').addEventListener('mousedown', function(e) {
      e.preventDefault()
    })
    
    document.getElementById('end-id').addEventListener('click', function(e) {
      jumpEnd()
    })
    document.getElementById('end-id').addEventListener('mousedown', function(e) {
      e.preventDefault()
    })
  }
</script>

效果如下图:

💖 设置选取range

Selection.addRange()

概述

向选区(Selection)中添加一个区域(Range)。

语法

sel.addRange(range)

例子:

失去焦点之后恢复选区

<body>
  <blockquote contenteditable="true">
    <p>Edit this content to add your own quote</p>
    <b>yma16</b>
  </blockquote>
  <cite contenteditable="true">-- Write your own name here</cite>
  <br>
  <button id='print-id'>console.log(getSelection)</button>
  <br>
  <br>
  <button id='start-id'>jump start</button>
  <button id='end-id'>jump end</button>
  <button id='focus-id'>focus content</button>
</body>
<script type="text/javascript">
  const config = {
    selection: null
  }
  function printSelection() {
    const selection = window.getSelection()
    range = document.getSelection().getRangeAt(0).cloneRange();
    config.cloneRange = range;
    console.log('selection', selection)
    // console.log('selection.toString()', selection.toString())
    // console.log('selection.getRangeAt(0)', selection.getRangeAt(0))
  }
  function jumpStart() {
    let range = window.getSelection().getRangeAt(0);
    let textEle = range.commonAncestorContainer;
    range.setStart(range.startContainer, 0);
    range.setEnd(range.startContainer, 0);
    range = document.getSelection().getRangeAt(0).cloneRange();
    config.cloneRange = range;
  }
  function jumpEnd() {
    let range = window.getSelection().getRangeAt(0);
    let textEle = range.commonAncestorContainer;
    range.setStart(range.startContainer, textEle.length);
    range.setEnd(range.endContainer, textEle.length);
    range = document.getSelection().getRangeAt(textEle.length).cloneRange();
    config.cloneRange = range;
  }
  function focusContent() {
    document.getSelection().removeAllRanges(); //把没用的Ranges删除
    console.log('config.cloneRange',config.cloneRange)
    document.getSelection().addRange(config.cloneRange); //恢复Range
  }
  window.onload = function() {
    document.getElementById('print-id').addEventListener('click', function(e) {
      printSelection()
    })
    document.getElementById('print-id').addEventListener('mousedown', function(e) {
      e.preventDefault()
    })
    document.getElementById('start-id').addEventListener('click', function(e) {
      jumpStart()
    })
    document.getElementById('start-id').addEventListener('mousedown', function(e) {
      e.preventDefault()
    })
    document.getElementById('end-id').addEventListener('click', function(e) {
      jumpEnd()
    })
    document.getElementById('end-id').addEventListener('mousedown', function(e) {
      e.preventDefault()
    })
    document.getElementById('focus-id').addEventListener('click', function(e) {
      focusContent()
    })
    document.getElementById('focus-id').addEventListener('mousedown', function(e) {
      e.preventDefault()
    })
  }
</script>

效果如下:

⭐总结

Contenteditable属性

Contenteditable是一种HTML属性,用于指定页面中的元素是否可以编辑。以下是Contenteditable的总结:

  1. Contenteditable属性可以应用于HTML元素上,如div、span、p、h1等等。
  2. 当Contenteditable属性设置为true时,用户可以编辑元素内的文本、图像等内容。
  3. Contenteditable属性的取值包括true和false,分别表示可编辑和不可编辑。
  4. Contenteditable属性可以通过JavaScript来动态修改。
  5. Contenteditable属性的兼容性很好,支持大多数现代浏览器。
  6. 虽然Contenteditable属性很方便,但也存在一些潜在的安全问题,因此应该谨慎使用。

富文本编辑器

富文本编辑器是一种允许用户编辑带有样式和格式的文本的编辑器。它与普通文本编辑器的区别在于,它允许用户使用各种字体、颜色、大小、加粗、斜体、下划线、超链接、图片等来设计和呈现文本内容。其原理主要包括以下几个方面:

  • DOM操作:富文本编辑器通过操作DOM树来实现文本样式和格式的改变。当用户在编辑器中输入或选择文本时,编辑器会将文本转换为DOM节点,并将节点添加到DOM树中。通过对DOM节点的增删改查,实现对文本样式和格式的修改操作。
  • 事件监听:通常情况下,富文本编辑器会监听用户的输入事件、鼠标点击事件和键盘事件等,以便及时捕捉用户的操作并做出相应的反应。
  • 样式和格式化:富文本编辑器通常内置了样式和格式化工具,比如字体、颜色、大小、加粗、斜体、下划线、超链接等,可以通过这些工具来控制文本的样式和格式。
  • 插件和组件:富文本编辑器可以通过插件和组件来扩展其功能,比如图片上传组件、表格插件、代码高亮插件等,可以让编辑器满足更多的需求。

⭐结束

本文分享到这结束,如有错误或者不足之处欢迎指出!


目录
相关文章
|
8月前
|
移动开发 前端开发 JavaScript
征信报告修改器,征信报告生成器,制作软件无痕修改软件【js+html+css】
本项目为信用评分模拟器教学工具,采用HTML5实现,仅供学习参考。核心功能通过JavaScript构建,包含虚拟数据生成、权重分配及信用因素分析(如还款记录、信用使用率等)。
|
8月前
|
前端开发 JavaScript
个人征信电子版无痕修改, 个人信用报告pdf修改,js+html+css即可实现【仅供学习用途】
本代码展示了一个信用知识学习系统的前端实现,包含评分计算、因素分析和建议生成功能。所有数据均为模拟生成
|
8月前
|
存储 前端开发 JavaScript
仿真银行app下载安装, 银行卡虚拟余额制作app,用html+css+js实现逼真娱乐工具
这是一个简单的银行账户模拟器项目,用于学习前端开发基础。用户可进行存款、取款操作,所有数据存储于浏览器内存中
|
8月前
|
前端开发
个人征信PDF无痕修改软件,个人征信模板可编辑,个人征信报告p图神器【js+html+css仅供学习用途】
这是一款信用知识学习系统,旨在帮助用户了解征信基本概念、信用评分计算原理及信用行为影响。系统通过模拟数据生成信用报告,涵盖还款记录
|
8月前
|
前端开发 JavaScript 容器
制作b超单生成器, 假怀孕b超单图片制作, p图医院证明【css+html+js装逼恶搞神器】
本资源提供一个适合用于熟人之间恶搞的工具,效果逼真,仅供学习参考与娱乐。包含前端技术学习要点:语义化布局、响应式设计、Flexbox、图片自适应
|
前端开发 开发者
HTML+CSS+JS 学习笔记(二)———CSS
HTML+CSS+JS 学习笔记(二)———CSS
372 0
|
移动开发 前端开发 搜索推荐
HTML+CSS+JS 学习笔记(一)———HTML(上)
HTML+CSS+JS 学习笔记(一)———HTML(上)
298 0
HTML+CSS+JS 学习笔记(一)———HTML(上)
|
存储 JavaScript 前端开发
HTML+CSS+JS 学习笔记(三)———Javascript(中)
HTML+CSS+JS 学习笔记(三)———Javascript(中)
199 0
|
存储 编解码 JavaScript
HTML+CSS+JS 学习笔记(三)———Javascript(上)
HTML+CSS+JS 学习笔记(三)———Javascript(上)
227 0

热门文章

最新文章

  • 1
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(九):强势分析Animation动画各类参数;从播放时间、播放方式、播放次数、播放方向、播放状态等多个方面,完全了解CSS3 Animation
    350
  • 2
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(八):学习transition过渡属性;本文学习property模拟、duration过渡时间指定、delay时间延迟 等多个参数
    272
  • 3
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(七):学习ransform属性;本文学习 rotate旋转、scale缩放、skew扭曲、tanslate移动、matrix矩阵 多个参数
    239
  • 4
    (CSS)使用Flex布局,帮助你快速了解各种基本的Flex布局属性以及帮你让元素快速达到布局中的指定位置!
    165
  • 5
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(六):全方面分析css的Flex布局,从纵、横两个坐标开始进行居中、两端等元素分布模式;刨析元素间隔、排序模式等
    344
  • 6
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(五):背景属性;float浮动和position定位;详细分析相对、绝对、固定三种定位方式;使用浮动并清除浮动副作用
    482
  • 7
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(四):元素盒子模型;详细分析边框属性、盒子外边距
    286
  • 8
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(三):元素继承关系、层叠样式规则、字体属性、文本属性;针对字体和文本作样式修改
    160
  • 9
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(二):CSS伪类:UI伪类、结构化伪类;通过伪类获得子元素的第n个元素;创建一个伪元素展示在页面中;获得最后一个元素;处理聚焦元素的样式
    276
  • 10
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(一):CSS发展史;CSS样式表的引入;CSS选择器使用,附带案例介绍
    309