zoukankan      html  css  js  c++  java
  • 微信小程序 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;
    }
  • 相关阅读:
    Singleton(单例模式)的一种实现 -- 基于【惰性】适用于【大对象】的一种生产实践
    001.Getting Started -- 【入门指南】
    SparkStreaming高级算子应用【combineByKey、transform,checkpoint】
    Solr基础理论【相关度计算】
    Solr基础理论【排名检索、查准率、查全率】
    Solr基础理论【倒排索引,模糊查询】
    Impala快速入门
    Redis特点分析及性能优化
    电力系统【第八章:电力系统不对称故障的分析与计算】
    SparkStreaming之checkpoint检查点
  • 原文地址:https://www.cnblogs.com/mr17/p/14512264.html
Copyright © 2011-2022 走看看