Skip to content

事件 ​

事件列表 ​

事件参数说明
update:modelValueString编辑器内容变化时触发
uploadPhotoFile[]用户选择图片时触发,参数为文件数组
uploadVideoFile[]用户选择视频时触发,参数为文件数组
pasteObject用户粘贴内容时触发,可拦截图片等文件粘贴
dropObject用户拖放文件到编辑器时触发
ready-编辑器初始化完成时触发
focus-编辑器获得焦点时触发
blur-编辑器失去焦点时触发
selectionChangeObject编辑器选区变化时触发,包含 from、to、text、empty
linkClickObject点击编辑器内链接时触发,可拦截默认跳转行为
beforeChangeObject内容即将变化时触发,可阻止本次内容变更

paste 事件 ​

paste 事件用于拦截编辑器粘贴行为,尤其适合处理剪贴板图片。

如果没有监听 paste,或监听后没有调用 pasteEvent.preventDefault(),编辑器会继续执行默认粘贴逻辑,剪贴板图片仍可能以 base64 形式进入内容。

vue
<script setup>
import { ref } from 'vue'
import { SkyTiptap } from '@Chelase/sky-tiptap'

const editorRef = ref()
const content = ref('')

const handlePaste = async (pasteEvent) => {
  if (!pasteEvent.files.length) return

  pasteEvent.preventDefault()

  const urls = await Promise.all(
    pasteEvent.files.map(async (file) => {
      const formData = new FormData()
      formData.append('file', file)
      const { data } = await uploadPhoto(formData)
      return data.url
    })
  )

  editorRef.value?.insertImages(urls)
}
</script>

<template>
  <sky-tiptap
    ref="editorRef"
    v-model="content"
    @paste="handlePaste"
  />
</template>

paste 事件对象 ​

字段说明
event原始 ClipboardEvent
type粘贴类型:text、html、image、mixed
files粘贴中的文件数组
text剪贴板纯文本内容
html剪贴板 HTML 内容
preventDefault()阻止编辑器默认粘贴行为
handled预留处理状态字段

drop 事件 ​

drop 事件用于处理拖放到编辑器中的文件。和 paste 一样,只有调用 dropEvent.preventDefault() 时才会阻止默认拖放行为。

drop 事件对象 ​

字段说明
event原始 DragEvent
files拖放的文件数组
type文件类型:image 或 file
preventDefault()阻止编辑器默认拖放行为

selectionChange 事件 ​

选区变化时触发:

vue
<sky-tiptap
  v-model="content"
  @selection-change="handleSelectionChange"
/>

selectionChange 事件对象 ​

字段说明
from选区开始位置
to选区结束位置
text当前选中的文本
empty是否为空选区

linkClick 事件 ​

linkClick 事件在用户点击编辑器内链接时触发。业务侧可以读取链接地址,做埋点、预览、权限判断或自定义跳转。

如果业务侧没有调用 linkClickEvent.preventDefault(),Ctrl 或 Meta + Click 仍会按默认行为在新标签页打开链接。

vue
<script setup>
const handleLinkClick = (linkClickEvent) => {
  if (!linkClickEvent.href) return

  linkClickEvent.preventDefault()

  // 例如:使用业务侧路由、打开链接预览弹窗或做跳转确认
  window.open(linkClickEvent.href, '_blank', 'noopener,noreferrer')
}
</script>

<template>
  <sky-tiptap
    v-model="content"
    @link-click="handleLinkClick"
  />
</template>

linkClick 事件对象 ​

字段说明
event原始 MouseEvent
target被点击的链接元素
href链接地址
pos点击位置
ctrlKey点击时是否按下 Ctrl
metaKey点击时是否按下 Meta / Command
preventDefault()阻止编辑器默认链接点击行为

beforeChange 事件 ​

beforeChange 事件在编辑器内容即将变化、但尚未应用到编辑器状态前触发。业务侧可以读取变化前后的 HTML,并在需要时调用 preventDefault() 阻止本次内容变更。

该事件只处理会改变文档内容的 transaction。纯光标移动、选区变化不会触发 beforeChange。

如果需要阻止变化,必须在事件处理函数中同步调用 beforeChangeEvent.preventDefault()。异步操作完成后再调用不会阻止已经应用的 transaction。

vue
<script setup>
const MAX_HTML_LENGTH = 10000

const handleBeforeChange = (beforeChangeEvent) => {
  if (beforeChangeEvent.nextHTML.length <= MAX_HTML_LENGTH) return

  beforeChangeEvent.preventDefault()
}
</script>

<template>
  <sky-tiptap
    v-model="content"
    @before-change="handleBeforeChange"
  />
</template>

beforeChange 事件对象 ​

字段说明
transaction原始 ProseMirror transaction
statetransaction 应用前的 ProseMirror editor state
editorTiptap editor 实例
currentHTML变化前 HTML
nextHTML变化后 HTML
preventDefault()阻止本次内容变更

Released under the MIT License.