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

⭐结束

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


目录
相关文章
|
25天前
|
JavaScript 前端开发 Java
springboot解决js前端跨域问题,javascript跨域问题解决
本文介绍了如何在Spring Boot项目中编写Filter过滤器以处理跨域问题,并通过一个示例展示了使用JavaScript进行跨域请求的方法。首先,在Spring Boot应用中添加一个实现了`Filter`接口的类,设置响应头允许所有来源的跨域请求。接着,通过一个简单的HTML页面和jQuery发送AJAX请求到指定URL,验证跨域请求是否成功。文中还提供了请求成功的响应数据样例及请求效果截图。
springboot解决js前端跨域问题,javascript跨域问题解决
|
22天前
|
前端开发 JavaScript 搜索推荐
HTML与CSS在Web组件化中的核心作用及前端技术趋势
本文探讨了HTML与CSS在Web组件化中的核心作用及前端技术趋势。从结构定义、语义化到样式封装与布局控制,两者不仅提升了代码复用率和可维护性,还通过响应式设计、动态样式等技术增强了用户体验。面对兼容性、代码复杂度等挑战,文章提出了相应的解决策略,强调了持续创新的重要性,旨在构建高效、灵活的Web应用。
31 6
|
27天前
|
缓存 JavaScript 前端开发
JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用
本文深入讲解了 JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用。
40 5
|
25天前
|
缓存 前端开发 JavaScript
JavaScript前端路由的实现原理及其在单页应用中的重要性,涵盖前端路由概念、基本原理、常见实现方式
本文深入解析了JavaScript前端路由的实现原理及其在单页应用中的重要性,涵盖前端路由概念、基本原理、常见实现方式(Hash路由和History路由)、优点及挑战,并通过实际案例分析,帮助开发者更好地理解和应用这一关键技术,提升用户体验。
63 1
|
29天前
|
JSON 前端开发 JavaScript
聊聊 Go 语言中的 JSON 序列化与 js 前端交互类型失真问题
在Web开发中,后端与前端的数据交换常使用JSON格式,但JavaScript的数字类型仅能安全处理-2^53到2^53间的整数,超出此范围会导致精度丢失。本文通过Go语言的`encoding/json`包,介绍如何通过将大整数以字符串形式序列化和反序列化,有效解决这一问题,确保前后端数据交换的准确性。
35 4
|
1月前
|
资源调度 前端开发 JavaScript
vite3+vue3 实现前端部署加密混淆 javascript-obfuscator
【11月更文挑战第10天】本文介绍了在 Vite 3 + Vue 3 项目中使用 `javascript-obfuscator` 实现前端代码加密混淆的详细步骤,包括安装依赖、创建混淆脚本、修改 `package.json` 脚本命令、构建项目并执行混淆,以及在 HTML 文件中引用混淆后的文件。通过这些步骤,可以有效提高代码的安全性。
|
1月前
|
编解码 前端开发 JavaScript
从入门到精通:揭秘前端开发中那些不为人知的优化秘籍!
前端开发是充满无限可能的领域,从初学者到资深专家,每个人都追求更快、更稳定、更用户体验友好的网页。本文介绍了四大优化秘籍:1. HTML的精简与语义化;2. CSS的优雅与高效;3. JavaScript的精简与异步加载;4. 图片与资源的优化。通过这些方法,可以显著提升网页性能和用户体验。
20 3
|
1月前
|
前端开发 JavaScript 安全
vite3+vue3 实现前端部署加密混淆 javascript-obfuscator
【11月更文挑战第7天】本文介绍了在 Vite 3 + Vue 3 项目中使用 `javascript-obfuscator` 实现前端代码加密混淆的详细步骤。包括项目准备、安装 `javascript-obfuscator`、配置 Vite 构建以应用混淆,以及最终构建项目进行混淆。通过这些步骤,可以有效提升前端代码的安全性,防止被他人轻易分析和盗用。
151 0
|
7月前
|
前端开发 JavaScript 网络协议
前端最常见的JS面试题大全
【4月更文挑战第3天】前端最常见的JS面试题大全
110 5
|
7月前
|
JavaScript 前端开发
web前端JS高阶面试题(1),高级开发工程师面试
web前端JS高阶面试题(1),高级开发工程师面试