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

这篇具有很好参考价值的文章主要介绍了前端 富文本编辑器原理——从javascript、html、css开始入门。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


html 富文本 编辑,web站点,前端,javascript,html,富文本编辑器,原力计划

⭐前言

大家好,我是yma16,本文分享关于前端 富文本编辑器原理——从javascript、html、css开始。
富文本编辑器
富文本编辑器是指具有格式化文本和图像编辑功能的文本编辑器

参考文档:https://w3c.github.io/selection-api/#abstract

⭐html的contenteditable属性

全局属性 contenteditable 是一个枚举属性,表示元素是否可被用户编辑。如果可以,浏览器会修改元素的组件以允许编辑。

  • contenteditable boolean (false | true) 默认false
    简单理解,加上contenteditable ,html可以编辑具有input 输入的基本功能,所见即所得。
    例:
    html demo 标签配置contenteditable
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>富文本编辑器</title>
	</head>
	<style>
		blockquote {
		  background: #eee;
		  border-radius: 5px;
		  margin: 16px 0;
		}
		
		blockquote p {
		  padding: 15px;
		}
		
		cite {
		  margin: 16px 32px;
		  font-weight: bold;
		}
		
		blockquote p::before {
		  content: '\201C';
		}
		
		blockquote p::after {
		  content: '\201D';
		}
		
		[contenteditable='true'] {
		  caret-color: red;
		}

	</style>
	<body>
		<blockquote contenteditable="true">
		  <p>Edit this content to add your own quote</p>
		</blockquote>
		
		<cite contenteditable="true">-- Write your own name here</cite>

	</body>
</html>

效果如下,可以输入编辑html元素:
html 富文本 编辑,web站点,前端,javascript,html,富文本编辑器,原力计划

💖 输入的光标位置(浏览器获取selection)

getSelection() method
GetSelection ()方法返回一个 Selection 对象,该对象表示用户选择的文本范围或插入符号的当前位置。

⭐使用Selection.toString () 返回指定的文本

例:

<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>

</body>
<script type="text/javascript">
	const printSelection=()=>{
		const selection=window.getSelection()
		console.log('selection',selection)
		console.log('selection.toString()',selection.toString())
	}
</script>

效果如下:
html 富文本 编辑,web站点,前端,javascript,html,富文本编辑器,原力计划

⭐getRangeAt 获取指定索引范围

函数接受一个索引值
返回,其中
结束的索引值,endOffset
开始的索引值,startOffset
效果如下图:
html 富文本 编辑,web站点,前端,javascript,html,富文本编辑器,原力计划

💖 修改光标位置

调用 setStart() 和 setEnd() 方法,来修改一个光标的位置或拖蓝范围
Range.setStart()
Range.setStart() 方法用于设置 Range的开始位置。

如果起始节点类型是 Text、Comment 或 CDATASection之一,那么 startOffset 指的是从起始节点算起字符的偏移量。对于其他 Node 类型节点,startOffset 是指从起始结点开始算起子节点的偏移量。

如果设置的起始位点在结束点之下(在文档中的位置),将会导致选区折叠,起始点和结束点都会被设置为指定的起始位置。
startNode
startNode 用于设定 Range的起始位置。

startOffset
必须为不小于 0 的整数。表示从startNode的开始位置算起的偏移量。
Range.setEnd()
Range.setEnd()
方法用于设置 Range的结束位置。

如果结束节点类型是 Text、Comment 或 CDATASection之一,那么 endOffset 指的是从结束节点算起字符的偏移量。对于其他 Node 类型节点,endOffset 是指从结束结点开始算起子节点的偏移量。

如果设置的结束点在起始点之上(在文档中的位置),将会导致选区折叠,起始点和结束点都会被设置为指定的结束位置。
endNode
endNode用于设定 Range的结束位置。

endOffset
必须为不小于 0 的整数。表示从endNode的结束位置算起的偏移量。
语法

range.setStart(startNode, startOffset);
range.setEnd(endNode, endOffset);

例:
点击不失去焦点跳转开始和结束,避免失去焦点使用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>

效果如下图:
html 富文本 编辑,web站点,前端,javascript,html,富文本编辑器,原力计划

💖 设置选取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>

效果如下:
html 富文本 编辑,web站点,前端,javascript,html,富文本编辑器,原力计划

⭐总结

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节点的增删改查,实现对文本样式和格式的修改操作。

  • 事件监听:通常情况下,富文本编辑器会监听用户的输入事件、鼠标点击事件和键盘事件等,以便及时捕捉用户的操作并做出相应的反应。

  • 样式和格式化:富文本编辑器通常内置了样式和格式化工具,比如字体、颜色、大小、加粗、斜体、下划线、超链接等,可以通过这些工具来控制文本的样式和格式。

  • 插件和组件:富文本编辑器可以通过插件和组件来扩展其功能,比如图片上传组件、表格插件、代码高亮插件等,可以让编辑器满足更多的需求。

⭐结束

本文分享到这结束,如有错误或者不足之处欢迎指出!
html 富文本 编辑,web站点,前端,javascript,html,富文本编辑器,原力计划

👍 点赞,是我创作的动力!
⭐️ 收藏,是我努力的方向!
✏️ 评论,是我进步的财富!
💖 感谢你的阅读!文章来源地址https://www.toymoban.com/news/detail-712938.html

到了这里,关于前端 富文本编辑器原理——从javascript、html、css开始入门的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用 HTML、CSS 和 JavaScript 创建实时 Web 编辑器

    在本文中,我们将创建一个实时网页编辑器。这是一个 Web 应用程序,允许我们在网页上编写 HTML 、 CSS 和 JavaScript 代码并实时查看结果。这是学习 Web 开发和测试代码片段的绝佳工具。我们将使用 iframe 元素来显示结果。 iframe 元素用于在当前 HTML 文档中嵌入另一个文档。 i

    2024年02月12日
    浏览(53)
  • 前端必备14款业界受欢迎的富文本编辑器

    基于JavaScript和css开发的 Web富文本编辑器, 轻量、简洁、开源免费。 一个轻量级的基于浏览器的所见即所得编辑器,由JavaScript写成。 由百度web前端研发部开发所见即所得富文本web编辑器,可定制,注重用户体验等特点,开源基于MIT协议,允许自由使用和修改代码。 一套开源

    2024年02月15日
    浏览(51)
  • Vue 富文本编辑器tinymce的安装教程(前端必备小知识)

    目录 一、Tinymce编辑器简介 二、安装以及配置tinymce         2.1.安装tinymce编辑器         2.2.从node_modules/tinymce复制样式到public目录下,复制完毕的public下的目录结构如下 三、在Vue里面使用         3.1.在components 目录下新建 Editor.vue 将下面代码复制进去        

    2024年02月11日
    浏览(64)
  • uniapp小程序开发-富文本编辑器mp-html,juice外部样式转内联样式

    在开发一款公司的小程序过程中,有一个需求:web端后端可以上传word文档,后端转为html字符串;小程序接收显示,并且可以在小程序进行编辑修改。 其实在日常小程序中很少见到富文本编辑器的使用,所以这次使用的过程中也尝试了多种,但是最好用的还是mp-html 这款插件

    2024年02月09日
    浏览(46)
  • 基于前端技术原生HTML、JS、CSS 电子病历编辑器源码

    电子病历系统采取结构化与自由式录入的新模式,自由书写,轻松录入。实现病人医疗记录(包含有首页、病程记录、检查检验结果、医嘱、手术记录、护理记录等等。)的保存、管理、传输和重现,取代手写纸张病历。不仅实现了纸质病历的电子化储存,而且实现了病历的

    2024年02月11日
    浏览(67)
  • Vue2 实现内容拖拽或添加 HTML 到 Tinymce 富文本编辑器的高级功能详解

    在 Web 开发中,Tinymce 被广泛应用作为富文本编辑器。除了基础的文本编辑功能,Tinymce 还提供了一系列高级功能,使得文本编辑更加灵活和便捷。本文将介绍如何在 Tinymce 中实现一些高级功能,并深入了解每个工具的使用。 Tinymce 是一款基于 JavaScript 的富文本编辑器,支持丰

    2024年02月03日
    浏览(79)
  • vue-codemirror实现一个前端代码在线编辑器,可处理 HTML,VUE,JS,CSS代码在线编辑

    先找个目录创建一个vue项目 例如 我们想要项目叫 editor 在终端执行 2和3其实都可以 但个人建议 最近还是2会更稳定一些 在终端执行 引入依赖包 然后在项目src目录下创建 utils 文件夹 里面创建一个setting.js 参考代码如下 然后 这边 调用组件的代码 因为项目也刚创 我直接写 s

    2024年02月15日
    浏览(55)
  • wangEditor富文本编辑器的调用开发实录2(V5版本自定义粘贴,去除复制word或网页html冗余样式代码的解决方案)

    在使用wangEditor富文本编辑器时,当从word文档或者其他网页复制文本内容粘贴到编辑器中,如果不过滤掉复制文本中自带的样式,会导致复制的内容比较错乱,甚至无法添加到数据库中。为了解决这个问题,我们需要对从word中粘贴的内容进行处理,把多余的代码剔除,让粘贴

    2024年02月16日
    浏览(42)
  • 【富文本编辑器实战】02 编写编辑器配置文件

    本篇文章主要内容是项目的配置文件的编写与讲解,包括菜单项配置、语言配置、总体配置。 下图是编辑器的总体结构: 编辑器大致可以分为两个部分,菜单栏(图中的 1)和下面的编辑器(图中的 4)。其中菜单栏的内容较多,每个菜单项都包含了图标,说明文字(图中的 2)。部

    2024年01月21日
    浏览(57)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包