UNPKG

@antv/x6

Version:

JavaScript diagramming library that uses SVG and HTML for rendering

333 lines (313 loc) 9 kB
/* eslint-disable no-param-reassign */ import * as Core from './core' import { ensureHandlerId, returnFalse, setHandlerId } from './util' import { EventObject, type EventObjectEvent } from './object' import { TypeEventHandler, TypeEventHandlers } from './types' export class Event { static on<TType extends string>( elem: Element, events: TType, selector: string, handler: TypeEventHandler<Element, undefined, any, any, TType> | false, ): Element static on<TType extends string, TData>( elem: Element, events: TType, selector: string | null | undefined, data: TData, handler: TypeEventHandler<Element, TData, Element, Element, TType> | false, ): Element static on<TType extends string, TData>( elem: Element, events: TType, data: TData, handler: TypeEventHandler<Element, TData, Element, Element, TType> | false, ): Element static on<TType extends string, TData>( elem: Element, events: TType, data: TData, handlerObject: { handler: TypeEventHandler<Element, TData, Element, Element, TType> selector?: string [key: string]: any }, ): Element static on<TType extends string>( elem: Element, events: TType, handler: | TypeEventHandler<Element, undefined, Element, Element, TType> | false, ): Element static on<TType extends string>( elem: Element, events: TType, handlerObject: { handler: TypeEventHandler<Element, undefined, Element, Element, TType> selector?: string [key: string]: any }, ): Element static on<TData>( elem: Element, events: TypeEventHandlers<Element, TData, any, any>, selector: string | null | undefined, data: TData, ): Element static on( elem: Element, events: TypeEventHandlers<Element, undefined, any, any>, selector: string, ): Element static on<TData>( elem: Element, events: TypeEventHandlers<Element, TData, Element, Element>, data: TData, ): Element static on( elem: Element, events: TypeEventHandlers<Element, undefined, Element, Element>, ): void static on( elem: Element, events: any, selector?: any, data?: any, handler?: any, ) { Private.on(elem, events, selector, data, handler) return elem } static once<TType extends string>( elem: Element, events: TType, selector: string, handler: TypeEventHandler<Element, undefined, any, any, TType> | false, ): Element static once<TType extends string, TData>( elem: Element, events: TType, selector: string | null | undefined, data: TData, handler: TypeEventHandler<Element, TData, Element, Element, TType> | false, ): Element static once<TType extends string, TData>( elem: Element, events: TType, data: TData, handler: TypeEventHandler<Element, TData, Element, Element, TType> | false, ): Element static once<TType extends string, TData>( elem: Element, events: TType, data: TData, handlerObject: { handler: TypeEventHandler<Element, TData, Element, Element, TType> selector?: string [key: string]: any }, ): Element static once<TType extends string>( elem: Element, events: TType, handler: | TypeEventHandler<Element, undefined, Element, Element, TType> | false, ): Element static once<TType extends string>( elem: Element, events: TType, handlerObject: { handler: TypeEventHandler<Element, undefined, Element, Element, TType> selector?: string [key: string]: any }, ): Element static once<TData>( elem: Element, events: TypeEventHandlers<Element, TData, any, any>, selector: string | null | undefined, data: TData, ): Element static once( elem: Element, events: TypeEventHandlers<Element, undefined, any, any>, selector: string, ): Element static once<TData>( elem: Element, events: TypeEventHandlers<Element, TData, Element, Element>, data: TData, ): Element static once( elem: Element, events: TypeEventHandlers<Element, undefined, Element, Element>, ): Element static once( elem: Element, events: any, selector?: any, data?: any, handler?: any, ) { Private.on(elem as any, events, selector, data, handler, true) return elem } static off<TType extends string>( elem: Element, events: TType, selector: string, handler: TypeEventHandler<Element, any, any, any, TType> | false, ): Element static off<TType extends string>( elem: Element, events: TType, handler: TypeEventHandler<Element, any, any, any, TType> | false, ): Element static off<TType extends string>( elem: Element, events: TType, selector_handler?: | string | TypeEventHandler<Element, any, any, any, TType> | false, ): Element static off( elem: Element, events: TypeEventHandlers<Element, any, any, any>, selector?: string, ): Element static off(elem: Element, event?: EventObject<Element>): Element static off<TType extends string>( elem: Element, events?: | TType | TypeEventHandlers<Element, any, any, any> | EventObject<Element>, selector?: string | TypeEventHandler<Element, any, any, any, TType> | false, handler?: TypeEventHandler<Element, any, any, any, TType> | false, ) { Private.off(elem, events, selector, handler) return elem } static trigger( elem: Element, event: | string | EventObject | (Partial<EventObjectEvent> & { type: string }), args?: any[] | Record<string, any> | string | number | boolean, /** * When onlyHandlers is `true` * - Will not call `.event()` on the element it is triggered on. This means * `.trigger('submit', [], true)` on a form will not call `.submit()` on * the form. * - Events will not bubble up the DOM hierarchy; if they are not handled * by the target element directly, they do nothing. */ onlyHandlers?: boolean, ) { Core.trigger(event, args, elem, onlyHandlers) return elem } } namespace Private { type EventHandler = false | ((...args: any[]) => any) export function on( elem: Element, types: any, selector?: string | EventHandler | null, data?: any | EventHandler | null, fn?: EventHandler | null, once?: boolean, ) { // Types can be a map of types/handlers if (typeof types === 'object') { // ( types-Object, selector, data ) if (typeof selector !== 'string') { // ( types-Object, data ) data = data || selector selector = undefined } Object.keys(types).forEach((type) => on(elem, type, selector, data, types[type], once), ) return } if (data == null && fn == null) { // ( types, fn ) fn = selector as EventHandler data = selector = undefined } else if (fn == null) { if (typeof selector === 'string') { // ( types, selector, fn ) fn = data data = undefined } else { // ( types, data, fn ) fn = data data = selector selector = undefined } } if (fn === false) { fn = returnFalse } else if (!fn) { return } if (once) { const originHandler = fn fn = function (event, ...args: any[]) { // Can use an empty set, since event contains the info Private.off(elem, event) return originHandler.call(this, event, ...args) } // Use same guid so caller can remove using origFn setHandlerId(fn, ensureHandlerId(originHandler)) } Core.on(elem, types as string, fn, data, selector as string) } export function off<TType extends string, TElement>( elem: TElement, events?: | TType | TypeEventHandlers<TElement, any, any, any> | EventObject<TElement>, selector?: | string | TypeEventHandler<TElement, any, any, any, TType> | false, fn?: TypeEventHandler<TElement, any, any, any, TType> | false, ) { const evt = events as EventObject if (evt && evt.preventDefault != null && evt.handleObj != null) { const obj = evt.handleObj off( evt.delegateTarget, obj.namespace ? `${obj.originType}.${obj.namespace}` : obj.originType, obj.selector, obj.handler, ) return } if (typeof events === 'object') { // ( types-object [, selector] ) const types = events as TypeEventHandlers<TElement, any, any, any> Object.keys(types).forEach((type) => off(elem, type, selector, types[type] as any), ) return } if (selector === false || typeof selector === 'function') { // ( types [, fn] ) fn = selector selector = undefined } if (fn === false) { fn = returnFalse } // @ts-ignore Core.off(elem as any, events as string, fn, selector) } }