JavaScript实现简单文本编辑功能

2023-10-27

核心属性 / 方法

contentEditable

html属性 用来设置 或 返回元素的内容是否可以被编辑

语法:

<p contentEditable = 'true | false' >...</p>
HTMLElementObject.contentEditable  = true | false 
HTMLElementObject.isContentEditable()  // 获取元素是否是可编辑状态

document.execCommand()

操作可编辑元素的语法糖 大多数文本编辑命令都可执行

语法:

bool = document.execCommand( aCommandName,ashowDefaultUI,aValueArgument )

/**
 * aCommandName : 命令的名称,可用命令参考mdn
 * aShowDefaultUI : 是否展示用户界面  | false
 * aValueArgument : 一些命令需要的额外参数如字体颜色/大小  | null
*/

借用语法糖实现的编辑器

<body>
    <button data-command='bold' onclick="changeStyle(this.dataset)">B</button>
    <button data-command="italic" onclick="changeStyle(this.dataset)">I</button>
    <button data-command="fontSize" data-value="7" onclick="changeStyle(this.dataset)">fontSize</button>
    <button data-command="foreColor" data-value="red" onclick="changeStyle(this.dataset)">color</button>
    <button data-command="justifyCenter" onclick="changeStyle(this.dataset)">居中对齐</button>
    <button data-command="justifyLeft" onclick="changeStyle(this.dataset)">左对齐</button>
    <button data-command="justifyRight" onclick="changeStyle(this.dataset)">右对齐</button>
    <br />
    <p contentEditable='true'>犹豫就会败北</p>
    <p contentEditable='true'>果断就会白给</p>


    <script>
        function changeStyle(data) {
            var attr = data.command
            var value = data.value
            value ? document.execCommand(attr, false, value) : document.execCommand(attr, false, null)
        }  
    </script>
</body> 

Selection

Selection对象表示用户选择的文本范围或插入符号的当前位置。它代表页面中的文本选区,可能横跨多个元素。

语法:

var selObj = document.getSelection()  // window | document 获取Selection对象
var selStr = selObj.toString() // 获取选中区域的 ‘纯文本’

document.onselectionchange = function(){  // 监听鼠标锚点的变化
    console.log( document.getSelection() )
    /**
     * Selection = {
     *  anchorNode: node 选取起点所在节点,
     *  anchorOffset: num 起点偏移量,
     *  focusNode: node 选取终点所在节点,
     *  focusOffset: num 终点偏移量,
     *  isCollapsed: bool 起始点是否在同一位置,
     *  rangeCount: 返回该选区所包含的连续范围的数量
     * 
     * }
    */
}

Range

表示一个包含节点与文本节点的一部分的文档片段

语法:

// 创建一个文档范围
var range = document.createRange()
var range = new Range()

// 获取选中的文档范围
var range = document.getSelection().getRangeAt(0)  

/**
 * Range = {
 *  collapsed : 起始点位置是否相同,
 *  commonAncetorContainer : 选中区域所在的完整节点,  eg: <b> hhh<i>5[5</i>6]6</b> -> <b> hhh<i>55</i>66</b>
 *  endContainer : 包含range的终点节点,  -> 66
 *  endOffset : 返回一个表示 Range 终点在 endContainer 中的位置的数字。 -> 1 (选中的6在66中排位第几)
 * }
 * 
 * Range.cloneContents()    返回一个包含 Range 中所有节点的文档片段
 * Range.deleteContents()    移除range包含的内容
 * Range.extractContents()    把 Range 的内容从文档树移动到一个文档片段中
 * Range.insertNode(Node)    在range起点处插入一个节点
 * Range.surroundContents(newNode)     将range内容移动到一个新的节点中
*/

利用 range & selection 接口实现的简易编辑器

有bug

<body>
    <button data-command="b" onclick="changeStyle(dataset)"> B </button>
    <button data-command="i" onclick="changeStyle(dataset)"> I </button>
    <button data-command="h1" onclick="changeStyle(dataset)"> h1 </button>
    <button data-value="textAlign:center" onclick="changeStyle(dataset)"> 居中</button>
    <button data-value="textAlign:right" onclick="changeStyle(dataset)"> 居右</button>
    <button data-value="textAlign:left" onclick="changeStyle(dataset)"> 居左</button>
    <p contentEditable='true'>犹豫<b>就会败北<i>52</i>墨菲</b>定律</p>
    <p contentEditable='true'>薛定谔的猫									
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JavaScript实现简单文本编辑功能 的相关文章

  • 在 ES5 中创建自定义元素 v1,而不是 ES6

    现在 如果您严格遵循自定义元素规范 v1 https html spec whatwg org multipage custom elements html custom elements 无法在不支持类的浏览器中使用自定义元素 有没有办法
  • 使用ajax发送表单数据

    我想用 ajax 以表单形式发送所有输入 我有一个这样的表单
  • Webpack将js/css文件内容直接注入到index.html

    我有这样的代码
  • 无法使用 Jade 模板包含相对路径文件

    当我尝试将文件包含在同一文件夹中时 收到以下错误 the filename option is required to use include with relative paths 有两个文件 索引 jade 项目列表 jade cont
  • codePointAt 和 charCodeAt 之间的区别

    有什么区别String prototype codePointAt and String prototype charCodeAt 在 JavaScript 中 A codePointAt 65 A charCodeAt 65 从 MDN
  • jQuery 在附加元素后立即返回 div 元素的高度 0

    我有一个浮动 div 最初没有内容 我使用 jQuery 将一组元素附加到 div 然后立即调用原始 div 的 height 方法 我添加的元素在样式表中具有定义的最小高度 而浮动 div 则没有 问题是 当我在原始 div 上调用 he
  • React Native 中 fontAwesome 图标的圆形轮廓

    我想使用 fontAwesome 图标 使其位于圆圈的中间 我想将它用作一个图标项 我读到我们可以将它与圆形图标一起使用并将其放置在其中 但我无法使其工作 import IconFA from react native vector ico
  • 2 个 SVG 路径的交集

    我需要检查两个 SVG Path 元素是否相交 检查边界框与 getBBox 太不准确了 我目前正在做的是迭代两条路径 getTotalLength 然后检查是否有两个点 getPointAtLength 是平等的 下面是一个片段 但正如您
  • axios 如何将 blob 与 arraybuffer 作为响应类型处理?

    我正在下载一个 zip 文件axios https www npmjs com package axios 为了进一步处理 我需要获取已下载的 原始 数据 据我所知 Javascript 有两种类型 Blob 和 Arraybuffers
  • Lodash _.hasIntersection?

    我想知道两个或多个数组是否有共同的项目 但我不在乎这些项目是什么 我知道 lodash 有一个 intersection方法 但我不需要它来遍历每个数组的每个项目 相反 我需要类似的东西 hasIntersection一旦找到第一个常见的出
  • 如何将类组件中的 props 发送到功能组件?

    我是 ReactJS 的初学者 需要知道如何将一个页面中的 props 值发送到另一个页面 道具位于第一页上我可以获取类组件值如何获取另一页中的值 提前致谢 墙色 jsx import React Component from react
  • 如何在 Node.js 中打开 Windows-1255 编码文件?

    我有一个 Windows 1255 希伯来语 编码的文件 我希望能够在 Node js 中访问它 我尝试使用打开文件fs readFile 它给了我一个Buffer我无能为力 我尝试将编码设置为Windows 1255 但这没有被识别 我还
  • 数据表 - 从 AJAX 源过滤数据

    我有一个数据表 正在从 api 获取数据 现在我的状态是活动的 非活动的 如果标志是活动的 那么我需要在数据表中显示 否则我不应该显示过期的 这是我的fiddle https jsfiddle net lakshmipriya001 qLp
  • 跟踪预防阻止了对 https://appsforoffice.microsoft.com/lib/1.1/hosted/office.js 存储的访问

    大约一年半前 我使用 OfficeJS API 编写了一个 Excel 加载项 它一直工作到大约两周前 Excel 似乎已经进行了更新 现在我可以右键单击任务窗格并查看开发工具 而以前我无法做到这一点 并且必须运行外部 MS Edge 开发
  • 反转比例函数

    这对我来说很有趣 看下面的D3代码 var scale d3 scale linear domain 100 500 range 10 350 scale 100 Returns 10 scale 300 Returns 180 scale
  • 单击 html 中的按钮后如何从 javascript 函数写入文件

    我正在尝试编写真正基本的代码 在 html 文件上按下按钮后 通过 JavaScript 函数在本地写入 txt 文件 这不可能吗 我可以仅使用 javascript 文件写入文件 但在尝试同时使用两者时则不能
  • 从 node.js 创建对 AWS ES 实例的有效签名请求

    我试图找到一个示例 说明如何连接到 Node js 中的 AWS ES 实例 然后通过一个简单的请求访问 ES 集群 我正在尝试使用elasticsearch节点包 https www npmjs com package elasticse
  • 数组长度未定义[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我试图按如
  • 如何使用node.js获取屏幕分辨率

    我需要使用 node js 获取屏幕分辨率 但以下代码不起作用 var w screen width var h screen height 这也行不通 var w window screen width var h window scre
  • gjs 如何使用 g_data_input_stream_read_line_async 在 Gnome Shell 扩展中读取套接字流

    我正在尝试编写一个 Gnome Shell 扩展 通过 Socket 服务器与 Arduino 进行通信 服务器和 Arduino 运行良好 但我陷入了监听传入服务器消息的扩展代码 因为我需要一种非阻塞方法 所以使用异步读取行 https

随机推荐

  • 大家一起学电脑之硬件版

    大家一起学电脑之硬件版 首先文章还是先从硬件的认识开始 再到安装操作系统的注意事项 再到进入与退出系统可能发生的情况与问题 然后再说单个硬件的详解 最后再说故障和技巧吧 晕 因为有些文章因为发现的晚 所以排序有点儿乱了 0 38 02 11
  • 区块链开发

    区块链开发如今常见的语言有哪一些 区块链技术其实在如今的市场上已经得到大家的关注 这是大部分人可能并不了解 这到底是一种什么样的技术 为什么各大行业的巨头都会比较关注呢 如今的区块链开发已经进入到火热的阶段 那么你是否知道到底包含哪一种主要
  • Mybatis 是如何进行分页的?分页插件的原理是什么?

    1 Mybatis 使用 RowBounds 对象进行分页 也可以直接编写 sql 实现分页 也可以使用 Mybatis 的分页插件 2 分页插件的原理 实现 Mybatis 提供的接口 实现自定义插件 在插件的拦截方法内拦 截待执行的 s
  • git 如何解决 (master

    git 如何解决 master MERGING git reset hard head 回退版本信息 git pull origin master 转载于 https www cnblogs com 651434092qq p 110188
  • 国产开源新标杆!20B大模型,性能媲美Llama2-70B,单卡可推理

    明敏 发自 凹非寺量子位 公众号 QbitAI 国产新标杆 免费可商用的200亿参数大模型 来了 书生 浦语大模型 InternLM 20B版本正式发布 一举刷新国内新一代大模型开源纪录 它由上海人工智能实验室 上海AI实验室 与商汤科技联
  • MySQL入门---超详细安装及基本使用教程

    数据库技术和数据库系统 数据库技术和数据库系统已经成为计算机信息系统的核心技术和重要基础 gt gt MySQL简介 MySQL是一款单进程多线程 支持多用户 基于客户机 服务器 Client Server C S 的关系数据库管理系统 是
  • 怎么使用blender

    Blender是一款开源3D建模和动画软件 可以用来制作三维图像 动画 游戏 音频和视频 要使用Blender 需要先下载并安装该软件 安装完成后 打开Blender 您会看到一个3D空间 包含一个默认的立方体 可以通过鼠标和键盘来对立方体
  • strdup函数的用法

    函数名 strdup 功 能 将串拷贝到新建的位置处 用 法 char strdup char str 这个函数在linux的man手册里解释为 The strdup function returns a pointer toa new s
  • 推荐系统实战5——EasyRec 在DSSM召回模型中添加负采样构建CTR点击平台

    推荐系统实战5 EasyRec 在DSSM召回模型中添加负采样构建CTR点击平台 学习前言 EasyRec仓库地址 DSSM实现思路 一 DSSM整体结构解析 二 网络结构解析 1 Embedding层的构建 2 网络层的构建 3 相似度计
  • 【毕业设计】深度学习验证码识别算法研究与实现 - python 机器视觉

    文章目录 0 简介 1 数据收集 2 识别过程 3 网络构建 4 数据读取 5 模型训练 6 加入Dropout层 7 数据增强 8 迁移学习 9 结果 9 最后 0 简介 Hi 大家好 这里是丹成学长的毕设系列文章 对毕设有任何疑问都可以
  • 测试老鸟总结,性能测试需求分析-性能必要性,一篇打通...

    目录 导读 前言 一 Python编程入门到精通 二 接口自动化项目实战 三 Web自动化项目实战 四 App自动化项目实战 五 一线大厂简历 六 测试开发DevOps体系 七 常用自动化测试工具 八 JMeter性能测试 九 总结 尾部小
  • java中Optional使用方法

    Optional是Java 8中提供的一个容器类 用来装载可能为空的引用 在使用Optional时 不需要检查null 可以避免NullPointerException 1 创建Optional实例 Optional可以通过工厂方法of o
  • Linux下PostgreSQL主备环境搭建和切换

    1 概念 数据库热备 数据库热备是指为主数据库的创建 维护和监控一个或多个备用数据库 它们时刻处于开机状态 同主机保持同步 当主机失灵时 可以随时启用热备数据库来代替 以保护数据不受故障 灾难 错误和崩溃的影响 流复制 streaming
  • ubuntu基于docker搭建hadoop集群【史上最详细】

    1 安装docker ubuntu 18 04安装 docker 2 拉取 ubuntu镜像 如果不指定版本号的话 默认拉取最新的ubuntu版本 docker pull ubuntu 3 创建容器 1 查看已拉取的镜像 docker im
  • 统信UOS桌面操作系统安装教程

    配置推荐 CPU 频率 2GHz 及更高的处理器 内存 推荐配置 4GB 以上 最低配置 2GB 硬盘 至少 64GB 的空闲硬盘 https www uniontech com next product desktop system ed
  • Linux系统:安装python3

    目录 一 python函数输出 1 print 函数输出 二 实验 1 安装python3 一 python函数输出 1 print 函数输出 1 概念 在Python中 使用内置的print 函数可以将结果输出到IDLE或者标准控制台上
  • 人工智能-知识图谱的进阶一

    第一部分 概论 本文主要分为三个部分 第一个部分介绍我们为什么需要知识图谱 第二个部分介绍知识图谱的相关概念及其形式化表示 最后 作一个简单的总结 并介绍该专栏后续文章会涉及的内容 一 看到的不仅仅是字符串 当你看见下面这一串文本你会联想到
  • config:fail,invalid signature

    微信开发调用JS SDK某些页面报config fail invalid signature 注意 是某些页面才会报这个错误 导致 wx config 失败 百思不得解 看了几遍文档 确认url是页面完整的url 请在当前页面alert l
  • ffprobe查看多媒体流音视频详情

    ffprobe查看多媒体流音视频详情 ffprobe是一个简单的多媒体流解析器 可以查看多媒体流音视频详情 1 ffprobe简介 ffprobe从多媒体流中收集信息 并以人机可读的方式进行打印 例如 它可以用来检查多媒体流使用的容器的格式
  • JavaScript实现简单文本编辑功能

    核心属性 方法 contentEditable html属性 用来设置 或 返回元素的内容是否可以被编辑 语法 p p HTMLElementObject contentEditable true false HTMLElementObje
Powered by Hwhale