jodit编辑器的基本使用

jodit编辑器在vue2中的使用

1.版本

"jodit": "^3.24.4",
"vue": "^2.6.14"

2.安装

npm i jodit@3.24.4

3.基本配置

详细请看代码,本文已经完成了最基本的配置,包括语言选择,自定义tabbar,自定义组件等,详细配置请查看官网(https://xdsoft.net/jodit/docs/modules/config.html)

自定义图标库以及颜色选择: IconRoom.vue

<template>
  <div>
    <el-popover
      placement="bottom"
      width="420"
      trigger="click"
      v-model="visible">
      <div class="iconroom-content">
        <el-tabs class="iconroom-tabs" tab-position="left">
          <el-tab-pane
            class="iconroom-tabs-tab"
            label="icon1"
            v-for="e in 100"
            :key="e">
            <ul>
              <li
                class="icon-item"
                :class="{ active: icon === i }"
                v-for="i in 100"
                :key="i"
                @click="icon = i">
                <i class="el-icon-edit" />
                <span class="text" title="编辑箭头啊这是">编辑箭头啊这是</span>
              </li>
            </ul>
          </el-tab-pane>
        </el-tabs>
        <div class="color-select">
          <span
            class="color-item"
            :class="{ active: color === item }"
            v-for="(item, i) in iconColor"
            :key="i"
            :style="{ background: item }"
            @click="color = item"></span>
          <el-button size="small" @click="cancelClick">取消</el-button>
          <el-button size="small" type="primary" @click="confirmClick"
            >导入</el-button
          >
        </div>
      </div>
    </el-popover>
  </div>
</template>
<script>
export default {
  name: 'IconRoom',
  props: {
    value: {
      type: Boolean,
      default: false,
    },
  },
  computed: {
    visible: {
      get() {
        return this.value
      },
      set(value) {
        this.$emit('update:value', value)
      },
    },
  },
  data() {
    return {
      iconColor: ['#333333', '#9e9e9e', '#ededed', '#50b4ff', '#ff0000'],
      icon: '', // 激活的图标
      color: '', // 激活的颜色
    }
  },
  methods: {
    cancelClick() {
      this.icon = ''
      this.color = ''
      this.$emit('update:value', false)
    },
    confirmClick() {
      const icon = {
        icon: this.icon,
        color: this.color,
      }
      this.$emit('select-icon', icon)
    },
  },
}
</script>
<style lang="scss" scoped>
.icon-item {
  width: 50px;
  height: 50px;
  margin: 5px;
  padding: 5px;
  border: 1px solid #eee;
  font-size: 12px;
  display: flex;
  flex-direction: column;
  justify-content: space-around;
  align-items: center;
  cursor: pointer;
  .text {
    width: 50px;
    overflow: hidden;
    white-space: nowrap;
    text-overflow: ellipsis;
  }
  &:hover {
    border: 1px solid orange;
  }
  &.active {
    border: 1px solid orange;
  }
}
.iconroom-tabs {
  height: 400px;
  .iconroom-tabs-tab {
    overflow: hidden;
    ul {
      margin: 0;
      padding: 0;
      height: 400px;
      list-style: none;
      display: flex;
      flex-wrap: wrap;
      overflow: hidden;
      overflow-y: auto;
    }
  }
}
.color-select {
  border-top: 2px solid #50b4ff;
  height: 50px;
  margin: 10px;
  display: flex;
  align-items: center;
  justify-content: space-around;
  .color-item {
    display: inline-block;
    width: 35px;
    height: 35px;
    margin: 5px;
    cursor: pointer;
    &:hover {
      border: 1px solid orange;
    }
    &.active {
      border: 1px solid orange;
    }
  }
}
</style>

效果图如下所示:
在这里插入图片描述

封装的编辑器组件,包括基本配置等自定义标题,tabbar: Editor.vue

<template>
  <div class="editor-content">
    <IconRoom
      :value.sync="iconVisible"
      class="icon-room"
      @select-icon="selectIcon" />
    <textarea id="textarea"> </textarea>
    <el-dialog
      title="提示"
      ref="dialog"
      :visible="vivible"
      @close="handleClose">
      <el-input v-model="text" />
      <template slot="footer">
        <el-button type="primary" @click="handleClick">提交</el-button>
      </template>
    </el-dialog>
  </div>
</template>
<script>
import 'jodit/build/jodit.min.css'
import { Jodit } from 'jodit'
import IconRoom from './IconRoom.vue'
export default {
  name: 'JoditEditor',
  props: {
    value: { type: String, default: '' },
    customConfig: { type: Object, default: () => ({}) },
  },
  components: { IconRoom },
  data() {
    return {
      editor: null,
      vivible: false,
      iconVisible: false,
      pencil: null,
      text: '',
      config: {
        placeholder: '请输入内容',
        readonly: false, // 只读
        language: 'zh_cn', // 配置语言
        width: '750px', // 设置宽度
        height: '100%', // 设置高度
        allowResizeX: false, // 是否允许水平提哦啊正大小
        allowResizeY: false, // 是否允许垂直调整大小
        toolbarButtonSize: 'middle', // 设置按钮大小
        theme: 'default', // 主题
        statusbar: false, // 是否显示底部状态栏
        askBeforePasteFromWprd: false, // 复制粘贴不弹窗提示
        askBeforePasteHTML: false,
        editHTMLDocumentMode: false,
        showBrowerColorPicker: false,
        textIcons: false,
        iframe: false,
        saveSelectionOnBlur: false,

        image: {
          useImageEditor: true,
        },
        filebrowser: {
          ajax: {
            url: '/api',
            // method: 'post'
          },
          fileRemove: {
            url: '/api',
            method: 'POST',
          },
        },
        uploader: {
          insertImageAsBase64URI: true, // 图片上传
          // TODO: 修改图片上传接口以及成功和失败的方法
        },
        // 引入外部CDN
        sourceEditorCDNUrlsJS: ['/plugins/ace.js'],
        beautifyHTMLCDNUrlsJS: [
          '/plugins/beautify.min.js',
          '/plugins/beautify-html.min.js',
        ],
        // editorCssClass: false,
        triggerChangeEvent: true,
        direction: '',
        i18n: {
          zh_cn: {
            top: '上',
            right: '右',
            bottom: '下',
            left: '左',
            Title: '标题',
            Link: '链接',
            'Line height': '行高',
            Alternative: '描述',
            'Alternative text': '描述',
            'Lower Alpha': '小写英文字母',
            'Lower Greek': '小写希腊字母',
            'Lower Roman': '小写罗马数字',
            'Upper Alpha': '大写英文字母',
            'Upper Roman': '大写罗马数字',
          },
        },
        // tabIndex: -1,
        toolbar: true,
        useSplitMode: false,
        enter: 'p', //  div p
        // enterBlock: 'p',
        colors: {
          list: ['#333333', '#9e9e9e', '#ededed', '#50b4ff'],
        },
        colorPickerDefaultTab: 'color',
        showBrowserColorPicker: false,
        imageDefaultWidth: 300,
        extraButtons: [
          'undo',
          'redo',
          'copyformat',
          'title',
          'font',
          'fontsize',
          'bold',
          'underline',
          'italic',
          'ul',
          'ol',
          'brush',
          'table',
          'align',
          'pencil',
          'image',
        ],
        buttonsMD: [],
        buttonsSM: [],
        buttonsXS: [],
        buttons: [],
      },
      defaultConfig: {
        controls: {
          pencil: {
            exec: editor => {
              this.iconVisible = !this.iconVisible
              editor.s.save()
            },
          },
          image: {
            icon: 'image',
            list: {
              uploader: '插入本地图片',
              brower: '插入素材库图片',
            },
            exec: (editor, _, { control }) => {
              let key = control.args && control.args[0]
              if (key === 'uploader') {
                const uploader = new Jodit.modules.Uploader(
                  editor,
                  editor.o.uploader
                )
                uploader.bind(document.getElementById('imageInput'))
              } else if (key === 'brower') {
                this.vivible = true
                editor.s.save()
              }
            },
            childTemplate: (editor, key, value) => {
              let isImage = true

              if (key === 'uploader') {
                return (
                  '<div id="imageInput" class="jodit-drag-and-drop__file-box">' +
                  value +
                  `<input type="file" accept="${
                    isImage ? 'image/*' : '*'
                  }" tabindex="-1" dir="auto" multiple=""/>` +
                  '</div>'
                )
              } else {
                return (
                  '<div id="imageInput" class="jodit-drag-and-drop__file-box">' +
                  value +
                  '</div>'
                )
              }
            },
          },
          title: {
            list: {
              h1: '一级标题',
              h2: '二级标题',
              h3: '三级标题',
            },
            childTemplate: (editor, key, value) => {
              return `<${key} style="margin: 0;padding: 0" class="${key}">${value}</${key}>`
            },
            exec: (editor, _, { control }) => {
              console.log(control)
              let value = control.args && control.args[0]
              console.log(editor.createInside)

              editor.s.applyStyle(undefined, {
                // element: value
                className: value,
                // attributes: value
              })
              editor.setEditorValue()
              return false
            },
          },
          font: {
            list: Jodit.atom({
              'Thin, sans-serif': 'Thin (35S)',
              'UltraLight, sans-serif': 'UltraLight (40S)',
              'ExtraLight, sans-serif': 'ExtraLight (45S)',
              'Light, sans-serif': 'Light (50S)',
              'Book, sans-serif': 'Book (55S)',
              'Regular, sans-serif': 'Regular (60S)',
              'Medium, sans-serif': 'Medium (65S)',
              'DemiBold, sans-serif': 'DemiBold (70S)',
              'Bold, sans-serif': 'Bold (75W)',
              'Black, sans-serif': 'Black (90W)',
            }),
            childTemplate: (editor, key, value) => {
              return `<span data-style="${key}" style="font-family: ${key}!important">${value}</span>`
            },
          },
          fontsize: {
            list: Jodit.atom({
              14: '五号',
              16: '小四',
              19: '四号',
              21: '小三',
              22: '三号',
              24: '小二',
              29: '二号',
              32: '小一',
              35: '一号',
              42: '小初',
              56: '初号',
              // '48': '48'
            }),
            childTemplate: (editor, key, value) => {
              return `${value}`
            },
          },
        },
      },
      events: {},
    }
  },
  computed: {
    editorConfig() {
      const config = {
        ...this.config,
        ...this.defaultConfig,
        ...this.customConfig,
      }
      return config
    },
  },
  watch: {
    value(newValue) {
      if (this.editor.value !== newValue) this.editor.value = newValue
    },
  },
  mounted() {
    this.editor = new Jodit(
      document.getElementById('textarea'),
      this.editorConfig
    )
    this.editor.value = this.value
    this.editor.events.on('change', newValue => this.$emit('input', newValue))
    this.pencil = document.querySelector('.jodit-toolbar-button_pencil')
  },
  beforeDestroy() {
    this.editor.destruct()
  },
  methods: {
    handleClose() {
      this.vivible = false
    },
    handleClick() {
      this.editor.s.insertHTML(this.text)
      this.vivible = false
    },
    // 插入图标
    selectIcon(data) {
      this.editor.s.insertHTML(data)
      this.iconVisible = false
    },
  },
}
</script>
<style lang="scss">
// @import '../../assets/index.css';
.editor-content {
  height: 100%;
  position: relative;
  .icon-room {
    position: absolute;
    top: 40px;
    right: 420px;
  }
}

.h1 {
  font-size: 56px;
  color: #333333;
  font-family: 'Regular', sans-serif;
}

.h2 {
  font-size: 32px;
  color: #333333;
  font-family: 'Thin', sans-serif;
}

.h3 {
  font-size: 32px;
  color: #50b4ff;
  font-family: 'Regular', sans-serif;
}
</style>

字体可以根据自己的需求,更换,整体编辑器的效果图如下所示:
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: OnlyOffice是一种强大的在线协作软件,专为企业和个人设计。它提供了一个一体化工作环境,包括文档编辑、协作、项目管理、邮件、日历等功能,使您能够跨平台、跨设备、跨时区的进行高效的工作和协作。 Java是一种流行的编程语言,也可以与OnlyOffice集成,使其更加灵活和强大。以下是一些Java OnlyOffice的例子: 1、OnlyOffice SDK for Java: 这是一个Java开发人员可以使用的OnlyOffice SDK,它使您能够轻松地将OnlyOffice文档编辑器集成到您的Java应用程序中。它提供了许多有用的工具和API,帮助您更好地管理和处理文档编辑器。 2、Jodit:一个基于JavaScript的富文本编辑器,它也支持OnlyOffice文档编辑器。您可以轻松使用Jodit编辑器将OnlyOffice集成到您的Java应用程序中,让您的用户能够更方便地编辑和共享文档。 3、文档管理系统:OneDrive中提供了一个OnlyOffice文档编辑器,您可以使用Java编写的文档管理系统将其集成到您的应用程序中。当用户上传或创建新文件时,只需将其保存在OneDrive中,用户便可以使用OnlyOffice文档编辑器在线编辑并保存。 Java OnlyOffice的使用可以帮助您在您的应用程序中实现更好的文档协作和管理,提高您和您的用户的工作效率。 ### 回答2: Java OnlyOffice 是一种基于 Java 语言的 OnlyOffice 集成库,可以帮助开发者在 Java 应用中轻松集成 OnlyOffice 功能。具体来说,Java OnlyOffice 提供了一系列 API 接口,包括文档编辑、文档阅读、文档注释等,使得开发者可以在 Java 项目中直接调用 OnlyOffice 功能,进一步丰富了应用的功能和用户体验。 Java OnlyOffice 的使用非常简单,只需要在项目中引入相应的依赖,调用相应的 API 接口即可。在具体实现上,Java OnlyOffice 可以与不同的 Java 框架集成,例如 Spring、Struts 等,灵活性很高。此外,Java OnlyOffice 还提供了详细的文档和示例代码,方便开发者学习和使用。 作为一种集成库,Java OnlyOffice 实现了使用 OnlyOffice 功能的细节,简化了开发者的开发工作,提高了应用的可靠性和稳定性。此外,OnlyOffice 支持多语言,因此开发者可以根据不同的语言环境自定义界面,提高应用的易用性。 总的来说,Java OnlyOffice 是一个极具价值的开发工具,可以帮助开发者在 Java 应用中实现 OnlyOffice 功能。如果您需要在 Java 项目中实现文档编辑、阅读或注释等功能,Java OnlyOffice 是您的最佳选择。 ### 回答3: Java OnlyOffice 是一种使用Java语言编写的开源的文档编辑器,它是OnlyOffice开源文档编辑器的一部分。通过它,用户可以轻松地在云端创建、编辑和处理各种文档格式,例如Microsoft Office文档、OpenDocument格式、PDF文档和HTML等。 Java OnlyOffice 提供了完整的文档编辑功能,包括字体、样式、段落、表格、图片、公式、图形等。它还可以实时协作文档,允许多个用户同时编辑同一个文档,以达到更好的团队协作效果。 Java OnlyOffice 同时支持在不同设备之间同步和共享文档。这种特性使用户可以在任何地方、任何时候、任何设备上访问和编辑他们的文档,提高了生产力和工作效率。 Java OnlyOffice 同时提供了强大的API,允许开发人员在自己的应用程序中集成文档编辑和管理功能。这意味着Java OnlyOffice可以在各种不同的应用程序中使用,包括商务管理应用程序、在线教育平台、协作工具等等。 总之,Java OnlyOffice是一个功能强大、易于使用、可在云端或本地部署、多平台支持和开放源代码的文档编辑器,它为用户和开发人员提供了一系列的好处和工具,可以帮助他们管理和编辑各种文档格式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值