Events in Tiptap
The editor fires a few different events that you can hook into. Let’s have a look at all the available events first.
List of available events
Event Name | Description |
---|---|
beforeCreate | Triggered before the editor view is created. |
create | Occurs when the editor is fully initialized and ready. |
update | Fired when there is a change in the content. |
selectionUpdate | Happens when the selection changes within the editor. |
transaction | Invoked when the editor state changes due to any operation. |
focus | Triggered when the editor gains focus. |
blur | Fired when the editor loses focus. |
destroy | Occurs when the editor instance is being destroyed. |
onPaste | Fired when content is pasted into the editor. |
onDrop | Fired when content is dropped into the editor. |
contentError | The content does not match the schema. Read more here |
Register event listeners
There are three ways to register event listeners.
Option 1: Configuration
You can define your event listeners on a new editor instance right-away:
const editor = new Editor({
onBeforeCreate({ editor }) {
// Before the view is created.
},
onCreate({ editor }) {
// The editor is ready.
},
onUpdate({ editor }) {
// The content has changed.
},
onSelectionUpdate({ editor }) {
// The selection has changed.
},
onTransaction({ editor, transaction }) {
// The editor state has changed.
},
onFocus({ editor, event }) {
// The editor is focused.
},
onBlur({ editor, event }) {
// The editor isn’t focused anymore.
},
onDestroy() {
// The editor is being destroyed.
},
onPaste(event: ClipboardEvent, slice: Slice) {
// The editor is being pasted into.
},
onDrop(event: DragEvent, slice: Slice, moved: boolean) {
// The editor is being pasted into.
},
onContentError({ editor, error, disableCollaboration }) {
// The editor content does not match the schema.
},
})
Option 2: Binding
Or you can register your event listeners on a running editor instance:
Bind event listeners
editor.on('beforeCreate', ({ editor }) => {
// Before the view is created.
})
editor.on('create', ({ editor }) => {
// The editor is ready.
})
editor.on('update', ({ editor }) => {
// The content has changed.
})
editor.on('selectionUpdate', ({ editor }) => {
// The selection has changed.
})
editor.on('transaction', ({ editor, transaction }) => {
// The editor state has changed.
})
editor.on('focus', ({ editor, event }) => {
// The editor is focused.
})
editor.on('blur', ({ editor, event }) => {
// The editor isn’t focused anymore.
})
editor.on('destroy', () => {
// The editor is being destroyed.
})
editor.on('onPaste', (event: ClipboardEvent, slice: Slice) => {
// The editor is being pasted into.
})
editor.on('onDrop', (event: DragEvent, slice: Slice, moved: boolean) => {
// The editor is being destroyed.
})
editor.on('contentError', ({ editor, error, disableCollaboration }) => {
// The editor content does not match the schema.
})
Unbind event listeners
If you need to unbind those event listeners at some point, you should register your event listeners with .on()
and unbind them with .off()
then.
const onUpdate = () => {
// The content has changed.
}
// Bind …
editor.on('update', onUpdate)
// … and unbind.
editor.off('update', onUpdate)
Option 3: Extensions
Moving your event listeners to custom extensions (or nodes, or marks) is also possible. Here’s how that would look like:
import { Extension } from '@tiptap/core'
const CustomExtension = Extension.create({
onBeforeCreate({ editor }) {
// Before the view is created.
},
onCreate({ editor }) {
// The editor is ready.
},
onUpdate({ editor }) {
// The content has changed.
},
onSelectionUpdate({ editor }) {
// The selection has changed.
},
onTransaction({ editor, transaction }) {
// The editor state has changed.
},
onFocus({ editor, event }) {
// The editor is focused.
},
onBlur({ editor, event }) {
// The editor isn’t focused anymore.
},
onDestroy() {
// The editor is being destroyed.
},
onPaste(event: ClipboardEvent, slice: Slice) {
// The editor is being pasted into.
},
onDrop(event: DragEvent, slice: Slice, moved: boolean) {
// The editor is being pasted into.
},
onContentError({ editor, error, disableCollaboration }) {
// The editor content does not match the schema.
},
})