diff --git a/src/editor/core/event/CanvasEvent.ts b/src/editor/core/event/CanvasEvent.ts index 8a23fcc..a8c6032 100644 --- a/src/editor/core/event/CanvasEvent.ts +++ b/src/editor/core/event/CanvasEvent.ts @@ -18,7 +18,7 @@ import { RangeManager } from '../range/RangeManager' import { LETTER_REG, NUMBER_LIKE_REG } from '../../dataset/constant/Regular' import { Control } from '../draw/control/Control' import { CheckboxControl } from '../draw/control/checkbox/CheckboxControl' -import { splitText } from '../../utils' +import { splitText, threeClick } from '../../utils' import { Previewer } from '../draw/particle/previewer/Previewer' import { DeepRequired } from '../../interface/Common' import { DateParticle } from '../draw/particle/date/DateParticle' @@ -72,6 +72,7 @@ export class CanvasEvent { this.pageContainer.addEventListener('mouseleave', this.mouseleave.bind(this)) this.pageContainer.addEventListener('mousemove', this.mousemove.bind(this)) this.pageContainer.addEventListener('dblclick', this.dblclick.bind(this)) + threeClick(this.pageContainer, this.threeClick.bind(this)) } public setIsAllowDrag(payload: boolean) { @@ -516,6 +517,46 @@ export class CanvasEvent { }) } + public threeClick() { + const cursorPosition = this.position.getCursorPosition() + if (!cursorPosition) return + const { index } = cursorPosition + const elementList = this.draw.getElementList() + // 判断是否是零宽字符 + let upCount = 0 + let downCount = 0 + // 向上查询 + let upStartIndex = index - 1 + while (upStartIndex > 0) { + const value = elementList[upStartIndex].value + if (value !== ZERO) { + upCount++ + upStartIndex-- + } else { + break + } + } + // 向下查询 + let downStartIndex = index + 1 + while (downStartIndex < elementList.length) { + const value = elementList[downStartIndex].value + if (value !== ZERO) { + downCount++ + downStartIndex++ + } else { + break + } + } + // 设置选中区域 + this.range.setRange(index - upCount - 1, index + downCount) + // 刷新文档 + this.draw.render({ + isSubmitHistory: false, + isSetCursor: false, + isComputeRowList: false + }) + } + public input(data: string) { const isReadonly = this.draw.isReadonly() if (isReadonly) return diff --git a/src/editor/utils/index.ts b/src/editor/utils/index.ts index 0db944d..a93677c 100644 --- a/src/editor/utils/index.ts +++ b/src/editor/utils/index.ts @@ -66,4 +66,25 @@ export function downloadFile(href: string, fileName: string) { a.href = href a.download = fileName a.click() +} + +export function threeClick(dom: HTMLElement, fn: (evt: MouseEvent) => any) { + nClickEvent(3, dom, fn) +} + +function nClickEvent(n: number, dom: HTMLElement, fn: (evt: MouseEvent) => any) { + let count = 0 + let lastTime = 0 + + const handler = function (evt: MouseEvent) { + const currentTime = new Date().getTime() + count = (currentTime - lastTime < 300) ? count + 1 : 0 + lastTime = new Date().getTime() + if (count >= n - 1) { + fn(evt) + count = 0 + } + } + + dom.addEventListener('click', handler) } \ No newline at end of file