前端 富文本编辑器原理——从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节点的增删改查,实现对文本样式和格式的修改操作。
  • 事件监听:通常情况下,富文本编辑器会监听用户的输入事件、鼠标点击事件和键盘事件等,以便及时捕捉用户的操作并做出相应的反应。
  • 样式和格式化:富文本编辑器通常内置了样式和格式化工具,比如字体、颜色、大小、加粗、斜体、下划线、超链接等,可以通过这些工具来控制文本的样式和格式。
  • 插件和组件:富文本编辑器可以通过插件和组件来扩展其功能,比如图片上传组件、表格插件、代码高亮插件等,可以让编辑器满足更多的需求。

⭐结束

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


目录
相关文章
|
4天前
|
自然语言处理 前端开发 Java
深入浅出JVM(六)之前端编译过程与语法糖原理
深入浅出JVM(六)之前端编译过程与语法糖原理
|
22小时前
|
前端开发
|
3天前
|
前端开发 小程序 测试技术
前端后端测试接口mork神器,Apifox使用一分钟入门
前端后端测试接口mork神器,Apifox使用一分钟入门
8 0
|
3天前
|
前端开发
【Web前端】CSS基本语法规范和引入方式&&常见选择器用法&&常见元素属性
【Web前端】CSS基本语法规范和引入方式&&常见选择器用法&&常见元素属性
|
3天前
|
JavaScript 前端开发
深入了解前端框架Vue.js的响应式原理
本文将深入探讨Vue.js前端框架的核心特性之一——响应式原理。通过分析Vue.js中的数据绑定、依赖追踪和虚拟DOM等机制,读者将对Vue.js的响应式系统有更深入的理解,从而能够更好地利用Vue.js构建灵活、高效的前端应用。
|
4天前
|
存储 移动开发 前端开发
HTML5基础题及答案——必刷前端题目(背)
- Internet是全球连接的TCP/IP协议网络,而万维网(Web)是Internet上的重要服务,基于HTTP协议展示资源。 - 用户通过浏览器输入URL访问Web页面,浏览器向服务器请求内容并显示。 - Web前端基础是HTML、CSS和JavaScript。 - HTML5是HTML的最新版本,增加了新标签、API和功能,如注释、新的列表标签、文档结构和格式标签、拖放、画布等。
|
5天前
|
前端开发 JavaScript 索引
CSS常见用法 以及JS基础语法
CSS常见用法 以及JS基础语法
12 0
|
6天前
|
前端开发 测试技术
前端自动化测试中的快照测试原理
快照测试用于前端自动化测试,通过比较当前应用状态与预存预期快照来检测UI变化。流程包括设置测试环境、捕获屏幕快照、保存预期快照、比较快照及处理差异。当快照比较出现差异时,测试工程师审查判断是否为预期变化或错误,确保应用一致性。这种方法在重构、样式更改和跨浏览器测试时提供有效回归测试,减少手动验证工作。
|
7天前
|
JavaScript 前端开发
js和css以及js制作弹窗
js和css以及js制作弹窗
11 1
|
11天前
|
JavaScript 前端开发 UED
【Web 前端】如何将一个 HTML 元素添加到 DOM 树中的?
【5月更文挑战第2天】【Web 前端】如何将一个 HTML 元素添加到 DOM 树中的?