微信小程序 editor富文本

wxml

<import src="../common/head.wxml" />
<import src="../common/foot.wxml" />

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

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

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

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

      </view>

      <editor id="editor" value='{{dataArry}}' class="ql-container" placeholder="{{placeholder}}" bindblur='goplay'
        showImgSize showImgToolbar showImgResize bindstatuschange="onStatusChange" bindinput="onBindInput" bindready="onEditorReady">
      </editor>

      <view>
        <button disabled="{{isSublimt}}" bindtap="sublimt">提交</button>
      </view>
    </view>
  </view>

  <template is="foot" />
</view>

js

Page({
  data: {
    formats: {},
    readOnly: false,
    placeholder: '开始输入...',
    dataArry: "",
    isSublimt: true
  },
  readOnlyChange() {
    this.setData({
      readOnly: !that.data.readOnly
    })
  },
  onLoad() {
    const that = this
    wx.createSelectorQuery().select('#editor').context(function (res) {
      that.editorCtx = res.context;
      that.editorCtx.setContents({
        html: that.data.dataArry,
      })
    }).exec();
  },
  onBindInput(e) {
    let self = this
    if (e.detail.text.length != 1) {
      self.setData({
        isSublimt: false
      })
    } else {
      self.setData({
        isSublimt: true
      })
    }
  },
  removeFormat() {
    this.editorCtx.removeFormat()
  },
  onEditorReady() {
    const that = this
    wx.createSelectorQuery().select('#editor').context(function (res) {
      that.editorCtx = res.context
    }).exec()
  },
  blur() {
    this.editorCtx.blur()
  },
  format(e) {
    let {
      name,
      value
    } = e.target.dataset
    if (!name) return
    this.editorCtx.format(name, value)

  },
  insertImage() {
    const that = this
    wx.chooseImage({
      count: 9,
      sizeType: ['original', 'compressed'],
      sourceType: ['album', 'camera'],
      success: function (res) {
        that.getpublish(res.tempFilePaths, 0)
      }
    })
  },
  clear() {
    this.editorCtx.clear({
      success: function (res) {
        console.log("clear success")
      }
    })
  },
  insertDivider() {
    this.editorCtx.insertDivider({
      success: function () {
        console.log('insert divider success')
      }
    })
  },
  undo() {
    this.editorCtx.undo()
  },
  redo() {
    this.editorCtx.redo()
  },
  insertDate() {
    const date = new Date()
    const formatDate = `${date.getFullYear()}/${date.getMonth() + 1}/${date.getDate()}`
    this.editorCtx.insertText({
      text: formatDate
    })
  },
  // 递归循环下载图片
  getpublish(list, i) {
    wx.showLoading({
      title: '正在上传第' + (i + 1) + '张',
    })
    var that = this
    wx.uploadFile({
      url: "https://api110.herbplantist.com/sucai/public/index.php/post/post/uploadFile",
      filePath: list[i],
      name: 'file',
      formData: {
        key: 'Gn1xVdBiTClSSHKZifg0pTQSU5XGagWO',
        is_https: 1,
      },
      success(res) {
        var data = JSON.parse(res.data)
        console.log(data)
        if (data.status == 200) {
          that.editorCtx.insertImage({
            src: data.info.url,
            success: function () {}
          })
        }
        if (i + 1 == list.length) {
          wx.showToast({
            title: '上传成功',
          });
        }
        wx.hideLoading()
        if (++i < list.length) {
          that.getpublish(list, i);
        }
      },
    })
  },
  goplay(e) {
    this.setData({
      dataArry: e.detail.html
    })
  },

  sublimt() {
    let that = this
    wx.showModal({
      title: '温馨提示',
      content: '确定提交?',
      success(res) {
        if (res.confirm) {
          wx.showToast({
            title: '提交成功,打开调试看打印',
          })
          console.log(that.data.dataArry)
        } else if (res.cancel) {
          console.log('用户点击取消')
        }
      }
    })
  }
})

wxss

@import "../common/lib/weui.wxss";
@import "./assets/iconfont.wxss";

.wrapper {
  padding: 5px;
}

.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: 60vh;
  height: auto;
  /* border-top: 1px solid #ccc;
  border-bottom: 1px solid #ccc; */
  background: #fff;
  margin-top: 20px;
  font-size: 16px;
  line-height: 1.5;
}

.ql-active {
  color: #06c;
}
原文地址:https://www.cnblogs.com/mr17/p/14512264.html