首页 > 编程语言 >微信小程序之实现封装一个富文本编辑器 Editor

微信小程序之实现封装一个富文本编辑器 Editor

时间:2023-03-31 17:58:27浏览次数:46  
标签:function 文本编辑 .. 微信 编辑器 2.7 Editor data editorCtx

前言

富文本编辑器,可以对图片、文字进行编辑。

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

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

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

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

 

一、富文本编辑器的使用


1.富文本编辑器属性

 

属性类型默认值必填说明最低版本
read-only boolean false 设置编辑器为只读 2.7.0
placeholder string   提示信息 2.7.0
show-img-size boolean false 点击图片时显示图片大小控件 2.7.0
show-img-toolbar boolean false 点击图片时显示工具栏控件 2.7.0
show-img-resize boolean false 点击图片时显示修改尺寸控件 2.7.0
bindready eventhandle   编辑器初始化完成时触发 2.7.0
bindfocus eventhandle   编辑器聚焦时触发,event.detail = {html, text, delta} 2.7.0
bindblur eventhandle   编辑器失去焦点时触发,detail = {html, text, delta} 2.7.0
bindinput eventhandle   编辑器内容改变时触发,detail = {html, text, delta} 2.7.0
bindstatuschange eventhandle   通过 Context 方法改变编辑器内样式时触发,返回选区已设置的样式 2.7.0

 

2.富文本编辑器使用

1、定义模板

<template name="skyeditor">
<view class='toolbar' bindtap="format">
          <i class="iconfont icon-zitijiacu {{formats.bold ? 'ql-active' : ''}}" data-name="bold" bindtap="editorjs" data-bind="format"></i>
          <i class="iconfont icon-zitixieti {{formats.italic ? 'ql-active' : ''}}" data-name="italic"  bindtap="editorjs" data-bind="format"></i>
          <i class="iconfont icon-zitixiahuaxian {{formats.underline ? 'ql-active' : ''}}" data-name="underline" bindtap="editorjs" data-bind="format"></i>
          <i class="iconfont icon-zitishanchuxian {{formats.strike ? 'ql-active' : ''}}" data-name="strike"  bindtap="editorjs" data-bind="format"></i>
          <i class="iconfont icon-zuoduiqi {{formats.align === 'left' ? 'ql-active' : ''}}" data-name="align" data-value="left" bindtap="editorjs" data-bind="format"></i>
          <i class="iconfont icon-juzhongduiqi {{formats.align === 'center' ? 'ql-active' : ''}}" data-name="align" data-value="center" bindtap="editorjs" data-bind="format"></i>
          <i class="iconfont icon-youduiqi {{formats.align === 'right' ? 'ql-active' : ''}}" data-name="align" data-value="right" bindtap="editorjs" data-bind="format"></i>
          <i class="iconfont icon-zuoyouduiqi {{formats.align === 'justify' ? 'ql-active' : ''}}" data-name="align" data-value="justify" bindtap="editorjs" data-bind="format"></i>
          <i class="iconfont icon-line-height {{formats.lineHeight ? 'ql-active' : ''}}" data-name="lineHeight" data-value="2" bindtap="editorjs" data-bind="format"></i>
          <i class="iconfont icon-Character-Spacing {{formats.letterSpacing ? 'ql-active' : ''}}" data-name="letterSpacing" data-value="2em"  bindtap="editorjs" data-bind="format"></i>
          <i class="iconfont icon-722bianjiqi_duanqianju {{formats.marginTop ? 'ql-active' : ''}}" data-name="marginTop" data-value="20px"  bindtap="editorjs" data-bind="format"></i>
          <i class="iconfont icon-723bianjiqi_duanhouju {{formats.micon-previewarginBottom ? 'ql-active' : ''}}" data-name="marginBottom" data-value="20px"  bindtap="editorjs" data-bind="format"></i>
          <i class="iconfont icon-clearedformat"  bindtap="editorjs" data-bind="removeFormat"></i>
          <i class="iconfont icon-font {{formats.fontFamily ? 'ql-active' : ''}}" data-name="fontFamily" data-value="Pacifico"  bindtap="editorjs" data-bind="format"></i>
          <i class="iconfont icon-fontsize {{formats.fontSize === '24px' ? 'ql-active' : ''}}" data-name="fontSize" data-value="24px"  bindtap="editorjs" data-bind="format"></i>

          <i class="iconfont icon-text_color {{formats.color === '#0000ff' ? 'ql-active' : ''}}" data-name="color" data-value="#0000ff"  bindtap="editorjs" data-bind="format"></i>
          <i class="iconfont icon-fontbgcolor {{formats.backgroundColor === '#00ff00' ? 'ql-active' : ''}}" data-name="backgroundColor" data-value="#00ff00"  bindtap="editorjs" data-bind="format"></i>

          <i class="iconfont icon-date" bindtap="editorjs" data-bind="insertDate"></i>
          <i class="iconfont icon--checklist" data-name="list" data-value="check"  bindtap="editorjs" data-bind="format"></i>
          <i class="iconfont icon-youxupailie {{formats.list === 'ordered' ? 'ql-active' : ''}}" data-name="list" data-value="ordered"  bindtap="editorjs" data-bind="format"></i>
          <i class="iconfont icon-wuxupailie {{formats.list === 'bullet' ? 'ql-active' : ''}}" data-name="list" data-value="bullet"  bindtap="editorjs" data-bind="format"></i>
          <i class="iconfont icon-undo"  bindtap="editorjs" data-bind="undo"></i>
          <i class="iconfont icon-redo"  bindtap="editorjs" data-bind="redo"></i>

          <i class="iconfont icon-outdent" data-name="indent" data-value="-1"  bindtap="editorjs" data-bind="format"></i>
          <i class="iconfont icon-indent" data-name="indent" data-value="+1"  bindtap="editorjs" data-bind="format"></i>
          <i class="iconfont icon-fengexian"  bindtap="editorjs" data-bind="insertDivider"></i>
          <i class="iconfont icon-charutupian" bindtap="editorjs" data-bind="insertImage"></i>
          <i class="iconfont icon-format-header-1 {{formats.header === 1 ? 'ql-active' : ''}}" data-name="header" data-value="{{1}}"  bindtap="editorjs" data-bind="format"></i>
          <i class="iconfont icon-zitixiabiao {{formats.script === 'sub' ? 'ql-active' : ''}}" data-name="script" data-value="sub"  bindtap="editorjs" data-bind="format"></i>
          <i class="iconfont icon-zitishangbiao {{formats.script === 'super' ? 'ql-active' : ''}}" data-name="script" data-value="super"  bindtap="editorjs" data-bind="format"></i>
          <!-- <i class="iconfont icon-quanping"></i> -->
          <i class="iconfont icon-shanchu" bindtap="editorjs" data-bind="clear"></i>
          <i class="iconfont icon-direction-rtl {{formats.direction === 'rtl' ? 'ql-active' : ''}}" data-name="direction" data-value="rtl"  bindtap="editorjs" data-bind="format"></i>

        </view>

        <editor id="editor" class="ql-container" placeholder="{{placeholder}}" showImgSize showImgToolbar showImgResize bindstatuschange="onStatusChange" read-only="{{readOnly}}" bindready="onEditorReady">
        </editor>
</template>

js

function editorfunction(e) {

  //获取当前工作路径,that变量等同于页面本身的this
  var pages = getCurrentPages();
  var that = pages[pages.length - 1]
  var e = e.currentTarget.dataset
  //改变文本样式方法
  if (e.bind == "format") {
    if (!e.name) return
    that.editorCtx.format(e.name, e.value)
  }
  //删除字体样式方法
  if (e.bind == "removeFormat") {
    that.editorCtx.removeFormat()
  }
  //快速插入日期方法
  if (e.bind == "insertDate") {
    var date = new Date()
    var formatDate = `${date.getFullYear()}年${date.getMonth() + 1}月${date.getDate()}日`
    that.editorCtx.insertText({
      text: formatDate
    })
  }
  //撤销操作方法
  if (e.bind == "undo") {
    that.editorCtx.undo()
  }
  //恢复操作方法
  if (e.bind == "redo") {
    that.editorCtx.redo()
  }
  //添加分割线方法
  if (e.bind == "insertDivider") {
    that.editorCtx.insertDivider()
  }
  //清除内容方法
  if (e.bind == "clear") {
    that.editorCtx.clear()
  }
  //插入图片方法
  if (e.bind == "insertImage") {
    wx.chooseImage({
      count: 1,
      sizeType: ["compressed"], // 可以指定是原图还是压缩图,默认二者都有
      sourceType: ["album", "camera"], // 可以指定来源是相册还是相机,默认二者都有
      success: function (res) {
        wx.showLoading({
          title: "加载中",
          mask: true
        })
        wx.uploadFile({
          url: getApp().globalData.url + "activity/uploadimg",//里填写自己的图片上传方法地址
          header: {// 设置请求的 header
            "content-type": "multipart/form-data"
          },
          filePath: res.tempFilePaths[0],
          name: "img",
          success(res) {
            wx.hideLoading()
            var data = JSON.parse(res.data)
            if (data.code == 1) {
              that.editorCtx.insertImage({
                src: data.data,
                data: {
                  id: "abcd",
                  role: "god"
                },
              })
            } else {
              wx.showToast({
                title: data.data,
                icon: "none"
              })
            }
          }
        })
      }
    })
  }
}

module.exports = {
  editorfunction: editorfunction,//引用editor方法,外部唯一暴露接口
}

css

@import "../../common/lib/weui.wxss";
@import "../../common/lib/iconfont.wxss";
.iconfont {
  display: inline-block;
  padding: 8px 8px;
  width: 24px;
  height: 24px;
  cursor: pointer;
  font-size: 20px;
}

.toolbar {
  box-sizing: border-box;
  /* border: 1px solid #ccc; */
  border-bottom: 0;
  font-family: 'Helvetica Neue', 'Helvetica', 'Arial', sans-serif;
}

.ql-container {
  box-sizing: border-box;
  padding: 12px 15px;
  width: 100%;
  min-height: 30vh;
  height: auto;
  background: #fff;
  margin: 20px 0px;
  font-size: 16px;
  line-height: 1.5;
  border: 1rpx solid #cccccc;
  border-radius: 15rpx;
}

.ql-active {
  color: #06c;
}

 

2、页面引用模板

wxml

<text>
使用说明:
1、在js文件中引入模板文件js
2、在css文件中引入模板文件wxss
3、在wxml文件中引入,不想用的图标只需要删除相应的i即可。
</text>

<import src="../../templates/skyeditor/skyeditor"/>
<template is="skyeditor" data="{{formats:editor_formats}}"/>

<button class="button" type="primary" bindtap="gotoyingyong">查看应用</button>

js

// pages/default/default.js
var editorjs = require('../../templates/skyeditor/skyeditor.js')

Page({

  /**
   * 页面的初始数据
   */
  data: {

  },

  /**
   * 生命周期函数--监听页面加载
   */
  onl oad: function (options) {

  },

  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady: function () {

  },

  /**
   * 生命周期函数--监听页面显示
   */
  onShow: function () {

  },

  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide: function () {

  },

  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload: function () {

  },

  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh: function () {

  },

  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom: function () {

  },

  /**
   * 用户点击右上角分享
   */
  onShareAppMessage: function () {

  },

  gotoyingyong:function(){
    wx.navigateTo({
      url: '../yingyong/yingyong',
    })
  },
  /**
   * 重写没有任何实际意义,只是为了编辑器不带警告,删除也不影响运行。
   * 如果处女座不想看到警告,把其它的方法写一下就行了。
   */
  format:function(){},

   //实例化富文本
   onEditorReady() {
    var that = this
    wx.createSelectorQuery().select('#editor').context(function (res) {
     that.editorCtx = res.context
       }).exec()
   },
    
  //富文本样式改变后,向WXML传值,改变按钮选中状态方法
  onStatusChange(e) {
   this.setData({editor_formats: e.detail})
  },
  //设置富文本内容方法
 setEditor:function(e){
     this.setData({
     editorhtml:e.detail.html
 })
 //富文本最终得到的HMTL数据为:this.data.html
 },
 //引用editor方法
 editorjs:function(e){
  editorjs.editorfunction(e)
 },
})

css

@import "../../templates/skyeditor/skyeditor.wxss";

 

 

 

 

转: https://blog.csdn.net/XH_jing/article/details/115509316

https://codeboy.blog.csdn.net/article/details/107686266

 

标签:function,文本编辑,..,微信,编辑器,2.7,Editor,data,editorCtx
From: https://www.cnblogs.com/fps2tao/p/17277033.html

相关文章

  • 微信小程序组件化开发教程、微信小程序组件化开发示例代码
    微信小程序中的组件化开发可以使用template和Component两种方式来实现。template模板实现组件template模板是一种很简单的组件化方式,通常用于展示静态的内容。可以将页面中的某一段代码封装为一个template模板,再在需要使用的地方引入该模板即可。下面以一个简单的自定......
  • 微信小程序中图片上传
    封装了图片上传组件,支持多张上传,图片预览代码如下:组件调用:index.tsx<UploadPicmaxNumber={3}fileList={pics}fileChange={(e)=>{console.log('e',e)setPics(e)}}/>图片上传封装UploadPic.tsximportReactfrom'react';importTarofrom&......
  • SpringBoot 集成微信支付的各种支付产品
    SpringBoot是一款非常流行的Java开发框架,而微信支付则是众多移动支付产品中的佼佼者,整合两者可以让我们更方便地开发各种支付产品。在本篇博客中,我将介绍如何在SpringBoot中整合微信支付的各种支付产品。准备工作微信支付官网注册一个微信支付商户账号创建一个微信支付应用......
  • 微信小程序累计独立访客(UV)不低于 1000 是什么意思
    首先微信小程序“累计独立访客(UV)不低于1000”是指UV是UniqueVisitor的英文缩写,1天内相同的访客多次访问您的网站只计算1个UV,以cookie为依据。简单的说就是指:累计的不同IP的访客合计达到1000+才能开通流量主独立访客(UV)名词:UV=UniqueVisitor(独立访客数)说明:1天内相同的访客多......
  • 微信小程序i18n文件夹新增语言文件报:module is not defined
    背景:微信开发者工具的版本:1.06.2303060Stable 解决步骤:1.首先需要排除的是代码逻辑层面没有问题,对应要require的js文件也存在。2.升级微信开发者工具到最新版本3.打开详情=》本地设置,把“将JS编译成ES5”的去掉勾选后再次选择4.重新打开项目......
  • 分析微信好友数据,可以可视化好友男女比例分布,可视化省份来源,可视化签名的情感强度值
    一、分析数据可视化好友男女分布比例 1plt.rcParams['font.sans-serif']=['SimHei']2#用来正常显示中文标签3plt.rcParams['axes.unicode_minus']=False45#1.读取csv文件,把性别信息读取出来6defgetSex(filename):7lstsex=[]8withopen(fi......
  • ChatGPT 微信接入 C#完整源码
    1.无需搭建服务器,操作极其简单。  2.winform运行程序扫码进行微信登录,勾上自动回复,就可以充当机器人调用chatGPT可实现自动回复,可以申请小号操作。  3.可以识别会话消息和群聊消息,拉入群聊@机器人可以进行群聊的消息回复,可以得到@自己的回复消息。4.代码是完整的也......
  • 微信开发:个人页面
    微信开发:个人页面wxml:<!--用户列表选项--><scroll-viewclass="scbg"scroll-y='true'><viewclass="parent_catainer"><!--头部--><!--style="background-image:url('/images/persons/mind_hea......
  • ckeditor如何能实现直接粘贴把图片上传到服务器中
    ​ 在之前在工作中遇到在富文本编辑器中粘贴图片不能展示的问题,于是各种网上扒拉,终于找到解决方案,在这里感谢一下知乎中众大神以及TheViper。通过知乎提供的思路找到粘贴的原理,通过TheViper找到粘贴图片的方法。其原理为一下步骤:监听粘贴事件;【用于插入图片】获取光标位置;【......
  • fckeditor如何能实现直接粘贴把图片上传到服务器中
    ​ 自动导入Word图片,或者粘贴Word内容时自动上传所有的图片,并且最终保留Word样式,这应该是Web编辑器里面最基本的一个需求功能了。一般情况下我们将Word内容粘贴到Web编辑器(富文本编辑器)中时,编辑器都无法自动上传图片。需要用户手动一张张上传Word图片。如果只有一张图片还能够接......