高级JavaScript。如何用JavaScript手撸一个富文本编辑器?

这篇具有很好参考价值的文章主要介绍了高级JavaScript。如何用JavaScript手撸一个富文本编辑器?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

要素过多建议收藏

- 富文本编辑

基本的技术就是在空白 HTML 文件中嵌入一个
iframe 。通过 designMode 属性,可以将这个空白文档变成可以编辑的,实际编辑的则是 <body> 元素
HTML designMode 属性有两个可能的值: "off" (默认值)和 "on" 。设置为 "on" 时,整个文档
都会变成可以编辑的(显示插入光标),从而可以像使用文字处理程序一样编辑文本,通过键盘将文本
标记为粗体、斜体,等等。
作为 iframe 源的是一个非常简单的空白 HTML 页面。下面是一个例子:
<!DOCTYPE html>
<html>
	<head>
		<title>Blank Page for Rich Text Editing</title>
	</head>
	<body>
	</body>
</html>
这个页面会像其他任何页面一样加载到 iframe 里。为了可以编辑,必须将文档的 designMode
性设置为 "on" 。不过,只有在文档完全加载之后才可以设置。在这个包含页面内,需要使用 onload
事件处理程序在适当时机设置 designMode ,如下面的例子所示:
<iframe name="richedit" style="height: 100px; width: 100px"></iframe> 
<script> 
 window.addEventListener("load", () => { 
 frames["richedit"].document.designMode = "on"; 
 }); 
</script>
以上代码加载之后,可以在页面上看到一个类似文本框的区域。这个框的样式具有网页默认样式,
不过可以通过 CSS 调整。

- 使用 contenteditable

还有一种处理富文本的方式,也是 IE 最早实现的,即指定 contenteditable 属性。可以给页面
中的任何元素指定 contenteditable 属性,然后该元素会立即被用户编辑。这种方式更受欢迎,因为
不需要额外的 iframe 、空页面和 JavaScript ,只给元素添加一个 contenteditable 属性即可,比如:
<div class="editable" id="richedit" contenteditable ></div>
元素中包含的任何文本都会自动被编辑,元素本身类似于 <textarea> 元素。通过设置
contentEditable 属性,也可以随时切换元素的可编辑状态:
let div = document.getElementById("richedit");
richedit.contentEditable = "true";
contentEditable 属性有 3 个可能的值: "true" 表示开启, "false" 表示关闭, "inherit" 表示
继承父元素的设置(因为在 contenteditable 元素内部会创建和删除元素)。 IE Firefox Chrome
Safari Opera 及所有主流移动浏览器都支持 contentEditable 属性。

- 与富文本交互

与富文本编辑器交互的主要方法是使用 document.execCommand() 。这个方法在文档上执行既定
的命令,可以实现大多数格式化任务。 document.execCommand() 可以接收 3 个参数:要执行的命令、
表示浏览器是否为命令提供用户界面的布尔值和执行命令必需的值(如果不需要则为 null )。为跨浏览
器兼容,第二个参数应该始终为 false ,因为 Firefox 会在其为 true 时抛出错误。
不同浏览器支持的命令也不一样。下表列出了最常用的命令。
高级JavaScript。如何用JavaScript手撸一个富文本编辑器?,javascript,面试,HTML,javascript,开发语言,ecmascript
高级JavaScript。如何用JavaScript手撸一个富文本编辑器?,javascript,面试,HTML,javascript,开发语言,ecmascript

 文章来源地址https://www.toymoban.com/news/detail-813262.html

剪贴板相关的命令与浏览器关系密切。虽然这些命令并不都可以通过 document.execCommand()
使用,但相应的键盘快捷键都是可以用的。
这些命令可以用于修改内嵌窗格( iframe )中富文本区域的外观,如下面的例子所示:
// 在内嵌窗格中切换粗体文本样式
frames["richedit"].document.execCommand("bold", false, null);
// 在内嵌窗格中切换斜体文本样式
frames["richedit"].document.execCommand("italic", false, null);
// 在内嵌窗格中创建指向 www.wrox.com 的链接
frames["richedit"].document.execCommand("createlink", false,
"http://www.wrox.com");
// 在内嵌窗格中为内容添加 <h1> 标签
frames["richedit"].document.execCommand("formatblock", false, "<h1>");
同样的方法也可以用于页面中添加了 contenteditable 属性的元素,只不过要使用当前窗口而不
是内嵌窗格中的 document 对象:
// 切换粗体文本样式
document.execCommand("bold", false, null);
// 切换斜体文本样式
document.execCommand("italic", false, null);
// 创建指向 www.wrox.com 的链接
document.execCommand("createlink", false, "http://www.wrox.com");
// 为内容添加 <h1> 标签
document.execCommand("formatblock", false, "<h1>");

 

注意,即使命令是所有浏览器都支持的,命令生成的 HTML 通常差别也很大。例如,为选中文本
应用 bold 命令在 IE Opera 中会使用 <strong> 标签,在 Safari Chrome 中会使用 <b>标签,而在Firefox 中会使用 <span> 标签。在富文本编辑中,不能依赖浏览器生成的 HTML,因为命令实现和格式 转换都是通过 innerHTML 完成的。
还有与命令相关的其他一些方法。第一个方法是 queryCommandEnabled() ,此方法用于确定对当
前选中文本或光标所在位置是否可以执行相关命令。它只接收一个参数,即要检查的命令名。如果可编 辑区可以执行该命令就返回 true ,否则返回 false 。来看下面的例子:
let result = frames["richedit"].document.queryCommandEnabled("bold");
以上代码在当前选区可以执行 "bold" 命令时返回 true 。不过要注意, queryCommandEnabled()
返回 true 并不代表允许执行相关命令,只代表当前选区适合执行相关命令。在 Firefox 中,
queryCommandEnabled("cut") 即使默认不允许剪切也会返回 true
另一个方法 queryCommandState() 用于确定相关命令是否应用到了当前文本选区。例如,要确定
当前选区的文本是否为粗体,可以这样:
let isBold = frames["richedit"].document.queryCommandState("bold");
如果之前给文本选区应用过 "bold" 命令,则以上代码返回 true 。全功能富文本编辑器可以利用这
个方法更新粗体、斜体等按钮。
最后一个方法是 queryCommandValue() ,此方法可以返回执行命令时使用的值(即前面示例的
execCommand() 中的第三个参数)。如果对一段选中文本应用了值为 7 "fontsize"命令,则如下代 码会返回 7
let fontSize = frames["richedit"].document.queryCommandValue("fontsize");
这个方法可用于确定如何将命令应用于文本选区,从而进一步决定是否需要执行下一个命令。

- 富文件选择 

在内嵌窗格中使用 getSelection() 方法,可以获得富文本编辑器的选区。这个方法暴露在
document window 对象上,返回表示当前选中文本的 Selection 对象。每个 Selection 对象都拥
有以下属性。
anchorNode :选区开始的节点。
anchorOffset :在 anchorNode 中,从开头到选区开始跳过的字符数。
focusNode :选区结束的节点。
focusOffset focusNode 中包含在选区内的字符数。
isCollapsed :布尔值,表示选区起点和终点是否在同一个地方。
rangeCount :选区中包含的 DOM 范围数量。
Selection 的属性并没有包含很多有用的信息。好在它的以下方法提供了更多信息,并允许操作
选区。
addRange( range ) :把给定的 DOM 范围添加到选区。
collapse( node, offset ) :将选区折叠到给定节点中给定的文本偏移处。
collapseToEnd() :将选区折叠到终点。
collapseToStart() :将选区折叠到起点。
containsNode( node ) :确定给定节点是否包含在选区中。
deleteFromDocument() :从文档中删除选区文本。与执行 execCommand("delete", false,
null) 命令结果相同。
extend( node, offset ) :通过将 focusNode focusOffset 移动到指定值来扩展选区。
getRangeAt( index ) :返回选区中指定索引处的 DOM 范围。
removeAllRanges() :从选区中移除所有 DOM 范围。这实际上会移除选区,因为选区中至少
要包含一个范围。
removeRange( range ) :从选区中移除指定的 DOM 范围。
selectAllChildren( node ) :清除选区并选择给定节点的所有子节点。
toString() :返回选区中的文本内容。
Selection 对象的这个方法极其强大,充分利用了 DOM 范围来管理选区。操纵 DOM 范围可以实
现比 execCommand() 更细粒度的控制,因为可以直接对选中文本的 DOM 内容进行操作。来看下面的 例子:
let selection = frames["richedit"].getSelection(); 
// 取得选中的文本
let selectedText = selection.toString(); 
// 取得表示选区的范围
let range = selection.getRangeAt(0); 
// 高亮选中的文本
let span = frames["richedit"].document.createElement("span"); 
span.style.backgroundColor = "yellow"; 
range.surroundContents(span);
以上代码会在富文本编辑器中给选中文本添加黄色高亮背景。实现方式是在默认选区使用 DOM
围,用 surroundContents() 方法给选中文本添加背景为黄色的 <span> 标签。
getSelection() 方法在 HTML5 中进行了标准化, IE9 以及 Firefox Safari Chrome Opera 的所
有现代版本中都实现了这个方法。
IE8 及更早版本不支持 DOM 范围,不过它们允许通过专有的 selection 对象操作选中的文本。如
本章前面所讨论的,这个 selection 对象是 document 的属性。要取得富文本编辑器中选中的文本, 必须先创建一个文本范围,然后再访问其 text 属性:
let range = frames["richedit"].document.selection.createRange(); 
let selectedText = range.text;
使用 IE 文本范围执行 HTML 操作不像使用 DOM 范围那么可靠,不过也是可以做到的。要实现与
使用 DOM 范围一样的高亮效果,可以组合使用 htmlText 属性和 pasteHTML() 方法:
let range = frames["richedit"].document.selection.createRange(); 
range.pasteHTML( 
 '<span style="background-color:yellow">${range.htmlText}</span>');
以上代码使用 htmlText 取得了当前选区的 HTML ,然后用一个 <span> 标签将其包围起来并通过
pasteHTML() 再把它插入选区中。

到了这里,关于高级JavaScript。如何用JavaScript手撸一个富文本编辑器?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 用QT/C++写一个简易文本编辑器

    学习QT的小练习,先看一下目前实现的效果。   功能: 编辑文本保存为txt。 打开一个txt文本文件,可编辑可保存。 文本编辑功能:剪切,复制,粘贴,加粗,斜体,下划线,设置颜色,字体。 要点: QT Designer的UI可视化设计:基本控件布局,资源导入,菜单动作,信号槽的

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

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

    2024年02月03日
    浏览(79)
  • 文本----简单编写文章的方法(中),后端接口的编写,自己编写好页面就上传到自己的服务器上,使用富文本编辑器进行编辑,想写好一个项目,先分析一下需求,再理一下实现思路,再搞几层,配好参数校验,lomb

    1.1 今天在编写代码的时候,突然想实现一个目标:怎样能够在自己的网站上发一些文章  (lingyidianke.com) 1.2 参考自己之前写的一些资料,做一做试试,那么怎么做呢?首先,我们参考一下我们之前的资料,之前写过的大事件资料: 1.2.1 从项目结构上看,我们要创两个项目 1

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

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

    2024年01月21日
    浏览(57)
  • 【Electron】富文本编辑器之文本粘贴

    由于这个问题导致,从其他地方复制来的内容 粘贴发送之后都会多一个 换行 在发送的时候如果直接,发送innerHTML 就 可以解决 Electron h5 Andriod 都没问题,但是 公司的 IOS 端 不支持,且不提供支持(做不了。)。 于是,继续想办法。 把单纯的富文本插入操作,改一下,只粘

    2024年02月03日
    浏览(44)
  • 富文本编辑器

    啥是富文本编辑器,就是下面这个东西: 1.那这玩意儿怎么安装和配置: 2. 通过(在终端里输入)  npm install vue-quill-editor --save  安装 3.具体的在项目里的配置过程可以看最新的官方文档vue-quill-editor · Quill官方中文文档 · 看云 4.这里先简单说下怎么配置,首先在main里输入:

    2024年02月10日
    浏览(54)
  • Vim文本编辑器

    目录 一、Vim文本编辑器   1.1、什么是Vim文本编辑器 1.2、Vim文本编辑器基本格式 1.3、Vim的三种模式及切换 ​二、命令模式 2.1、Vim的进入与退出 2.2、命令模式下光标跳转的快捷键 2.3、常用命令集合 三、编辑模式 四、末行模式 Linux 系统中“一切皆文件”,因此当我们要更改

    2024年02月10日
    浏览(60)
  • dede编辑器修改成纯文本编辑器的方法

    我在做优秀啦网站大全的时候需要的正文内容都不需要设置什么文字样式,所以我需要把编辑器上的工具全部取消掉,包括会员投稿中的编辑器工具栏全部取消掉或者屏蔽隐藏掉,所以我需要把DEDE编辑器修改成纯文本编辑器的方法如下: 如图: 首先打开 /include/ckeditor/ckedi

    2024年02月16日
    浏览(44)
  • 【富文本编辑器实战】04 菜单组件和编辑器的整合

    在上一篇文章中,我们对整个编辑器项目的大体结构有了一定的了解,主要分为菜单栏和编辑区。菜单栏包括了编辑器的主要文本操作功能,且菜单项是可配置的。编辑器界面显示比较简单,是一个可编辑的 div 区域。接下来我们就来把编辑器的整体框架搭建起来,让其可以

    2024年01月24日
    浏览(73)
  • 15 文本编辑器vim

            如果file.txt就是修改这个文件,如果不存在就是新建一个文件。          使用vim建完文件后,会自动进入文件中。          底部要是显示插入,是编辑模式;         按esc,底部要是空白的,则是进入命令模式,可以输入一些快捷键进行操作,比如说

    2024年02月15日
    浏览(56)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包