tinymce系列(四) tinymce 常用内置 UI 组件介绍

本文介绍了tinymce编辑器中常用的内置UI组件,包括如何注册按钮、创建下拉菜单、自定义图标及使用内置弹窗。详细讲解了按钮配置、菜单结构和定制,适合初学者了解基础组件的使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

常用内置 UI 组件

这篇文章将会介绍常用的内置 UI 组件,对于下面的示例代码,很多都用到了一个 editor 的变量。 注意 editor 是当前的实例,而非全局变量,如需要使用全局变量改用 tinymce.activeEditor
editor 通常来自 PluginManager.add 注册插件后,回调参数中会携带 editor 实例

注册工具条上的按钮

editor.ui.registry.addButton('按钮名称', 按钮参数)

按钮名称同于 tinymce.init 中的 toolbar 注册的名称

editor.ui.registry.addButton('mybutton', {
  icon: 'formaticon', // tinymce 内置的icon名称(下面会介绍到)
  tooltip: '新增按钮示例', // 悬浮的时候的提示
  onAction: function(e) {
    alert('点击了这个按钮')
  }
})

注册下拉菜单按钮

除了普通按钮,用的比较多的就是下拉菜单的按钮 addmenubutton

以下示例代码来自:menubuttonexampleandexplanation

  • fetch 提供一个回调函数,用于生成按钮点击后显示的下拉菜单项
  • 每个菜单项又有各自的配置
    • text 显示的文案
    • icon
    • onAction 点击后触发的事件
    • onSetup 当前菜单 mounted 后触发
    • getSubmenuItems 当前项在添加子级菜单
    • type 菜单类型 更多类型可以看 typesoftoolbarbuttons
editor.ui.registry.addMenuButton('mybutton', {
  tooltip: 'My button',
  icon: 'my-icon',
  fetch: function(callback) {
    var items = [
      {
        type: 'menuitem',
        text: 'Menu item 1',
        onAction: function() {
          editor.insertContent('&nbsp;<em>You clicked menu item 1!</em>')
        }
      },
      {
        type: 'nestedmenuitem',
        text: 'Menu item 2',
        icon: 'user',
        getSubmenuItems: function() {
          return [
            {
              type: 'menuitem',
              text: 'Sub menu item 1',
              icon: 'unlock',
              onAction: function() {
                editor.insertContent('&nbsp;<em>You clicked Sub menu item 1!</em>')
              }
            },
            {
              type: 'menuitem',
              text: 'Sub menu item 2',
              icon: 'lock',
              onAction: function() {
                editor.insertContent('&nbsp;<em>You clicked Sub menu item 2!</em>')
              }
            }
          ]
        }
      },
      {
        type: 'togglemenuitem',
        text: 'Toggle menu item',
        onAction: function() {
          toggleState = !toggleState
          editor.insertContent('&nbsp;<em>You toggled a menuitem ' + (toggleState ? 'on' : 'off') + '</em>')
        },
        onSetup: function(api) {
          api.setActive(toggleState)
          return function() {}
        }
      }
    ]
    callback(items)
  }
})

除了上面用 callback 返回菜单配置外,菜单项也可以通过名称单独添加,然后 callback 只需要传入菜单名称即可

比如:

// 单独注册名为 menuname 的菜单项
editor.ui.registry.addToggleMenuItem('menuname', {
  text: 'menuname',
  onSetup: function(api) {
    // ...
  }
})

// 单独注册名为 menuname2 的菜单项
editor.ui.registry.addToggleMenuItem('menuname2', {
  text: 'menuname2',
  onSetup: function(api) {
    // ...
  }
})

// 在下拉菜单按钮中使用上面注册的2个菜单项
editor.ui.registry.addMenuButton('mybutton', {
  fetch: function(callback) {
    // 直接使用菜单名称注册
    callback('menuname menuname2')
  }
})

如果下拉菜单的样式并不满足业务需求,可以使用 onSetup 的方法,对当前的菜单进行 dom 节点的改造,达到想要的效果。

注册按钮图标 icon

在 tinymce4.x 版本中,icon 支持直接图片链接地址/svg,在 tinymce5.x 版本后不允许使用图片地址,必须使用 svg 。通过 api 可以注册新的 icon

  1. 获取所有的 icon editor.ui.registry.getAll()
let icons = editor.ui.registry.getAll().icons

let formaticon = icons.formaticon // 如果存在,拿到的就是 svg 代码
  1. 注册新 icon
  • 注册后的 icon 可以通过 getAll().icon 名称 获取到
  • 在部分组件比如上面的按钮的 icon 配置中,则可以直接使用 icon:‘icon 名称’ 进行引入这个图标
editor.ui.registry.addIcon('myicon', '<svg>省略。。。</svg>')

// 使用时:比如注册一个工具栏的按钮
editor.ui.registry.addButton('mybutton', {
  icon: 'myicon',
  tooltip: '新注册的按钮组件'
})

使用内置的弹窗组件

文档参考:windowmanager

调用 open 方法会会返回一个 dialog 对象,用于对弹窗做一些操作,比如关闭弹窗 dialog.close()

弹窗的底部按钮目前看到有 3 种类型

type类型触发事件
custom普通按钮onAction
cancel取消按钮onCancel
submit确认按钮onSubmit

如果按钮业务类型比较多,建议使用 custom 按钮,通过 name 参数作为区分,name 参数会在 onAction 的 params 参数中一同携带

primary 主要是按钮的类型,如果为 true,则为有底色按钮,默认是白色底按钮

var WindowManager = tinymce.activeEditor.windowManager

let dialog = WindowManager.open({
  title: '一个弹窗',
  body: {
    type: 'panel',
    items: [
      {
        type: 'htmlpanel',
        html: getFormHtml() // getFormHtml 就是返回一段html字符串
      }
    ]
  },
  buttons: [
    {
      type: 'custom',
      text: '取消',
      name: 'cancel'
    },
    {
      type: 'custom',
      text: '普通按钮1',
      primary: true,
      name: 'splash_1'
    },
    {
      type: 'custom',
      text: '普通按钮2',
      primary: true,
      name: 'splash_2'
    },
    {
      type: 'cancel',
      text: '取消按钮',
      primary: true
    },
    {
      type: 'submit',
      text: '确定',
      primary: true
    }
  ],
  onAction: function(e, params) {
    console.log(params.name)
    dialog.close()
  },
  onCancel: function() {
    dialog.close()
  },
  onSubmit: function() {
    dialog.close()
  }
})

最后

tinymce 要用到的内置组件展示没有那么多,本文做一个抛砖引玉,介绍了最基础的注册按钮、下拉菜单、注册 icon 和内置弹窗的使用。后面还会有几个实战的小 demo,都会重新用到这一块的内容~敬请期待

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值