uniapp - editor 富文本的使用

目录

editor 组件

属性说明

editorContext

uni.createSelectorQuery()

SelectorQuery

selectorQuery.in(component)

selectorQuery.select(selector)

selectorQuery.selectAll(selector)

selectorQuery.selectViewport()

selectorQuery.exec(callback)

NodesRef

nodesRef.fields(object,callback)

editorContext.format(name, value)

editorContext.insertDivider(OBJECT)

editorContext.insertImage(OBJECT)

editorContext.getContents(OBJECT)

 完整例子


editor 组件

富文本编辑器,可以对图片、文字格式进行编辑和混排。

在web开发时,可以使用contenteditable来实现内容编辑。但这是一个dom API,在非H5平台无法使用。于是微信小程序和uni-app的App-vue提供了editor组件来实现这个功能,并且在uni-app的H5平台也提供了兼容。从技术本质来讲,这个组件仍然运行在视图层webview中,利用的也是浏览器的contenteditable功能。

编辑器导出内容支持带标签的 html和纯文本的 text,编辑器内部采用 delta 格式进行存储。

通过setContents接口设置内容时,解析插入的 html 可能会由于一些非法标签导致解析错误,建议开发者在应用内使用时通过 delta 进行插入。

富文本组件内部引入了一些基本的样式使得内容可以正确的展示,开发时可以进行覆盖。需要注意的是,在其它组件或环境中使用富文本组件导出的html时,需要额外引入这段样式,并维护<ql-container><ql-editor></ql-editor></ql-container>的结构,参考:使用 editor 组件导出的 html。

图片控件仅初始化时设置有效。

相关 api:editorContext

属性说明

属性类型默认值必填说明
read-onlybooleanfalse设置编辑器为只读
placeholderstring提示信息
show-img-sizebooleanfalse点击图片时显示图片大小控件
show-img-toolbarbooleanfalse点击图片时显示工具栏控件
show-img-resizebooleanfalse点击图片时显示修改尺寸控件
@readyeventhandle编辑器初始化完成时触发
@focuseventhandle编辑器聚焦时触发,event.detail = {html, text, delta}
@blureventhandle编辑器失去焦点时触发,detail = {html, text, delta}
@inputeventhandle编辑器内容改变时触发,detail = {html, text, delta}
@statuschangeeventhandle通过 Context 方法改变编辑器内样式时触发,返回选区已设置的样式

editorContext

editor 组件对应的 editorContext 实例,可通过 uni.createSelectorQuery 获取。

uni.createSelectorQuery()

返回一个 SelectorQuery 对象实例。可以在这个实例上使用 select 等方法选择节点,并使用 boundingClientRect 等方法选择需要查询的信息。

Tips:

  • 使用 uni.createSelectorQuery() 需要在生命周期 mounted 后进行调用。
  • 默认需要使用到 selectorQuery.in 方法。

SelectorQuery

查询节点信息的对象

selectorQuery.in(component)

将选择器的选取范围更改为自定义组件 component 内,返回一个 SelectorQuery 对象实例。(初始时,选择器仅选取页面范围的节点,不会选取任何自定义组件中的节点)。

代码示例

const query = uni.createSelectorQuery().in(this);
query.select("#id").boundingClientRect((data) => {console.log("得到布局位置信息" + JSON.stringify(data));console.log("节点离页面顶部的距离为" + data.top);}).exec();

注意

  • 支付宝小程序不支持 in(component),使用无效果

selectorQuery.select(selector)

在当前页面下选择第一个匹配选择器 selector 的节点,返回一个 NodesRef 对象实例,可以用于获取节点信息。

selector 说明:

selector 类似于 CSS 的选择器,但仅支持下列语法。

  • ID 选择器:#the-id
  • class 选择器(可以连续指定多个):.a-class.another-class
  • 子元素选择器:.the-parent > .the-child
  • 后代选择器:.the-ancestor .the-descendant
  • 跨自定义组件的后代选择器:.the-ancestor >>> .the-descendant (H5 暂不支持)
  • 多选择器的并集:#a-node, .some-other-nodes

selectorQuery.selectAll(selector)

在当前页面下选择匹配选择器 selector 的所有节点,返回一个 NodesRef 对象实例,可以用于获取节点信息。

selectorQuery.selectViewport()

选择显示区域,可用于获取显示区域的尺寸、滚动位置等信息,返回一个 NodesRef 对象实例。

selectorQuery.exec(callback)

执行所有的请求。请求结果按请求次序构成数组,在 callback 的第一个参数中返回。

NodesRef

用于获取节点信息的对象

nodesRef.fields(object,callback)

获取节点的相关信息。第一个参数是节点相关信息配置(必选);第二参数是方法的回调函数,参数是指定的相关节点信息。

object 参数说明

字段名类型默认值必填说明平台差异说明
idBooleanfalse是否返回节点 id
datasetBooleanfalse是否返回节点 datasetApp、微信小程序、H5
rectBooleanfalse是否返回节点布局位置(left right top bottom
sizeBooleanfalse是否返回节点尺寸(width height
scrollOffsetBooleanfalse是否返回节点的 scrollLeft scrollTop,节点必须是 scroll-view 或者 viewport
propertiesArray<string>[]指定属性名列表,返回节点对应属性名的当前属性值(只能获得组件文档中标注的常规属性值,id class style 和事件绑定的属性值不可获取)仅 App 和微信小程序支持
computedStyleArray<string>[]指定样式名列表,返回节点对应样式名的当前值仅 App 和微信小程序支持
contextBooleanfalse是否返回节点对应的 Context 对象仅 App 和微信小程序支持

editorContext.format(name, value)

修改样式

参数类型说明
nameString属性
valueString

支持设置的样式列表

namevalue平台差异说明
bold
italic
underline
strike
ins
scriptsub / super
headerH1 / H2 / h3 / H4 / h5 / H6
alignleft / center / right / justifyleft百度小程序不支持
directionrtl
indent-1 / +1
listordered / bullet / check
colorhex color
backgroundColorhex color
margin/marginTop/marginBottom/marginLeft/marginRightcss style百度小程序不支持
padding/paddingTop/paddingBottom/paddingLeft/paddingRightcss style百度小程序不支持
font/fontSize/fontStyle/fontVariant/fontWeight/fontFamilycss style百度小程序不支持
lineHeightcss style百度小程序不支持
letterSpacingcss style百度小程序不支持
textDecorationcss style百度小程序不支持
textIndentcss style百度小程序不支持
wordWrapcss style百度小程序不支持
wordBreakcss style百度小程序不支持
whiteSpacecss style百度小程序不支持

对已经应用样式的选区设置会取消样式。css style 表示 css 中规定的允许值。

editorContext.insertDivider(OBJECT)

插入分割线

OBJECT 参数说明

属性类型默认值必填说明
successFunction接口调用成功的回调函数
failFunction接口调用失败的回调函数
completeFunction接口调用结束的回调函数(调用成功、失败都会执行)

editorContext.insertImage(OBJECT)

插入图片。

微信小程序平台地址为临时文件时,获取的编辑器html格式内容中 <img> 标签增加属性 data-local,delta 格式内容中图片 attributes 属性增加 data-local 字段,该值为传入的临时文件地址。 开发者可选择在提交阶段上传图片到服务器,获取到网络地址后进行替换。替换时对于html内容应替换掉 <img> 的 src 值,对于 delta 内容应替换掉 insert { image: abc } 值。

OBJECT 参数说明

属性类型默认值必填说明
srcString图片地址,仅支持 http(s)、base64、本地图片
altString图像无法显示时的替代文本
widthString图片宽度(pixels/百分比),2.6.5+ 支持,百度小程序不支持
heightString图片高度 (pixels/百分比),2.6.5+ 支持,百度小程序不支持
extClassString添加到图片 img 标签上的类名,2.6.5+ 支持
dataObjectdata 被序列化为 name=value;name1=value2 的格式挂在属性 data-custom 上,2.6.5+ 支持
successFunction接口调用成功的回调函数
failFunction接口调用失败的回调函数
completeFunction接口调用结束的回调函数(调用成功、失败都会执行)

editorContext.getContents(OBJECT)

获取编辑器内容

OBJECT 参数说明

属性类型默认值必填说明
successFunction接口调用成功的回调函数
failFunction接口调用失败的回调函数
completeFunction接口调用结束的回调函数(调用成功、失败都会执行)

object.success 回调函数

属性类型说明
htmlstring带标签的 HTML 内容
textstring纯文本内容
deltaObject表示内容的 delta 对象

 完整例子

<template><view class="edit"><view class="title"><input type="text" v-model="artData.title" placeholder="请输入完整的标题" placeholder-class="placeholderClass" /></view><view class="content"><editorclass="myEdit"placeholder="写点什么吧~~"show-img-resizeshow-img-toolbarshow-img-size@ready="onEditReady"@focus="OnFocus"@statuschange="statuschange"></editor></view><view class="btnGroup"><u-button type="primary" text="确认发表" @click="onSubmit" :disabled="!artData.title"></u-button></view><view class="tools" v-show="toolsShow"><!-- 标题 --><view class="item" @click="headChange"><text class="iconfont icon-zitibiaoti" :class="headShow ? 'active' : ''"></text></view><!-- 加粗 --><view class="item" @click="boldChange"><text class="iconfont icon-zitijiacu" :class="boldShow ? 'active' : ''"></text></view><!-- 斜体 --><view class="item" @click="italicChange"><text class="iconfont icon-zitixieti" :class="italicShow ? 'active' : ''"></text></view><!-- 分割线 --><view class="item" @click="insertDivider"><text class="iconfont icon-fengexian"></text></view><view class="item" @click="insertImage"><text class="iconfont icon-charutupian"></text></view><!-- 完成 --><view class="item" @click="editOk"><text class="iconfont icon-duigou_kuai"></text></view></view></view>
</template><script>
export default {data() {return {toolsShow: false,editorContent: null,headShow: false,boldShow: false,italicShow: false,artData: {title: '',content: ''}};},methods: {// 初始化onEditReady() {// 查询节点信息的对象// 将选择器的选取范围更改为自定义组件 component 内,返回一个 SelectorQuery 对象实例。(初始时,选择器仅选取页面范围的节点,不会选取任何自定义组件中的节点)。// 在当前页面下选择第一个匹配选择器 selector 的节点,返回一个 NodesRef 对象实例,可以用于获取节点信息。// 获取节点的相关信息。第一个参数是节点相关信息配置(必选);第二参数是方法的回调函数,参数是指定的相关节点信息。// 执行所有的请求。请求结果按请求次序构成数组,在 callback 的第一个参数中返回。uni.createSelectorQuery().in(this).select('.myEdit').fields({size: true, //是否返回节点尺寸(width height)context: true //是否返回节点尺寸(width height)},(res) => {console.log(res);this.editorContent = res.context;}).exec();},// 离开焦点OnFocus() {this.toolsShow = true;},// 添加分割线insertDivider() {this.editorContent.insertDivider();},// 添加大标题headChange() {this.headShow = !this.headShow;this.editorContent.format('header', this.headShow ? 'H2' : false);},// 加粗boldChange() {this.boldShow = !this.boldShow;this.editorContent.format('bold');},// 斜体italicChange() {this.italicShow = !this.italicShow;this.editorContent.format('italic');},// 用于检查对象detail是否包含名为name的属性checkStatus(name, detail, key) {if (detail.hasOwnProperty(name)) {this[key] = true;} else {this[key] = false;}},// 通过 Context 方法改变编辑器内样式时触发,返回选区已设置的样式(解决标题标签回弹问题)statuschange(e) {let detail = e.detail;console.log(detail);this.checkStatus('header', detail, 'headShow');this.checkStatus('bold', detail, 'boldShow');this.checkStatus('italic', detail, 'italicShow');},// 添加图像insertImage() {// 打开相机uni.chooseImage({count: 3, //默认9sizeType: ['compressed'], //可以指定是原图还是压缩图,默认二者都有success: async (res) => {let tempFiles = res.tempFiles;for (let item of tempFiles) {uni.showLoading({mask: true,title: '上传中...'});try {let res = await uniCloud.uploadFile({filePath: item.path, //要上传的文件对象cloudPath: item.name //cloudPath为云端文件名,});// 设置图片地址 图片地址,仅支持 http(s)、base64、本地图片this.editorContent.insertImage({src: res.fileID});uni.hideLoading();} catch (e) {uni.hideLoading();uni.showModal({content: '上传失败',title: '提示'});}}}});},// 确认editOk() {this.toolsShow = false;},onSubmit() {console.log(11);this.editorContent.getContents({success: (res) => {console.log(res);this.artData.content = res.html;}});}}
};
</script><style lang="scss">
/deep/ .ql-blank::before {font-style: normal;color: #e0e0e0;
}.edit {padding: 30rpx;.title {input {height: 120rpx;font-size: 46rpx;border-bottom: 1px solid #e4e4e4;margin-bottom: 30rpx;color: #000;}.placeholderClass {color: #e0e0e0;}}.content {.myEdit {height: calc(100vh - 500rpx);margin-bottom: 30rpx;}}.tools {width: 100%;height: 80rpx;background: #fff;border-top: 1rpx solid #f4f4f4;position: fixed;left: 0;bottom: 0;display: flex;justify-content: space-around;align-items: center;.iconfont {font-size: 36rpx;color: #333;// 选择按钮的高亮&.active {color: #0199fe;}}}
}
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/654739.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32 有源蜂鸣器

模块介绍: 结构&#xff1a;有源蜂鸣器通常由一个振膜和一个驱动电路组成。振膜是负责产生声音的部分&#xff0c;而驱动电路则负责控制振荡频率和幅度。 工作原理&#xff1a;有源蜂鸣器的驱动电路会向振膜施加电压&#xff0c;使其振动产生声音。驱动电路可以根据输入信号的…

ChatGPT升级,价格降低,不再懒惰!

OpenAI 1月26号宣布推出5种新模型&#xff0c;包括两款新的嵌入式模型、更新后的 GPT-4 Turbo 预览模型、GPT-3.5 Turbo 模型以及文本审核模型。 此外&#xff0c;chatgpt的价格也有低至50%的下降。新模型的输入价格下降 50% 至 $0.0005 /1K tokens&#xff0c;输出价格下降 2…

借助gpt生成ppt:文心一言(chatgpt)、chatppt

提供一种简单的基于gpt快速生成ppt的方式。前置条件&#xff1a; 文心一言chatpptwps/office ppt Step1: 下载chatppt插件 https://chat-ppt.com/invitelinke?share_code47949695&channelchat-ppt.com 注册地址 下载完成后&#xff0c;安装即可&#xff0c;安装完成后…

MyBatis框架-XML映射器

文章目录 XML映射器CRUD操作select根据id查询用户根据名字和密码查询方法一&#xff1a;使用对象UserMapper.javaUserMapper.xml测试用例方法二&#xff1a;使用MapUserMapper.javaUserMapper.xml测试用例方法三&#xff1a;方法种传递参数UserMapper.javaUserMapper.xml测试用…

如何看待开发者是否需要入坑鸿蒙?

前言 自打华为2019年发布鸿蒙操作系统以来&#xff0c;网上各种声音百家争鸣。尤其是2023年发布会公布的鸿蒙4.0宣称不再支持Android&#xff0c;更激烈的讨论随之而来。 通过本文&#xff0c;我将给大家介绍以下几点&#xff0c;让大家清楚的了解到鸿蒙开发的趋势&#xff1…

win11设置mysql开机自启

目录 命令式 1、打开命令提示符或 PowerShell&#xff1a; 2、使用管理员权限运行命令行工具&#xff1a; 3、设置 MySQL 服务为开机自启动&#xff1a; 4、启动 MySQL 服务&#xff1a; 5、 验证设置是否生效&#xff1a; 操作视图式 1、右击任务栏 ---> 选择任务管…

深入了解DRAM和SDRAM:内存带宽的计算与封装形式的奥秘

SSD SDRAM DDR SDRAM简介 动态随机存取存储器DRAM&#xff08;Dynamic Random Access Memory&#xff0c;DRAM&#xff09;是一种半导体存储器。 其主要的作用原理是利用电荷内存储电荷的数量来代表一个二进制比特&#xff08;bit&#xff09;是1还是0。 由于在现实中品体管…

【物联网之·协议·ZigBee】

系列文章目录 文章目录 前言一、ZigBee技术概述1.1 ZigBee的起源和发展历程1.2 ZigBee的工作原理和网络拓扑结构1.3 ZigBee的应用领域和主要优势 二、ZigBee协议栈2.1 Zigbee的协议栈结构和各层功能2.2 Zigbee协议栈的协议消息和数据格式 三、ZigBee网络配置3.1 Zigbee网络的组…

嵌⼊式⾯试宝典

编程功底问题 1. 简单描述下C语⾔中⼤⼩端的概念 ⼤⼩端是⼀种计算机存储数据的⽅式,它决定了在内存中如何排列多字节数据的字节顺序。 ⼤端:多字节数据的⾼位字节存储在内存的低地址处。 ⼩端:多字节数据的低位字节存储在内存的低地址处。 8051 stc单⽚机是⼩端模式 …

进京证12次不够用怎么办?(北京进京证探头分布,进京证365,进京365)外地车在京如何行驶——躲猫猫外地车在京地图导航

其实想要在北京驾驶外地牌照的车辆主要有两种方式&#xff0c;一种是办理进京证(六环内进京证一年只能办12次&#xff0c;一次有效期7天&#xff0c;所以大多数人是不够用的);另一种就是在非监控区域行驶&#xff0c;可以借助于一些摄像头定位工具&#xff0c;有效躲避摄像头&a…

洗地机哪个牌子好?2024洗地机推荐

洗地机作为一种几乎替代了传统无线吸尘器的清洁工具&#xff0c;近年来在市场上迅速崛起。其优越的清洁效果和智能化设计使其成为许多家庭不可或缺的家电之一。在短短的几年时间里&#xff0c;市场上涌现出了各种各样的品牌和型号&#xff0c;价格也从几百元到数千元不等&#…

LVGL部件

一.标签部件 1.如何创建标签部件以及设置文本 ![2024-01-28T09:54:08.png][3] void my_lvgl(void) {lv_obj_t *lablelv_label_create(lv_scr_act()); //创建一个标签lv_label_set_text(lable,"hello"); //普通更改文字lv_label_set_text_fmt(lab…

【C语言】(9)分支结构

一.if-else 语句 if-else 适用于简单和复杂的条件判断。 a. 基本 if 语句 用途&#xff1a;基本的条件测试。语法&#xff1a;if (condition) {// 代码块 }示例&#xff1a;if (score > 60) {printf("及格\n"); }b. if-else 语句 用途&#xff1a;二选一的条件…

基础小白快速学习c语言 ---c语言的简单介绍

c语言是由一个或者多个函数组成的&#xff0c;函数是由语句组成的&#xff0c;语句要用&#xff1b;结束 c语言开发过程&#xff1a; 1 创建一个源程序 2 预处理并且编程 c语言中的标准输入和标准输出 标准输出&#xff1a;printf printf是c语言标准库中提供的一个函数&…

有哪些原型图设计工具是你应该熟悉的?

今天我们将介绍 5 优秀的原型设计工具及其功能。每个软件都有不同的平台和价格范围。相信你能找到最适合你的原型工具&#xff01; 1、Sketch 以友好的用户而闻名 Sketch&#xff0c;对于设计师来说&#xff0c;有很多实用的功能。这个软件在图形编辑方面很受欢迎&#xff0c;…

【Django开发】前后端分离美多商城项目:项目准备和搭建(附代码,文档)

本系列文章md笔记&#xff08;已分享&#xff09;主要讨论django商城项目开发相关知识。本项目利用Django框架开发一套前后端不分离的商城项目&#xff08;4.0版本&#xff09;含代码和文档。功能包括前后端不分离&#xff0c;方便SEO。采用Django Jinja2模板引擎 Vue.js实现…

【webrtc】m98 : vs2019 直接构建webrtc及moduletest工程 2

字数有限制,我们继续 【webrtc】m98 : vs2019 直接构建webrtc及unitest工程 1modules_unittests 构建 Build started... 1>------ Build started: Project: modules_unittests, Configuration: GN Win32 ------ 1>ninja: Entering directory `G:\CDN\rtcCli\m98\src\o…

linux centos 查看端口是否打开与打开端口

查看端口是否打开 talnet talnet ip 端口linux查看防火墙开放情况 firewall-cmd --list-all打开端口 其中permanent表示永久生效&#xff0c;public表示作用域&#xff0c;443/tcp表示端口和类型&#xff0c;执行规则的重载 firewall-cmd --zonepublic --add-port443/tcp …

VitePress-04-文档中的表情符号的使用

说明 vitepress 的文档中是支持使用表情符号的&#xff0c;像 &#x1f602; 等常用的表情都是支持的。 本文就来介绍它的使用方式。 使用语法 语法 &#xff1a; :表情名称: 例如 &#xff1a; :joy: &#x1f602; 使用案例代码 # 体会【表情】的基本使用 > hello world …

Netty的高级用法(一)

前言 我们直到在网络通信中客户端和服务端之间除了要传输数据外&#xff0c;还会进行简单的心跳应答通信&#xff0c;使得客户端和服务端的连接处于一种活跃状态&#xff0c;那么客户端可以发送ONE_WAY和TWO_WAY两种方式的处理&#xff0c;而服务端在处理这两种类型的数据时会…