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

⭐结束

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


目录
相关文章
|
11天前
|
前端开发 JavaScript 数据处理
CSS 变量的作用域和 JavaScript 变量的作用域有什么不同?
【10月更文挑战第28天】CSS变量和JavaScript变量虽然都有各自的作用域概念,但由于它们所属的语言和应用场景不同,其作用域的定义、范围、覆盖规则以及与其他语言特性的交互方式等方面都存在明显的差异。理解这些差异有助于更好地在Web开发中分别运用它们来实现预期的页面效果和功能逻辑。
|
1天前
|
缓存 前端开发 JavaScript
优化CSS和JavaScript加载
Next.js和Nuxt.js在优化CSS和JavaScript加载方面提供了多种策略和工具。Next.js通过代码拆分、图片优化和特定的CSS/JavaScript优化措施提升性能;Nuxt.js则通过代码分割、懒加载、预渲染静态页面、Webpack配置和服务端缓存来实现优化。两者均能有效提高应用性能。
|
3天前
|
编解码 前端开发 JavaScript
从入门到精通:揭秘前端开发中那些不为人知的优化秘籍!
前端开发是充满无限可能的领域,从初学者到资深专家,每个人都追求更快、更稳定、更用户体验友好的网页。本文介绍了四大优化秘籍:1. HTML的精简与语义化;2. CSS的优雅与高效;3. JavaScript的精简与异步加载;4. 图片与资源的优化。通过这些方法,可以显著提升网页性能和用户体验。
10 3
|
8天前
|
机器学习/深度学习 自然语言处理 前端开发
前端神经网络入门:Brain.js - 详细介绍和对比不同的实现 - CNN、RNN、DNN、FFNN -无需准备环境打开浏览器即可测试运行-支持WebGPU加速
本文介绍了如何使用 JavaScript 神经网络库 **Brain.js** 实现不同类型的神经网络,包括前馈神经网络(FFNN)、深度神经网络(DNN)和循环神经网络(RNN)。通过简单的示例和代码,帮助前端开发者快速入门并理解神经网络的基本概念。文章还对比了各类神经网络的特点和适用场景,并简要介绍了卷积神经网络(CNN)的替代方案。
|
8天前
|
移动开发 前端开发 JavaScript
前端实训,刚入门,我用原生技术(H5、C3、JS、JQ)手写【网易游戏】页面特效
于辰在大学期间带领团队参考网易游戏官网的部分游戏页面,开发了一系列前端实训作品。项目包括首页、2021校园招聘页面和明日之后游戏页面,涉及多种特效实现,如动态图片切换和人物聚合效果。作品源码已上传至CSDN,视频效果可在CSDN预览。
13 0
前端实训,刚入门,我用原生技术(H5、C3、JS、JQ)手写【网易游戏】页面特效
|
17天前
|
监控 前端开发 JavaScript
React 静态网站生成工具 Next.js 入门指南
【10月更文挑战第20天】Next.js 是一个基于 React 的服务器端渲染框架,由 Vercel 开发。本文从基础概念出发,逐步探讨 Next.js 的常见问题、易错点及解决方法,并通过具体代码示例进行说明,帮助开发者快速构建高性能的 Web 应用。
45 10
|
13天前
|
JavaScript 前端开发 开发者
前端框架对比:Vue.js与Angular的优劣分析与选择建议
【10月更文挑战第27天】在前端开发领域,Vue.js和Angular是两个备受瞩目的框架。本文对比了两者的优劣,Vue.js以轻量级和易上手著称,适合快速开发小型到中型项目;Angular则由Google支持,功能全面,适合大型企业级应用。选择时需考虑项目需求、团队熟悉度和长期维护等因素。
19 1
|
14天前
|
数据采集 存储 JavaScript
如何使用Puppeteer和Node.js爬取大学招生数据:入门指南
本文介绍了如何使用Puppeteer和Node.js爬取大学招生数据,并通过代理IP提升爬取的稳定性和效率。Puppeteer作为一个强大的Node.js库,能够模拟真实浏览器访问,支持JavaScript渲染,适合复杂的爬取任务。文章详细讲解了安装Puppeteer、配置代理IP、实现爬虫代码的步骤,并提供了代码示例。此外,还给出了注意事项和优化建议,帮助读者高效地抓取和分析招生数据。
如何使用Puppeteer和Node.js爬取大学招生数据:入门指南
|
24天前
|
前端开发 JavaScript 安全
JavaScript前端开发技术
JavaScript(简称JS)是一种广泛使用的脚本语言,特别在前端开发领域,它几乎成为了网页开发的标配。从简单的表单验证到复杂的单页应用(SPA),JavaScript都扮演着不可或缺的角色。
19 3
|
14天前
|
JavaScript 前端开发 API
前端框架对比:Vue.js与Angular的优劣分析与选择建议
【10月更文挑战第26天】前端技术的飞速发展让开发者在构建用户界面时有了更多选择。本文对比了Vue.js和Angular两大框架,介绍了它们的特点和优劣,并给出了在实际项目中如何选择的建议。Vue.js轻量级、易上手,适合小型项目;Angular结构化、功能强大,适合大型项目。
14 1