Skip to content

如何监听事件

mark-img 基于事件驱动,通过 .on() 方法监听各种事件来响应用户操作。完整事件列表见 事件 API

基本用法

ts
import ImageMark from 'mark-img'

const imgMark = new ImageMark({
	el: '#container',
	src: './example.jpg',
	pluginOptions: {
		shape: { shapeList: [] },
	},
})

支持链式调用:

ts
imgMark
	.on('shape_add', (data, shapeInstance) => { /* ... */ })
	.on('scale', (scale) => { /* ... */ })
	.on('readonly_change', (readonly) => { /* ... */ })

常用事件示例

图形生命周期

ts
// 图形被添加(鼠标绘制完成后触发)
imgMark.on('shape_add', (data, shapeInstance) => {
	console.log('新增图形', data.shapeName, data)
})

// 图形数据被更新
imgMark.on('shape_update_data', (newData, oldData) => {
	console.log('数据变化', oldData, '->', newData)
})

// 图形被删除
imgMark.on('shape_delete', (shapeInstance) => {
	console.log('删除图形', shapeInstance.data)
})

// 数据发生任何变化(增删改都会触发)
imgMark.on('shape_plugin_data_change', (data) => {
	console.log('当前所有数据', data)
})

绘制过程

ts
// 开始绘制
imgMark.on('shape_start_drawing', (shapeInstance) => {
	console.log('开始绘制', shapeInstance.data.shapeName)
})

// 结束绘制(cancel 为 true 表示取消)
imgMark.on('shape_end_drawing', (cancel, data) => {
	if (cancel) {
		console.log('取消绘制')
	} else {
		console.log('绘制完成', data)
	}
})

选中与交互

ts
// 选中列表变化
imgMark.on('selection_select_list_change', (list) => {
	console.log('选中了', list.length, '个图形')
})

// 图形被点击
imgMark.on('shape_click', (evt, shapeInstance) => {
	console.log('点击了图形', shapeInstance.data)
})

// 图形移动
imgMark.on('shape_start_move', (shapeInstance) => {
	console.log('开始移动')
})

imgMark.on('shape_end_move', (shapeInstance, [diffX, diffY]) => {
	console.log('移动结束,偏移', diffX, diffY)
})

右键菜单

ts
// 图形上右键
imgMark.on('shape_context_menu', (evt, shapeInstance) => {
	evt.preventDefault()
	// 显示自定义右键菜单
	showContextMenu(evt.clientX, evt.clientY, shapeInstance)
})

// 容器上右键
imgMark.on('container_context_menu', (evt) => {
	evt.preventDefault()
	showContainerMenu(evt.clientX, evt.clientY)
})

视图与状态

ts
// 缩放变化
imgMark.on('scale', (scale) => {
	console.log('缩放比例', (scale * 100).toFixed(0) + '%')
})

// 只读状态变化
imgMark.on('readonly_change', (readonly) => {
	console.log('只读模式', readonly)
})

// 历史记录变化
imgMark.on('history_change', (info) => {
	console.log('可撤销', info.undo, '可重做', info.redo)
})

// 首次渲染完成(适合做初始化操作)
imgMark.on('first_render', () => {
	console.log('渲染完成')
})

取消监听

ts
function onScale(scale) {
	console.log(scale)
}

imgMark.on('scale', onScale)

// 取消监听
imgMark.off('scale', onScale)