定制化

IEditor 不仅有着强大的可配置方案,更有着完整的定制化方案。我们只需要简单的配置即可二次开发一款不一样的富文本编辑器。

效果演示

只需配置 di 参数即可实现只读功能。默认为 空 。

示例代码

<div ref="water" :style="editStyle">
  <div class="water-menu">
    <button @click="boldFn" :class="{'on': activeDatas.bold}">加粗</button>
    <button @click="underlineFn" :class="{'on': activeDatas.underline}">下划线</button>
    <button @click="italicFn" :class="{'on': activeDatas.italic}">斜体</button>
    <button @click="copyFn">复制</button>
    <button @click="cutFn">剪切</button>
    <button @click="imageFn">图片</button>
    <button @click="redoFn">重做</button>
    <button @click="undoFn">撤销</button>
    <button @click="removeformatFn">清除样式</button>
    <button @click="fontfamilyFn">宋体</button>
    <button @click="lineheightFn">2倍行高</button>
    <button @click="fontsizeFn">20号字</button>
    <button @click="backcolorFn">蓝色背景</button>
    <button @click="forecolorFn">红色字号</button>
    <button @click="justifycenterFn" :class="{'on': activeDatas.justifycenter}">居中</button>
    <button @click="justifyleftFn" :class="{'on': activeDatas.justifyleft}">居左</button>
    <button @click="justifyrightFn" :class="{'on': activeDatas.justifyright}">居右</button>
    <button @click="justifyfullFn" :class="{'on': activeDatas.justifyfull}">全对齐</button>
    <button @click="fullScreenFn" :class="{'on': fullScreenStatus}">全屏</button>
    <button @click="codeFn" :class="{'on': sourceCode}">源代码</button>
    <button @click="formatblockFn" :class="{'on': activeDatas.formatblock}">引用</button>
    <button @click="indentFn" :class="{'on': activeDatas.indent}">缩进</button>
    <button @click="inserthorizontalruleFn" :class="{'on': activeDatas.inserthorizontalrule}">分割线</button>
    <button @click="insertunorderedlistFn" :class="{'on': activeDatas.insertunorderedlist}">无序列表</button>
    <button @click="insertorderedlistFn" :class="{'on': activeDatas.insertorderedlist}">有序列表</button>
    <button @click="videoFn">视频</button>
    <button @click="linkFn">连接</button>
  </div>
  <div ref="text" contenteditable="true" class="water-text"></div>
</div>
// 略去其他代码
export default {
  // 略去其他代码
  data() {
    return {
      activeDatas: {
        bold: false,
        underline: false,
        italic: false,
        justifycenter: false,
        justifyleft: false,
        justifyright: false,
        justifyfull: false,
        formatblock: false,
        indent: false,
        inserthorizontalrule: false,
        insertunorderedlist: false,
        insertorderedlist: false,
      },
      editStyle: '',
      fullScreenStatus: false,
      sourceCode: false,
    };
  },
  mounted() {
    this.edit = new IEditor({
      diy: {
        menu: true,
        text: this.$refs.text,
        active: result => {
          this.handleActive(result);
        },
      },
    });

    this.edit.init();
  },
  methods: {
    handleActive(result) {
      Object.keys(result).forEach(resultKey => {
        let oneActive = result[resultKey];
        Object.assign(this.activeDatas, {
          [resultKey]: oneActive
        });
      });
    },
    boldFn() {
      this.edit.menu.clicks.bold();
    },
    copyFn() {
      this.edit.menu.clicks.copy();
    },
    cutFn() {
      this.edit.menu.clicks.cut();
    },
    inserthorizontalruleFn() {
      this.edit.menu.clicks.inserthorizontalrule();
    },
    insertorderedlistFn() {
      this.edit.menu.clicks.insertorderedlist();
    },
    insertunorderedlistFn() {
      this.edit.menu.clicks.insertunorderedlist();
    },
    italicFn() {
      this.edit.menu.clicks.italic();
    },
    justifycenterFn() {
      this.edit.menu.clicks.justifycenter();
    },
    justifyfullFn() {
      this.edit.menu.clicks.justifyfull();
    },
    justifyleftFn() {
      this.edit.menu.clicks.justifyleft();
    },
    justifyrightFn() {
      this.edit.menu.clicks.justifyright();
    },
    removeformatFn() {
      this.edit.menu.clicks.removeformat();
    },
    redoFn() {
      this.edit.menu.clicks.redo();
    },
    underlineFn() {
      this.edit.menu.clicks.underline();
    },
    undoFn() {
      this.edit.menu.clicks.undo();
    },
    fontfamilyFn() {
      this.edit.menu.clicks.fontfamily('宋体');
    },
    fontsizeFn() {
      this.edit.menu.clicks.fontsize(20);
    },
    lineheightFn() {
      this.edit.menu.clicks.lineheight(2);
    },
    fullScreenFn() {
      if (!this.fullScreenStatus) {
        this.editStyle = {
          top: 0,
          left: 0,
          right: 0,
          bottom: 0,
          position: 'fixed',
          zIndex: 2222,
        };
      } else {
        this.editStyle = '';
      }
      this.fullScreenStatus = !this.fullScreenStatus;
    },
    imageFn(ev) {
      this.edit.menu.clicks.image(ev);
    },
    formatblockFn() {
      this.edit.menu.clicks.formatblock();
    },
    indentFn() {
      this.edit.menu.clicks.indent();
    },
    codeFn() {
      this.edit.menu.clicks.code();
      this.sourceCode = this.edit.code;
    },
    videoFn() {
      this.edit.menu.clicks.video('<iframe src="http://player.youku.com/embed/XMzg2MDcyNjY4MA==" frameborder=0 "allowfullscreen"></iframe>');
    },
    linkFn() {
      this.edit.menu.clicks.link('百度的超级链接', 'http://baidu.com');
    },
    backcolorFn() {
      this.edit.menu.clicks.backcolor('#1996f9');
    },
    forecolorFn() {
      this.edit.menu.clicks.forecolor('#fd883b');
    },
  },
  // 略去其他代码
};

.water {
  &-menu {
    margin: 0;
    padding: 0;
    background: #fff;

    & button {
      display: inline-block;
      border: 1px solid #dcdcdc;
      margin: 0 0 10px;
      padding: 4px 10px;

      &.on {
        background: #dcdcdc;
      }

      &:focus {
        outline: none;
      }
    }
  }

  &-text {
    border: 1px solid #dcdcdc;
    min-height: 270px;
    height: calc(100% - 32px);
    width: calc(100% - 32px);
    padding: 16px;
    overflow: auto;
    position: relative;
    background: #fff;
    color: #333;
    font-family: 'Microsoft YaHei', 'PingFangSC', 'Helvetica', sans-serif, 'Arial';

      &:focus {
        outline: none;
      }

      & strong,
      & b {
        font-weight: bold !important;
      }

      & i {
        font-style: italic !important;
      }

      & p {
        margin: 10px 0 !important;
        word-break: break-all !important;
        line-height: 1;
      }

      & blockquote {
        border-left: 5px solid #ccc !important;
        padding: 10px 20px !important;
        margin: 10px 0 !important;
        color: #999;
        font-size: 16px;

        & p {
          margin: 5px 0 !important;
        }
      }

      & .ied-code {
        resize: none;
        width: calc(100% - 32px);
        height: calc(100% - 32px);
        display: block;
        position: absolute;
        left: 16px;
        top: 16px;
        padding: 0;
        border: none;

        &:focus {
          outline: none;
        }
      }
  }
}