@spcsn/taro-runtime 0.1.1 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +16 -39
- package/dist/_virtual/_@oxc-project_runtime@0.130.0/helpers/assertClassBrand.js +7 -0
- package/dist/_virtual/_@oxc-project_runtime@0.130.0/helpers/checkPrivateRedeclaration.js +6 -0
- package/dist/_virtual/_@oxc-project_runtime@0.130.0/helpers/classPrivateFieldGet2.js +7 -0
- package/dist/_virtual/_@oxc-project_runtime@0.130.0/helpers/classPrivateFieldInitSpec.js +7 -0
- package/dist/_virtual/_@oxc-project_runtime@0.130.0/helpers/classPrivateFieldSet2.js +7 -0
- package/dist/_virtual/_@oxc-project_runtime@0.130.0/helpers/classPrivateMethodInitSpec.js +7 -0
- package/dist/_virtual/_@oxc-project_runtime@0.130.0/helpers/defineProperty.js +12 -0
- package/dist/_virtual/_@oxc-project_runtime@0.130.0/helpers/objectSpread2.js +25 -0
- package/dist/_virtual/_@oxc-project_runtime@0.130.0/helpers/toPrimitive.js +14 -0
- package/dist/_virtual/_@oxc-project_runtime@0.130.0/helpers/toPropertyKey.js +9 -0
- package/dist/_virtual/_@oxc-project_runtime@0.130.0/helpers/typeof.js +11 -0
- package/dist/bom/{URL.js → URL2.js} +39 -30
- package/dist/bom/URL2.js.map +1 -0
- package/dist/bom/document.d.ts +0 -1
- package/dist/bom/document.js +1 -54
- package/dist/bom/document.js.map +1 -1
- package/dist/bom/get-computed-style.js +8 -0
- package/dist/bom/get-computed-style.js.map +1 -0
- package/dist/bom/history.d.ts +1 -5
- package/dist/bom/history.js +53 -40
- package/dist/bom/history.js.map +1 -1
- package/dist/bom/location.d.ts +1 -11
- package/dist/bom/location.js +103 -93
- package/dist/bom/location.js.map +1 -1
- package/dist/bom/navigator.js +1 -2
- package/dist/bom/navigator.js.map +1 -1
- package/dist/bom/raf.d.ts +2 -2
- package/dist/bom/raf.js +2 -2
- package/dist/bom/raf.js.map +1 -1
- package/dist/bom/url-search-params.d.ts +14 -0
- package/dist/bom/{URLSearchParams.js → url-search-params.js} +26 -25
- package/dist/bom/url-search-params.js.map +1 -0
- package/dist/bom/{URL.d.ts → url.d.ts} +2 -6
- package/dist/bom/url.js +196 -0
- package/dist/bom/url.js.map +1 -0
- package/dist/bom/window.d.ts +3 -3
- package/dist/bom/window.js +3 -3
- package/dist/bom/window.js.map +1 -1
- package/dist/current.d.ts +3 -0
- package/dist/current.js +10 -1
- package/dist/current.js.map +1 -1
- package/dist/dom/anchor-element.js +17 -9
- package/dist/dom/anchor-element.js.map +1 -1
- package/dist/dom/class-list.js +2 -1
- package/dist/dom/class-list.js.map +1 -1
- package/dist/dom/document.js.map +1 -1
- package/dist/dom/element.js +9 -8
- package/dist/dom/element.js.map +1 -1
- package/dist/dom/event-target.js +2 -4
- package/dist/dom/event-target.js.map +1 -1
- package/dist/dom/event.d.ts +1 -1
- package/dist/dom/event.js +19 -28
- package/dist/dom/event.js.map +1 -1
- package/dist/dom/form.js +3 -2
- package/dist/dom/form.js.map +1 -1
- package/dist/dom/node.d.ts +4 -3
- package/dist/dom/node.js +23 -13
- package/dist/dom/node.js.map +1 -1
- package/dist/dom/root.js +4 -6
- package/dist/dom/root.js.map +1 -1
- package/dist/dom/{style_properties.js → style-properties.js} +2 -2
- package/dist/dom/{style_properties.js.map → style-properties.js.map} +1 -1
- package/dist/dom/style.js +1 -1
- package/dist/dom/style.js.map +1 -1
- package/dist/dom/text.d.ts +1 -1
- package/dist/dom/text.js.map +1 -1
- package/dist/dom/transfer.js.map +1 -1
- package/dist/dom/tree.js +1 -1
- package/dist/dom/tree.js.map +1 -1
- package/dist/dom-external/mutation-observer/implements.js +1 -1
- package/dist/dom-external/mutation-observer/implements.js.map +1 -1
- package/dist/dsl/common.js +45 -63
- package/dist/dsl/common.js.map +1 -1
- package/dist/env.js +2 -2
- package/dist/env.js.map +1 -1
- package/dist/hydrate.js +11 -8
- package/dist/hydrate.js.map +1 -1
- package/dist/index.cjs.d.ts +4 -4
- package/dist/index.cjs.js +670 -911
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.d.ts +4 -4
- package/dist/index.js +6 -6
- package/dist/next-tick.js +1 -4
- package/dist/next-tick.js.map +1 -1
- package/dist/perf.d.ts +1 -1
- package/dist/perf.js +10 -6
- package/dist/perf.js.map +1 -1
- package/dist/polyfill/index.js +1 -6
- package/dist/polyfill/index.js.map +1 -1
- package/dist/runtime.esm.d.ts +4 -4
- package/dist/runtime.esm.js +669 -911
- package/dist/runtime.esm.js.map +1 -1
- package/dist/utils/cache.js.map +1 -1
- package/dist/utils/index.js +9 -6
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/router.js +2 -1
- package/dist/utils/router.js.map +1 -1
- package/package.json +26 -20
- package/LICENSE +0 -174
- package/dist/bom/URL.js.map +0 -1
- package/dist/bom/URLSearchParams.d.ts +0 -1
- package/dist/bom/URLSearchParams.js.map +0 -1
- package/dist/bom/getComputedStyle.js +0 -9
- package/dist/bom/getComputedStyle.js.map +0 -1
- package/dist/polyfill/intersection-observer.js +0 -494
- package/dist/polyfill/intersection-observer.js.map +0 -1
- /package/dist/bom/{getComputedStyle.d.ts → get-computed-style.d.ts} +0 -0
- /package/dist/dom/{node_types.d.ts → node-types.d.ts} +0 -0
- /package/dist/dom/{style_properties.d.ts → style-properties.d.ts} +0 -0
package/dist/dom/element.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"element.js","names":["getComponentsAlias"],"sources":["../../src/dom/element.ts"],"sourcesContent":["import {\n EMPTY_OBJ,\n hooks,\n isArray,\n isFunction,\n isObject,\n isString,\n isUndefined,\n Shortcuts,\n toCamelCase,\n warn,\n} from '@spcsn/taro-shared';\n\nimport {\n CATCH_VIEW,\n CATCHMOVE,\n CLASS,\n CLICK_VIEW,\n EVENT_CALLBACK_RESULT,\n FOCUS,\n ID,\n PROPERTY_THRESHOLD,\n PURE_VIEW,\n STATIC_VIEW,\n STYLE,\n VIEW,\n} from '../constants';\nimport { MutationObserver, MutationRecordType } from '../dom-external/mutation-observer';\nimport { extend, getComponentsAlias, isElement, isHasExtractProp, shortcutAttr } from '../utils';\nimport { ClassList } from './class-list';\nimport { eventSource } from './event-source';\nimport { TaroNode } from './node';\nimport { NodeType } from './node_types';\nimport { Style } from './style';\nimport { treeToArray } from './tree';\n\nimport type { Attributes, TFunc } from '../interface';\nimport type { TaroEvent } from './event';\n\nexport class TaroElement extends TaroNode {\n public ctx?;\n public tagName: string;\n public props: Record<string, any> = {};\n public style: Style;\n public dataset: Record<string, unknown> = EMPTY_OBJ;\n public innerHTML: string;\n\n public constructor() {\n super();\n this.nodeType = NodeType.ELEMENT_NODE;\n this.style = new Style(this);\n hooks.call('patchElement', this);\n }\n\n private _stopPropagation(event: TaroEvent) {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n let target = this;\n // eslint-disable-next-line no-cond-assign\n while ((target = target.parentNode as this)) {\n const listeners = target.__handlers[event.type];\n\n if (!isArray(listeners)) {\n continue;\n }\n\n for (let i = listeners.length; i--; ) {\n const l = listeners[i];\n l._stop = true;\n }\n }\n }\n\n public get id(): string {\n return this.getAttribute(ID)!;\n }\n\n public set id(val: string) {\n this.setAttribute(ID, val);\n }\n\n public get className(): string {\n return this.getAttribute(CLASS) || '';\n }\n\n public set className(val: string) {\n this.setAttribute(CLASS, val);\n }\n\n public get cssText(): string {\n return this.getAttribute(STYLE) || '';\n }\n\n public get classList(): ClassList {\n return new ClassList(this.className, this);\n }\n\n public get children(): TaroElement[] {\n return this.childNodes.filter(isElement);\n }\n\n public get attributes(): Attributes[] {\n const props = this.props;\n const propKeys = Object.keys(props);\n const style = this.style.cssText;\n const attrs = propKeys.map((key) => ({ name: key, value: props[key] }));\n return attrs.concat(style ? { name: STYLE, value: style } : []);\n }\n\n public get textContent(): string {\n let text = '';\n const childNodes = this.childNodes;\n\n for (let i = 0; i < childNodes.length; i++) {\n text += childNodes[i].textContent;\n }\n\n return text;\n }\n\n public set textContent(text: string) {\n super.textContent = text;\n }\n\n public hasAttribute(qualifiedName: string): boolean {\n return !isUndefined(this.props[qualifiedName]);\n }\n\n public hasAttributes(): boolean {\n return this.attributes.length > 0;\n }\n\n public get focus() {\n return function () {\n this.setAttribute(FOCUS, true);\n };\n }\n\n // 兼容 Vue3,详情请见:https://github.com/NervJS/taro/issues/10579\n public set focus(value) {\n this.setAttribute(FOCUS, value);\n }\n\n public blur() {\n this.setAttribute(FOCUS, false);\n }\n\n public setAttribute(qualifiedName: string, value: any): void {\n process.env.NODE_ENV !== 'production' &&\n warn(\n isString(value) && value.length > PROPERTY_THRESHOLD,\n `元素 ${this.nodeName} 的 ${qualifiedName} 属性值数据量过大,可能会影响渲染性能。考虑降低图片转为 base64 的阈值或在 CSS 中使用 base64。`,\n );\n\n const isPureView = this.nodeName === VIEW && !isHasExtractProp(this) && !this.isAnyEventBinded();\n\n if (qualifiedName !== STYLE) {\n MutationObserver.record({\n target: this,\n type: MutationRecordType.ATTRIBUTES,\n attributeName: qualifiedName,\n oldValue: this.getAttribute(qualifiedName),\n });\n }\n\n switch (qualifiedName) {\n case STYLE:\n this.style.cssText = value as string;\n break;\n case ID:\n if (this.uid !== this.sid) {\n // eventSource[sid] 永远保留,直到组件卸载\n // eventSource[uid] 可变\n eventSource.delete(this.uid);\n }\n value = String(value);\n this.props[qualifiedName] = this.uid = value;\n eventSource.set(value, this);\n break;\n default:\n this.props[qualifiedName] = value as string;\n\n if (qualifiedName.startsWith('data-')) {\n if (this.dataset === EMPTY_OBJ) {\n this.dataset = Object.create(null);\n }\n this.dataset[toCamelCase(qualifiedName.replace(/^data-/, ''))] = value;\n }\n break;\n }\n\n // Serialization\n if (!this._root) return;\n\n const componentsAlias = getComponentsAlias();\n const _alias = componentsAlias[this.nodeName];\n const viewAlias = componentsAlias[VIEW]._num;\n const clickViewAlias = componentsAlias[CLICK_VIEW]._num;\n const staticViewAlias = componentsAlias[STATIC_VIEW]._num;\n const catchViewAlias = componentsAlias[CATCH_VIEW]._num;\n const _path = this._path;\n\n qualifiedName = shortcutAttr(qualifiedName);\n\n const qualifiedNameInCamelCase = toCamelCase(qualifiedName);\n const payload = {\n path: `${_path}.${qualifiedNameInCamelCase}`,\n value: isFunction(value) ? () => value : value,\n };\n\n hooks.call('modifySetAttrPayload', this, qualifiedName, payload, componentsAlias);\n\n if (_alias) {\n const qualifiedNameAlias = _alias[qualifiedNameInCamelCase] || qualifiedName;\n payload.path = `${_path}.${toCamelCase(qualifiedNameAlias)}`;\n }\n\n this.enqueueUpdate(payload);\n\n if (this.nodeName === VIEW) {\n if (qualifiedNameInCamelCase === CATCHMOVE) {\n // catchMove = true: catch-view\n // catchMove = false: view or click-view or static-view\n this.enqueueUpdate({\n path: `${_path}.${Shortcuts.NodeName}`,\n value: value\n ? catchViewAlias\n : this.isOnlyClickBinded() && !isHasExtractProp(this)\n ? clickViewAlias\n : this.isAnyEventBinded()\n ? viewAlias\n : staticViewAlias,\n });\n } else if (isPureView && isHasExtractProp(this)) {\n // pure-view => static-view\n this.enqueueUpdate({\n path: `${_path}.${Shortcuts.NodeName}`,\n value: staticViewAlias,\n });\n }\n }\n }\n\n public removeAttribute(qualifiedName: string) {\n const isStaticView = this.nodeName === VIEW && isHasExtractProp(this) && !this.isAnyEventBinded();\n\n MutationObserver.record({\n target: this,\n type: MutationRecordType.ATTRIBUTES,\n attributeName: qualifiedName,\n oldValue: this.getAttribute(qualifiedName),\n });\n\n if (qualifiedName === STYLE) {\n this.style.cssText = '';\n } else {\n const isInterrupt = hooks.call('onRemoveAttribute', this, qualifiedName);\n if (isInterrupt) {\n return;\n }\n\n if (!this.props.hasOwnProperty(qualifiedName)) {\n return;\n }\n delete this.props[qualifiedName];\n }\n\n // Serialization\n if (!this._root) return;\n\n const componentsAlias = getComponentsAlias();\n const _alias = componentsAlias[this.nodeName];\n const viewAlias = componentsAlias[VIEW]._num;\n const staticViewAlias = componentsAlias[STATIC_VIEW]._num;\n const pureViewAlias = componentsAlias[PURE_VIEW]._num;\n const clickViewAlias = componentsAlias[CLICK_VIEW]._num;\n const _path = this._path;\n\n qualifiedName = shortcutAttr(qualifiedName);\n\n const qualifiedNameInCamelCase = toCamelCase(qualifiedName);\n const payload = {\n path: `${_path}.${qualifiedNameInCamelCase}`,\n value: '',\n };\n\n hooks.call('modifyRmAttrPayload', this, qualifiedName, payload, componentsAlias);\n\n if (_alias) {\n const qualifiedNameAlias = _alias[qualifiedNameInCamelCase] || qualifiedName;\n payload.path = `${_path}.${toCamelCase(qualifiedNameAlias)}`;\n }\n\n this.enqueueUpdate(payload);\n\n if (this.nodeName === VIEW) {\n if (qualifiedNameInCamelCase === CATCHMOVE) {\n // catch-view => view or click-view or static-view or pure-view\n this.enqueueUpdate({\n path: `${_path}.${Shortcuts.NodeName}`,\n value:\n this.isOnlyClickBinded() && !isHasExtractProp(this)\n ? clickViewAlias\n : this.isAnyEventBinded()\n ? viewAlias\n : isHasExtractProp(this)\n ? staticViewAlias\n : pureViewAlias,\n });\n } else if (isStaticView && !isHasExtractProp(this)) {\n // static-view => pure-view\n this.enqueueUpdate({\n path: `${_path}.${Shortcuts.NodeName}`,\n value: pureViewAlias,\n });\n }\n }\n }\n\n public getAttribute(qualifiedName: string): string {\n const attr = qualifiedName === STYLE ? this.style.cssText : this.props[qualifiedName];\n return attr ?? '';\n }\n\n public getElementsByTagName(tagName: string): TaroElement[] {\n return treeToArray(this, (el) => {\n return el.nodeName === tagName || (tagName === '*' && this !== el);\n });\n }\n\n public getElementsByClassName(className: string): TaroElement[] {\n const classNames = className.trim().split(/\\s+/);\n\n return treeToArray(this, (el) => {\n const classList = el.classList;\n return classNames.every((c) => classList.contains(c));\n });\n }\n\n public dispatchEvent(event: TaroEvent): boolean {\n const cancelable = event.cancelable;\n\n const listeners = this.__handlers[event.type];\n\n if (!isArray(listeners)) {\n return false;\n }\n\n for (let i = listeners.length; i--; ) {\n const listener = listeners[i];\n let result: unknown;\n if (listener._stop) {\n listener._stop = false;\n } else {\n hooks.call('modifyDispatchEvent', event, this);\n result = listener.call(this, event);\n }\n if ((result === false || event._end) && cancelable) {\n event.defaultPrevented = true;\n }\n\n if (!isUndefined(result) && event.mpEvent) {\n const res = hooks.call('modifyTaroEventReturn', this, event, result);\n if (res) {\n event.mpEvent[EVENT_CALLBACK_RESULT] = result;\n }\n }\n\n if (event._end && event._stop) {\n break;\n }\n }\n\n if (event._stop) {\n this._stopPropagation(event);\n }\n\n return listeners != null;\n }\n\n public addEventListener(type, handler, options) {\n const name = this.nodeName;\n const SPECIAL_NODES = hooks.call('getSpecialNodes')!;\n\n let sideEffect = true;\n if (isObject<Record<string, any>>(options) && options.sideEffect === false) {\n sideEffect = false;\n delete options.sideEffect;\n }\n\n hooks.call('modifyAddEventListener', this, sideEffect, getComponentsAlias);\n\n if (sideEffect !== false && !this.isAnyEventBinded() && SPECIAL_NODES.indexOf(name) > -1) {\n const componentsAlias = getComponentsAlias();\n const alias = componentsAlias[name]._num;\n this.enqueueUpdate({\n path: `${this._path}.${Shortcuts.NodeName}`,\n value: alias,\n });\n }\n\n super.addEventListener(type, handler, options);\n }\n\n public removeEventListener(type, handler, sideEffect = true) {\n super.removeEventListener(type, handler);\n\n const name = this.nodeName;\n const SPECIAL_NODES = hooks.call('getSpecialNodes')!;\n\n hooks.call('modifyRemoveEventListener', this, sideEffect, getComponentsAlias);\n\n if (sideEffect !== false && !this.isAnyEventBinded() && SPECIAL_NODES.indexOf(name) > -1) {\n const componentsAlias = getComponentsAlias();\n const value = isHasExtractProp(this) ? `static-${name}` : `pure-${name}`;\n const valueAlias = componentsAlias[value]._num;\n this.enqueueUpdate({\n path: `${this._path}.${Shortcuts.NodeName}`,\n value: valueAlias,\n });\n }\n }\n\n static extend(methodName: string, options: TFunc | Record<string, any>) {\n extend(TaroElement, methodName, options);\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"element.js","names":["getComponentsAlias"],"sources":["../../src/dom/element.ts"],"sourcesContent":["import {\n EMPTY_OBJ,\n hooks,\n isArray,\n isFunction,\n isObject,\n isString,\n isUndefined,\n Shortcuts,\n toCamelCase,\n warn,\n} from '@spcsn/taro-shared';\n\nimport {\n CATCH_VIEW,\n CATCHMOVE,\n CLASS,\n CLICK_VIEW,\n EVENT_CALLBACK_RESULT,\n FOCUS,\n ID,\n PROPERTY_THRESHOLD,\n PURE_VIEW,\n STATIC_VIEW,\n STYLE,\n VIEW,\n} from '../constants';\nimport { MutationObserver, MutationRecordType } from '../dom-external/mutation-observer';\nimport { extend, getComponentsAlias, isElement, isHasExtractProp, shortcutAttr } from '../utils';\nimport { ClassList } from './class-list';\nimport { eventSource } from './event-source';\nimport { TaroNode } from './node';\nimport { NodeType } from './node-types';\nimport { Style } from './style';\nimport { treeToArray } from './tree';\n\nimport type { Attributes, TFunc } from '../interface';\nimport type { TaroEvent } from './event';\n\nexport class TaroElement extends TaroNode {\n public ctx?;\n public tagName: string;\n public props: Record<string, any> = {};\n public style: Style;\n public dataset: Record<string, unknown> = EMPTY_OBJ;\n public innerHTML: string;\n\n public constructor() {\n super();\n this.nodeType = NodeType.ELEMENT_NODE;\n this.style = new Style(this);\n hooks.call('patchElement', this);\n }\n\n private _stopPropagation(event: TaroEvent) {\n let parentNode = this.parentNode as TaroElement | null;\n\n while (parentNode) {\n const listeners = parentNode.__handlers[event.type];\n\n if (isArray(listeners)) {\n for (let i = listeners.length; i--; ) {\n const listener = listeners[i];\n listener._stop = true;\n }\n }\n\n parentNode = parentNode.parentNode as TaroElement | null;\n }\n }\n\n public get id(): string {\n return this.getAttribute(ID)!;\n }\n\n public set id(val: string) {\n this.setAttribute(ID, val);\n }\n\n public get className(): string {\n return this.getAttribute(CLASS) || '';\n }\n\n public set className(val: string) {\n this.setAttribute(CLASS, val);\n }\n\n public get cssText(): string {\n return this.getAttribute(STYLE) || '';\n }\n\n public get classList(): ClassList {\n return new ClassList(this.className, this);\n }\n\n public get children(): TaroElement[] {\n return this.childNodes.filter(isElement);\n }\n\n public get attributes(): Attributes[] {\n const props = this.props;\n const propKeys = Object.keys(props);\n const style = this.style.cssText;\n const attrs = propKeys.map((key) => ({ name: key, value: props[key] }));\n return attrs.concat(style ? { name: STYLE, value: style } : []);\n }\n\n public get textContent(): string {\n let text = '';\n const childNodes = this.childNodes;\n\n for (let i = 0; i < childNodes.length; i++) {\n text += childNodes[i].textContent;\n }\n\n return text;\n }\n\n public set textContent(text: string) {\n super.textContent = text;\n }\n\n public hasAttribute(qualifiedName: string): boolean {\n return !isUndefined(this.props[qualifiedName]);\n }\n\n public hasAttributes(): boolean {\n return this.attributes.length > 0;\n }\n\n public get focus() {\n return function () {\n this.setAttribute(FOCUS, true);\n };\n }\n\n // 兼容 Vue3,详情请见:https://github.com/NervJS/taro/issues/10579\n public set focus(value) {\n this.setAttribute(FOCUS, value);\n }\n\n public blur() {\n this.setAttribute(FOCUS, false);\n }\n\n public setAttribute(qualifiedName: string, value: any): void {\n process.env.NODE_ENV !== 'production' &&\n warn(\n isString(value) && value.length > PROPERTY_THRESHOLD,\n `元素 ${this.nodeName} 的 ${qualifiedName} 属性值数据量过大,可能会影响渲染性能。考虑降低图片转为 base64 的阈值或在 CSS 中使用 base64。`,\n );\n\n const isPureView = this.nodeName === VIEW && !isHasExtractProp(this) && !this.isAnyEventBinded();\n\n if (qualifiedName !== STYLE) {\n MutationObserver.record({\n target: this,\n type: MutationRecordType.ATTRIBUTES,\n attributeName: qualifiedName,\n oldValue: this.getAttribute(qualifiedName),\n });\n }\n\n switch (qualifiedName) {\n case STYLE:\n this.style.cssText = value as string;\n break;\n case ID:\n if (this.uid !== this.sid) {\n // eventSource[sid] 永远保留,直到组件卸载\n // eventSource[uid] 可变\n eventSource.delete(this.uid);\n }\n value = String(value);\n this.props[qualifiedName] = this.uid = value;\n eventSource.set(value, this);\n break;\n default:\n this.props[qualifiedName] = value as string;\n\n if (qualifiedName.startsWith('data-')) {\n if (this.dataset === EMPTY_OBJ) {\n this.dataset = Object.create(null);\n }\n this.dataset[toCamelCase(qualifiedName.replace(/^data-/, ''))] = value;\n }\n break;\n }\n\n // Serialization\n if (!this._root) return;\n\n const componentsAlias = getComponentsAlias();\n const _alias = componentsAlias[this.nodeName];\n const viewAlias = componentsAlias[VIEW]._num;\n const clickViewAlias = componentsAlias[CLICK_VIEW]._num;\n const staticViewAlias = componentsAlias[STATIC_VIEW]._num;\n const catchViewAlias = componentsAlias[CATCH_VIEW]._num;\n const _path = this._path;\n\n qualifiedName = shortcutAttr(qualifiedName);\n\n const qualifiedNameInCamelCase = toCamelCase(qualifiedName);\n const payload = {\n path: `${_path}.${qualifiedNameInCamelCase}`,\n value: isFunction(value) ? () => value : value,\n };\n\n hooks.call('modifySetAttrPayload', this, qualifiedName, payload, componentsAlias);\n\n if (_alias) {\n const qualifiedNameAlias = _alias[qualifiedNameInCamelCase] || qualifiedName;\n payload.path = `${_path}.${toCamelCase(qualifiedNameAlias)}`;\n }\n\n this.enqueueUpdate(payload);\n\n if (this.nodeName === VIEW) {\n if (qualifiedNameInCamelCase === CATCHMOVE) {\n // catchMove = true: catch-view\n // catchMove = false: view or click-view or static-view\n this.enqueueUpdate({\n path: `${_path}.${Shortcuts.NodeName}`,\n value: value\n ? catchViewAlias\n : this.isOnlyClickBinded() && !isHasExtractProp(this)\n ? clickViewAlias\n : this.isAnyEventBinded()\n ? viewAlias\n : staticViewAlias,\n });\n } else if (isPureView && isHasExtractProp(this)) {\n // pure-view => static-view\n this.enqueueUpdate({\n path: `${_path}.${Shortcuts.NodeName}`,\n value: staticViewAlias,\n });\n }\n }\n }\n\n public removeAttribute(qualifiedName: string) {\n const isStaticView = this.nodeName === VIEW && isHasExtractProp(this) && !this.isAnyEventBinded();\n\n MutationObserver.record({\n target: this,\n type: MutationRecordType.ATTRIBUTES,\n attributeName: qualifiedName,\n oldValue: this.getAttribute(qualifiedName),\n });\n\n if (qualifiedName === STYLE) {\n this.style.cssText = '';\n } else {\n const isInterrupt = hooks.call('onRemoveAttribute', this, qualifiedName);\n if (isInterrupt) {\n return;\n }\n\n if (!this.props.hasOwnProperty(qualifiedName)) {\n return;\n }\n delete this.props[qualifiedName];\n }\n\n // Serialization\n if (!this._root) return;\n\n const componentsAlias = getComponentsAlias();\n const _alias = componentsAlias[this.nodeName];\n const viewAlias = componentsAlias[VIEW]._num;\n const staticViewAlias = componentsAlias[STATIC_VIEW]._num;\n const pureViewAlias = componentsAlias[PURE_VIEW]._num;\n const clickViewAlias = componentsAlias[CLICK_VIEW]._num;\n const _path = this._path;\n\n qualifiedName = shortcutAttr(qualifiedName);\n\n const qualifiedNameInCamelCase = toCamelCase(qualifiedName);\n const payload = {\n path: `${_path}.${qualifiedNameInCamelCase}`,\n value: '',\n };\n\n hooks.call('modifyRmAttrPayload', this, qualifiedName, payload, componentsAlias);\n\n if (_alias) {\n const qualifiedNameAlias = _alias[qualifiedNameInCamelCase] || qualifiedName;\n payload.path = `${_path}.${toCamelCase(qualifiedNameAlias)}`;\n }\n\n this.enqueueUpdate(payload);\n\n if (this.nodeName === VIEW) {\n if (qualifiedNameInCamelCase === CATCHMOVE) {\n // catch-view => view or click-view or static-view or pure-view\n this.enqueueUpdate({\n path: `${_path}.${Shortcuts.NodeName}`,\n value:\n this.isOnlyClickBinded() && !isHasExtractProp(this)\n ? clickViewAlias\n : this.isAnyEventBinded()\n ? viewAlias\n : isHasExtractProp(this)\n ? staticViewAlias\n : pureViewAlias,\n });\n } else if (isStaticView && !isHasExtractProp(this)) {\n // static-view => pure-view\n this.enqueueUpdate({\n path: `${_path}.${Shortcuts.NodeName}`,\n value: pureViewAlias,\n });\n }\n }\n }\n\n public getAttribute(qualifiedName: string): string {\n const attr = qualifiedName === STYLE ? this.style.cssText : this.props[qualifiedName];\n return attr ?? '';\n }\n\n public getElementsByTagName(tagName: string): TaroElement[] {\n return treeToArray(this, (el) => {\n return el.nodeName === tagName || (tagName === '*' && this !== el);\n });\n }\n\n public getElementsByClassName(className: string): TaroElement[] {\n const classNames = className.trim().split(/\\s+/);\n\n return treeToArray(this, (el) => {\n const classList = el.classList;\n return classNames.every((c) => classList.contains(c));\n });\n }\n\n public dispatchEvent(event: TaroEvent): boolean {\n const cancelable = event.cancelable;\n\n const listeners = this.__handlers[event.type];\n\n if (!isArray(listeners)) {\n return false;\n }\n\n for (let i = listeners.length; i--; ) {\n const listener = listeners[i];\n let result: unknown;\n if (listener._stop) {\n listener._stop = false;\n } else {\n hooks.call('modifyDispatchEvent', event, this);\n result = listener.call(this, event);\n }\n if ((result === false || event._end) && cancelable) {\n event.defaultPrevented = true;\n }\n\n if (!isUndefined(result) && event.mpEvent) {\n const res = hooks.call('modifyTaroEventReturn', this, event, result);\n if (res) {\n event.mpEvent[EVENT_CALLBACK_RESULT] = result;\n }\n }\n\n if (event._end && event._stop) {\n break;\n }\n }\n\n if (event._stop) {\n this._stopPropagation(event);\n }\n\n return listeners != null;\n }\n\n public addEventListener(type, handler, options) {\n const name = this.nodeName;\n const SPECIAL_NODES = hooks.call('getSpecialNodes')!;\n\n let sideEffect = true;\n if (isObject<Record<string, any>>(options) && options.sideEffect === false) {\n sideEffect = false;\n delete options.sideEffect;\n }\n\n hooks.call('modifyAddEventListener', this, sideEffect, getComponentsAlias);\n\n if (sideEffect !== false && !this.isAnyEventBinded() && SPECIAL_NODES.indexOf(name) > -1) {\n const componentsAlias = getComponentsAlias();\n const alias = componentsAlias[name]._num;\n this.enqueueUpdate({\n path: `${this._path}.${Shortcuts.NodeName}`,\n value: alias,\n });\n }\n\n super.addEventListener(type, handler, options);\n }\n\n public removeEventListener(type, handler, sideEffect = true) {\n super.removeEventListener(type, handler);\n\n const name = this.nodeName;\n const SPECIAL_NODES = hooks.call('getSpecialNodes')!;\n\n hooks.call('modifyRemoveEventListener', this, sideEffect, getComponentsAlias);\n\n if (sideEffect !== false && !this.isAnyEventBinded() && SPECIAL_NODES.indexOf(name) > -1) {\n const componentsAlias = getComponentsAlias();\n const value = isHasExtractProp(this) ? `static-${name}` : `pure-${name}`;\n const valueAlias = componentsAlias[value]._num;\n this.enqueueUpdate({\n path: `${this._path}.${Shortcuts.NodeName}`,\n value: valueAlias,\n });\n }\n }\n\n static extend(methodName: string, options: TFunc | Record<string, any>) {\n extend(TaroElement, methodName, options);\n }\n}\n"],"mappings":"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"}
|
package/dist/dom/event-target.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { _objectSpread2 } from "../_virtual/_@oxc-project_runtime@0.130.0/helpers/objectSpread2.js";
|
|
1
2
|
import { hooks, isArray, isObject, warn } from "@spcsn/taro-shared";
|
|
2
3
|
//#region src/dom/event-target.ts
|
|
3
4
|
var TaroEventTarget = class {
|
|
@@ -23,10 +24,7 @@ var TaroEventTarget = class {
|
|
|
23
24
|
handler.apply(this, arguments);
|
|
24
25
|
this.removeEventListener(type, wrapper);
|
|
25
26
|
};
|
|
26
|
-
this.addEventListener(type, wrapper, {
|
|
27
|
-
...options,
|
|
28
|
-
once: false
|
|
29
|
-
});
|
|
27
|
+
this.addEventListener(type, wrapper, _objectSpread2(_objectSpread2({}, options), {}, { once: false }));
|
|
30
28
|
return;
|
|
31
29
|
}
|
|
32
30
|
warn(isCapture, "Taro 暂未实现 event 的 capture 特性。");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-target.js","names":[],"sources":["../../src/dom/event-target.ts"],"sourcesContent":["import { hooks, isArray, isObject, warn } from '@spcsn/taro-shared';\n\nimport type { AddEventListenerOptions, EventHandler } from '../interface';\n\nexport class TaroEventTarget {\n public __handlers: Record<string, EventHandler[]> = {};\n\n public addEventListener(type: string, handler: EventHandler, options?: boolean | AddEventListenerOptions) {\n type = type.toLowerCase();\n\n hooks.call('onAddEvent', type, handler, options, this);\n\n if (type === 'regionchange') {\n // map 组件的 regionchange 事件非常特殊,详情:https://github.com/NervJS/taro/issues/5766\n this.addEventListener('begin', handler, options);\n this.addEventListener('end', handler, options);\n return;\n }\n\n let isCapture = Boolean(options);\n let isOnce = false;\n if (isObject<AddEventListenerOptions>(options)) {\n isCapture = Boolean(options.capture);\n isOnce = Boolean(options.once);\n }\n\n if (isOnce) {\n const wrapper = function () {\n handler.apply(this, arguments); // this 指向 Element\n this.removeEventListener(type, wrapper);\n };\n this.addEventListener(type, wrapper, {\n ...(options as AddEventListenerOptions),\n once: false,\n });\n return;\n }\n\n process.env.NODE_ENV !== 'production' && warn(isCapture, 'Taro 暂未实现 event 的 capture 特性。');\n\n // 某些框架,如 PReact 有委托的机制,handler 始终是同一个函数\n // 这会导致多层停止冒泡失败:view -> view(handler.stop = false) -> view(handler.stop = true)\n // 这样解决:view -> view(handlerA.stop = false) -> view(handlerB.stop = false)\n // 因此每次绑定事件都新建一个函数,如果带来了性能问题,可以把这段逻辑抽取到 PReact 插件中。\n const oldHandler = handler;\n handler = function () {\n return oldHandler.apply(this, arguments); // this 指向 Element\n };\n (handler as any).oldHandler = oldHandler;\n\n const handlers = this.__handlers[type];\n if (isArray(handlers)) {\n handlers.push(handler);\n } else {\n this.__handlers[type] = [handler];\n }\n }\n\n public removeEventListener(type: string, handler: EventHandler) {\n type = type.toLowerCase();\n\n if (type === 'regionchange') {\n // map 组件的 regionchange 事件非常特殊,详情:https://github.com/NervJS/taro/issues/5766\n this.removeEventListener('begin', handler);\n this.removeEventListener('end', handler);\n return;\n }\n\n if (!handler) {\n return;\n }\n\n const handlers = this.__handlers[type];\n if (!isArray(handlers)) {\n return;\n }\n\n const index = handlers.findIndex((item) => {\n if (item === handler || (item as any).oldHandler === handler) return true;\n });\n\n process.env.NODE_ENV !== 'production' && warn(index === -1, `事件: '${type}' 没有注册在 DOM 中,因此不会被移除。`);\n\n handlers.splice(index, 1);\n }\n\n public isAnyEventBinded(): boolean {\n const handlers = this.__handlers;\n const isAnyEventBinded = Object.keys(handlers).find((key) => handlers[key].length);\n return Boolean(isAnyEventBinded);\n }\n\n public isOnlyClickBinded(): boolean {\n const handlers = this.__handlers;\n const isOnlyClickBinded = handlers.tap && Object.keys(handlers).length === 1;\n return Boolean(isOnlyClickBinded);\n }\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"event-target.js","names":[],"sources":["../../src/dom/event-target.ts"],"sourcesContent":["import { hooks, isArray, isObject, warn } from '@spcsn/taro-shared';\n\nimport type { AddEventListenerOptions, EventHandler } from '../interface';\n\nexport class TaroEventTarget {\n public __handlers: Record<string, EventHandler[]> = {};\n\n public addEventListener(type: string, handler: EventHandler, options?: boolean | AddEventListenerOptions) {\n type = type.toLowerCase();\n\n hooks.call('onAddEvent', type, handler, options, this);\n\n if (type === 'regionchange') {\n // map 组件的 regionchange 事件非常特殊,详情:https://github.com/NervJS/taro/issues/5766\n this.addEventListener('begin', handler, options);\n this.addEventListener('end', handler, options);\n return;\n }\n\n let isCapture = Boolean(options);\n let isOnce = false;\n if (isObject<AddEventListenerOptions>(options)) {\n isCapture = Boolean(options.capture);\n isOnce = Boolean(options.once);\n }\n\n if (isOnce) {\n const wrapper = function () {\n handler.apply(this, arguments); // this 指向 Element\n this.removeEventListener(type, wrapper);\n };\n this.addEventListener(type, wrapper, {\n ...(options as AddEventListenerOptions),\n once: false,\n });\n return;\n }\n\n process.env.NODE_ENV !== 'production' && warn(isCapture, 'Taro 暂未实现 event 的 capture 特性。');\n\n // 某些框架,如 PReact 有委托的机制,handler 始终是同一个函数\n // 这会导致多层停止冒泡失败:view -> view(handler.stop = false) -> view(handler.stop = true)\n // 这样解决:view -> view(handlerA.stop = false) -> view(handlerB.stop = false)\n // 因此每次绑定事件都新建一个函数,如果带来了性能问题,可以把这段逻辑抽取到 PReact 插件中。\n const oldHandler = handler;\n handler = function () {\n return oldHandler.apply(this, arguments); // this 指向 Element\n };\n (handler as any).oldHandler = oldHandler;\n\n const handlers = this.__handlers[type];\n if (isArray(handlers)) {\n handlers.push(handler);\n } else {\n this.__handlers[type] = [handler];\n }\n }\n\n public removeEventListener(type: string, handler: EventHandler) {\n type = type.toLowerCase();\n\n if (type === 'regionchange') {\n // map 组件的 regionchange 事件非常特殊,详情:https://github.com/NervJS/taro/issues/5766\n this.removeEventListener('begin', handler);\n this.removeEventListener('end', handler);\n return;\n }\n\n if (!handler) {\n return;\n }\n\n const handlers = this.__handlers[type];\n if (!isArray(handlers)) {\n return;\n }\n\n const index = handlers.findIndex((item) => {\n if (item === handler || (item as any).oldHandler === handler) return true;\n });\n\n process.env.NODE_ENV !== 'production' && warn(index === -1, `事件: '${type}' 没有注册在 DOM 中,因此不会被移除。`);\n\n handlers.splice(index, 1);\n }\n\n public isAnyEventBinded(): boolean {\n const handlers = this.__handlers;\n const isAnyEventBinded = Object.keys(handlers).find((key) => handlers[key].length);\n return Boolean(isAnyEventBinded);\n }\n\n public isOnlyClickBinded(): boolean {\n const handlers = this.__handlers;\n const isOnlyClickBinded = handlers.tap && Object.keys(handlers).length === 1;\n return Boolean(isOnlyClickBinded);\n }\n}\n"],"mappings":";;;AAIA,IAAa,kBAAb,MAA6B;;EAC3B,KAAO,aAA6C,CAAC;;CAErD,iBAAwB,MAAc,SAAuB,SAA6C;EACxG,OAAO,KAAK,YAAY;EAExB,MAAM,KAAK,cAAc,MAAM,SAAS,SAAS,IAAI;EAErD,IAAI,SAAS,gBAAgB;GAE3B,KAAK,iBAAiB,SAAS,SAAS,OAAO;GAC/C,KAAK,iBAAiB,OAAO,SAAS,OAAO;GAC7C;EACF;EAEA,IAAI,YAAY,QAAQ,OAAO;EAC/B,IAAI,SAAS;EACb,IAAI,SAAkC,OAAO,GAAG;GAC9C,YAAY,QAAQ,QAAQ,OAAO;GACnC,SAAS,QAAQ,QAAQ,IAAI;EAC/B;EAEA,IAAI,QAAQ;GACV,MAAM,UAAU,WAAY;IAC1B,QAAQ,MAAM,MAAM,SAAS;IAC7B,KAAK,oBAAoB,MAAM,OAAO;GACxC;GACA,KAAK,iBAAiB,MAAM,SAAA,eAAA,eAAA,CAAA,GACtB,OAAA,GAAA,CAAA,GAAA,EACJ,MAAM,MAAA,CACR,CAAC;GACD;EACF;EAEA,KAA8C,WAAW,+BAA+B;EAMxF,MAAM,aAAa;EACnB,UAAU,WAAY;GACpB,OAAO,WAAW,MAAM,MAAM,SAAS;EACzC;EACA,QAAiB,aAAa;EAE9B,MAAM,WAAW,KAAK,WAAW;EACjC,IAAI,QAAQ,QAAQ,GAClB,SAAS,KAAK,OAAO;OAErB,KAAK,WAAW,QAAQ,CAAC,OAAO;CAEpC;CAEA,oBAA2B,MAAc,SAAuB;EAC9D,OAAO,KAAK,YAAY;EAExB,IAAI,SAAS,gBAAgB;GAE3B,KAAK,oBAAoB,SAAS,OAAO;GACzC,KAAK,oBAAoB,OAAO,OAAO;GACvC;EACF;EAEA,IAAI,CAAC,SACH;EAGF,MAAM,WAAW,KAAK,WAAW;EACjC,IAAI,CAAC,QAAQ,QAAQ,GACnB;EAGF,MAAM,QAAQ,SAAS,WAAW,SAAS;GACzC,IAAI,SAAS,WAAY,KAAa,eAAe,SAAS,OAAO;EACvE,CAAC;EAED,KAA8C,UAAU,IAAI,QAAQ,KAAK,uBAAuB;EAEhG,SAAS,OAAO,OAAO,CAAC;CAC1B;CAEA,mBAAmC;EACjC,MAAM,WAAW,KAAK;EACtB,MAAM,mBAAmB,OAAO,KAAK,QAAQ,EAAE,MAAM,QAAQ,SAAS,KAAK,MAAM;EACjF,OAAO,QAAQ,gBAAgB;CACjC;CAEA,oBAAoC;EAClC,MAAM,WAAW,KAAK;EACtB,MAAM,oBAAoB,SAAS,OAAO,OAAO,KAAK,QAAQ,EAAE,WAAW;EAC3E,OAAO,QAAQ,iBAAiB;CAClC;AACF"}
|
package/dist/dom/event.d.ts
CHANGED
|
@@ -10,6 +10,7 @@ export declare class TaroEvent {
|
|
|
10
10
|
_end: boolean;
|
|
11
11
|
defaultPrevented: boolean;
|
|
12
12
|
button: number;
|
|
13
|
+
keyCode?: number;
|
|
13
14
|
timeStamp: number;
|
|
14
15
|
mpEvent: MpEvent | undefined;
|
|
15
16
|
constructor(type: string, opts: EventOptions, event?: MpEvent);
|
|
@@ -21,4 +22,3 @@ export declare class TaroEvent {
|
|
|
21
22
|
}
|
|
22
23
|
export declare function createEvent(event: MpEvent | string, node?: TaroElement): TaroEvent;
|
|
23
24
|
export declare function eventHandler(event: MpEvent): any;
|
|
24
|
-
export declare function eventHandlerTTDom(ele: any, listener: (event: MpEvent, element: any) => void, event: MpEvent): void;
|
package/dist/dom/event.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { EVENT_CALLBACK_RESULT
|
|
1
|
+
import { EVENT_CALLBACK_RESULT } from "../constants/index.js";
|
|
2
|
+
import { _objectSpread2 } from "../_virtual/_@oxc-project_runtime@0.130.0/helpers/objectSpread2.js";
|
|
2
3
|
import env from "../env.js";
|
|
3
4
|
import { isParentBound } from "../utils/index.js";
|
|
4
5
|
import { EMPTY_OBJ, hooks, isUndefined } from "@spcsn/taro-shared";
|
|
@@ -27,14 +28,12 @@ var TaroEvent = class {
|
|
|
27
28
|
get target() {
|
|
28
29
|
const cacheTarget = this.cacheTarget;
|
|
29
30
|
if (!cacheTarget) {
|
|
30
|
-
|
|
31
|
-
const
|
|
32
|
-
const
|
|
33
|
-
target.
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
};
|
|
37
|
-
for (const key in this.mpEvent?.detail) target[key] = this.mpEvent.detail[key];
|
|
31
|
+
var _this$mpEvent, _target$dataset, _target$targetDataset, _target$dataset2, _this$mpEvent2;
|
|
32
|
+
const target = Object.create(((_this$mpEvent = this.mpEvent) === null || _this$mpEvent === void 0 ? void 0 : _this$mpEvent.target) || null);
|
|
33
|
+
const currentEle = env.document.getElementById(((_target$dataset = target.dataset) === null || _target$dataset === void 0 ? void 0 : _target$dataset.sid) || target.id || null);
|
|
34
|
+
const element = env.document.getElementById(((_target$targetDataset = target.targetDataset) === null || _target$targetDataset === void 0 ? void 0 : _target$targetDataset.sid) || ((_target$dataset2 = target.dataset) === null || _target$dataset2 === void 0 ? void 0 : _target$dataset2.sid) || target.id || null);
|
|
35
|
+
target.dataset = _objectSpread2(_objectSpread2({}, currentEle !== null ? currentEle.dataset : EMPTY_OBJ), element !== null ? element.dataset : EMPTY_OBJ);
|
|
36
|
+
for (const key in (_this$mpEvent2 = this.mpEvent) === null || _this$mpEvent2 === void 0 ? void 0 : _this$mpEvent2.detail) target[key] = this.mpEvent.detail[key];
|
|
38
37
|
this.cacheTarget = target;
|
|
39
38
|
return target;
|
|
40
39
|
} else return cacheTarget;
|
|
@@ -42,16 +41,17 @@ var TaroEvent = class {
|
|
|
42
41
|
get currentTarget() {
|
|
43
42
|
const cacheCurrentTarget = this.cacheCurrentTarget;
|
|
44
43
|
if (!cacheCurrentTarget) {
|
|
44
|
+
var _this$mpEvent3, _currentTarget$datase, _this$mpEvent4, _this$mpEvent5, _this$mpEvent6;
|
|
45
45
|
const doc = env.document;
|
|
46
|
-
const currentTarget = Object.create(this.mpEvent
|
|
47
|
-
const element = doc.getElementById(currentTarget.dataset
|
|
48
|
-
const targetElement = doc.getElementById(this.mpEvent
|
|
46
|
+
const currentTarget = Object.create(((_this$mpEvent3 = this.mpEvent) === null || _this$mpEvent3 === void 0 ? void 0 : _this$mpEvent3.currentTarget) || null);
|
|
47
|
+
const element = doc.getElementById(((_currentTarget$datase = currentTarget.dataset) === null || _currentTarget$datase === void 0 ? void 0 : _currentTarget$datase.sid) || currentTarget.id || null);
|
|
48
|
+
const targetElement = doc.getElementById(((_this$mpEvent4 = this.mpEvent) === null || _this$mpEvent4 === void 0 || (_this$mpEvent4 = _this$mpEvent4.target) === null || _this$mpEvent4 === void 0 || (_this$mpEvent4 = _this$mpEvent4.dataset) === null || _this$mpEvent4 === void 0 ? void 0 : _this$mpEvent4.sid) || ((_this$mpEvent5 = this.mpEvent) === null || _this$mpEvent5 === void 0 || (_this$mpEvent5 = _this$mpEvent5.target) === null || _this$mpEvent5 === void 0 ? void 0 : _this$mpEvent5.id) || null);
|
|
49
49
|
if (element === null || element && element === targetElement) {
|
|
50
50
|
this.cacheCurrentTarget = this.target;
|
|
51
51
|
return this.target;
|
|
52
52
|
}
|
|
53
53
|
currentTarget.dataset = element.dataset;
|
|
54
|
-
for (const key in this.mpEvent
|
|
54
|
+
for (const key in (_this$mpEvent6 = this.mpEvent) === null || _this$mpEvent6 === void 0 ? void 0 : _this$mpEvent6.detail) currentTarget[key] = this.mpEvent.detail[key];
|
|
55
55
|
this.cacheCurrentTarget = currentTarget;
|
|
56
56
|
return currentTarget;
|
|
57
57
|
} else return cacheCurrentTarget;
|
|
@@ -68,7 +68,7 @@ function createEvent(event, node) {
|
|
|
68
68
|
}, event);
|
|
69
69
|
for (const key in event) if (key === "currentTarget" || key === "target" || key === "type" || key === "timeStamp") continue;
|
|
70
70
|
else domEv[key] = event[key];
|
|
71
|
-
if (domEv.type === "confirm" && node
|
|
71
|
+
if (domEv.type === "confirm" && (node === null || node === void 0 ? void 0 : node.nodeName) === "input") domEv.keyCode = 13;
|
|
72
72
|
return domEv;
|
|
73
73
|
}
|
|
74
74
|
const eventsBatch = {};
|
|
@@ -78,12 +78,11 @@ function getEventCBResult(event) {
|
|
|
78
78
|
return result;
|
|
79
79
|
}
|
|
80
80
|
function eventHandler(event) {
|
|
81
|
-
|
|
82
|
-
event.
|
|
83
|
-
event.currentTarget = event.currentTarget || event.target || { ...event };
|
|
81
|
+
var _currentTarget$datase2, _event$detail;
|
|
82
|
+
event.currentTarget = event.currentTarget || event.target || _objectSpread2({}, event);
|
|
84
83
|
hooks.call("modifyMpEventImpl", event);
|
|
85
84
|
const currentTarget = event.currentTarget;
|
|
86
|
-
const id = currentTarget.dataset
|
|
85
|
+
const id = ((_currentTarget$datase2 = currentTarget.dataset) === null || _currentTarget$datase2 === void 0 ? void 0 : _currentTarget$datase2.sid) || currentTarget.id || ((_event$detail = event.detail) === null || _event$detail === void 0 ? void 0 : _event$detail.id) || "";
|
|
87
86
|
const node = env.document.getElementById(id);
|
|
88
87
|
if (node) {
|
|
89
88
|
const dispatch = () => {
|
|
@@ -103,22 +102,14 @@ function eventHandler(event) {
|
|
|
103
102
|
dispatch();
|
|
104
103
|
});
|
|
105
104
|
return getEventCBResult(event);
|
|
106
|
-
} else (eventsBatch[type]
|
|
105
|
+
} else (eventsBatch[type] || (eventsBatch[type] = [])).push(dispatch);
|
|
107
106
|
} else {
|
|
108
107
|
dispatch();
|
|
109
108
|
return getEventCBResult(event);
|
|
110
109
|
}
|
|
111
110
|
}
|
|
112
111
|
}
|
|
113
|
-
function eventHandlerTTDom(ele, listener, event) {
|
|
114
|
-
Object.assign(event, {
|
|
115
|
-
mpEvent: event,
|
|
116
|
-
bubbles: true,
|
|
117
|
-
cancelable: true
|
|
118
|
-
});
|
|
119
|
-
listener(event, ele);
|
|
120
|
-
}
|
|
121
112
|
//#endregion
|
|
122
|
-
export { TaroEvent, createEvent, eventHandler
|
|
113
|
+
export { TaroEvent, createEvent, eventHandler };
|
|
123
114
|
|
|
124
115
|
//# sourceMappingURL=event.js.map
|
package/dist/dom/event.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event.js","names":[],"sources":["../../src/dom/event.ts"],"sourcesContent":["import { EMPTY_OBJ, hooks, isUndefined } from '@spcsn/taro-shared';\n\nimport {\n CONFIRM,\n CURRENT_TARGET,\n EVENT_CALLBACK_RESULT,\n INPUT,\n
|
|
1
|
+
{"version":3,"file":"event.js","names":[],"sources":["../../src/dom/event.ts"],"sourcesContent":["import { EMPTY_OBJ, hooks, isUndefined } from '@spcsn/taro-shared';\n\nimport {\n CONFIRM,\n CURRENT_TARGET,\n EVENT_CALLBACK_RESULT,\n INPUT,\n TARGET,\n TIME_STAMP,\n TOUCHMOVE,\n TYPE,\n} from '../constants';\nimport env from '../env';\nimport { isParentBound } from '../utils';\n\nimport type { EventOptions, MpEvent } from '../interface';\nimport type { TaroElement } from './element';\n\n// Taro 事件对象。以 Web 标准的事件对象为基础,加入小程序事件对象中携带的部分信息,并模拟实现事件冒泡。\nexport class TaroEvent {\n private cacheTarget;\n private cacheCurrentTarget;\n\n public type: string;\n\n public bubbles: boolean;\n\n public cancelable: boolean;\n\n public _stop = false;\n\n public _end = false;\n\n public defaultPrevented = false;\n\n // Mouse Event botton property, it's used in 3rd lib, like react-router. default 0 in general\n public button = 0;\n\n public keyCode?: number;\n\n // timestamp can either be hi-res ( relative to page load) or low-res (relative to UNIX epoch)\n // here use hi-res timestamp\n public timeStamp = Date.now();\n\n public mpEvent: MpEvent | undefined;\n\n public constructor(type: string, opts: EventOptions, event?: MpEvent) {\n this.type = type.toLowerCase();\n this.mpEvent = event;\n this.bubbles = Boolean(opts && opts.bubbles);\n this.cancelable = Boolean(opts && opts.cancelable);\n }\n\n public stopPropagation() {\n this._stop = true;\n }\n\n public stopImmediatePropagation() {\n this._end = this._stop = true;\n }\n\n public preventDefault() {\n this.defaultPrevented = true;\n }\n\n get target() {\n const cacheTarget = this.cacheTarget;\n if (!cacheTarget) {\n const target = Object.create(this.mpEvent?.target || null);\n const currentEle = env.document.getElementById(target.dataset?.sid || target.id || null);\n // Note:优先判断冒泡场景alipay的targetDataset的sid, 不然冒泡场景target属性吐出不对,其余拿取当前绑定id\n const element = env.document.getElementById(\n target.targetDataset?.sid || target.dataset?.sid || target.id || null,\n );\n\n target.dataset = {\n ...(currentEle !== null ? currentEle.dataset : EMPTY_OBJ),\n ...(element !== null ? element.dataset : EMPTY_OBJ),\n };\n\n for (const key in this.mpEvent?.detail) {\n target[key] = this.mpEvent!.detail[key];\n }\n\n this.cacheTarget = target;\n\n return target;\n } else {\n return cacheTarget;\n }\n }\n\n get currentTarget() {\n const cacheCurrentTarget = this.cacheCurrentTarget;\n if (!cacheCurrentTarget) {\n const doc = env.document;\n\n const currentTarget = Object.create(this.mpEvent?.currentTarget || null);\n\n const element = doc.getElementById(currentTarget.dataset?.sid || currentTarget.id || null);\n const targetElement = doc.getElementById(\n (this.mpEvent?.target?.dataset?.sid as string) || (this.mpEvent?.target?.id as string) || null,\n );\n\n if (element === null || (element && element === targetElement)) {\n this.cacheCurrentTarget = this.target;\n return this.target;\n }\n\n currentTarget.dataset = element.dataset;\n\n for (const key in this.mpEvent?.detail) {\n currentTarget[key] = this.mpEvent!.detail[key];\n }\n\n this.cacheCurrentTarget = currentTarget;\n\n return currentTarget;\n } else {\n return cacheCurrentTarget;\n }\n }\n}\n\nexport function createEvent(event: MpEvent | string, node?: TaroElement) {\n if (typeof event === 'string') {\n // For Vue3 using document.createEvent\n return new TaroEvent(event, { bubbles: true, cancelable: true });\n }\n\n const domEv = new TaroEvent(event.type, { bubbles: true, cancelable: true }, event);\n\n for (const key in event) {\n if (key === CURRENT_TARGET || key === TARGET || key === TYPE || key === TIME_STAMP) {\n continue;\n } else {\n domEv[key] = event[key];\n }\n }\n\n if (domEv.type === CONFIRM && node?.nodeName === INPUT) {\n domEv.keyCode = 13;\n }\n\n return domEv;\n}\n\nconst eventsBatch = {};\n\nfunction getEventCBResult(event: MpEvent) {\n const result = event[EVENT_CALLBACK_RESULT];\n if (!isUndefined(result)) {\n delete event[EVENT_CALLBACK_RESULT];\n }\n return result;\n}\n\n// 小程序的事件代理回调函数\nexport function eventHandler(event: MpEvent) {\n event.currentTarget = event.currentTarget || event.target || { ...event };\n hooks.call('modifyMpEventImpl', event);\n\n const currentTarget = event.currentTarget;\n const id =\n (currentTarget.dataset?.sid as string) /** sid */ ||\n currentTarget.id /** uid */ ||\n (event.detail?.id as string) ||\n '';\n\n const node = env.document.getElementById(id);\n if (node) {\n const dispatch = () => {\n const e = createEvent(event, node);\n\n hooks.call('modifyTaroEvent', e, node);\n hooks.call('dispatchTaroEvent', e, node);\n hooks.call('dispatchTaroEventFinish', e, node);\n };\n if (hooks.isExist('batchedEventUpdates')) {\n const type = event.type;\n\n if (\n !hooks.call('isBubbleEvents', type) ||\n !isParentBound(node, type) ||\n (type === TOUCHMOVE && !!node.props.catchMove)\n ) {\n // 最上层组件统一 batchUpdate\n hooks.call('batchedEventUpdates', () => {\n if (eventsBatch[type]) {\n eventsBatch[type].forEach((fn) => fn());\n delete eventsBatch[type];\n }\n dispatch();\n });\n return getEventCBResult(event);\n } else {\n // 如果上层组件也有绑定同类型的组件,委托给上层组件调用事件回调\n (eventsBatch[type] ||= []).push(dispatch);\n }\n } else {\n dispatch();\n return getEventCBResult(event);\n }\n }\n}\n"],"mappings":"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"}
|
package/dist/dom/form.js
CHANGED
|
@@ -3,13 +3,14 @@ import { TaroElement } from "./element.js";
|
|
|
3
3
|
//#region src/dom/form.ts
|
|
4
4
|
var FormElement = class extends TaroElement {
|
|
5
5
|
get type() {
|
|
6
|
-
|
|
6
|
+
var _this$props$TYPE;
|
|
7
|
+
return (_this$props$TYPE = this.props["type"]) !== null && _this$props$TYPE !== void 0 ? _this$props$TYPE : "";
|
|
7
8
|
}
|
|
8
9
|
set type(val) {
|
|
9
10
|
this.setAttribute(TYPE, val);
|
|
10
11
|
}
|
|
11
12
|
get value() {
|
|
12
|
-
const val = this.props
|
|
13
|
+
const val = this.props.value;
|
|
13
14
|
return val == null ? "" : val;
|
|
14
15
|
}
|
|
15
16
|
set value(val) {
|
package/dist/dom/form.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"form.js","names":[],"sources":["../../src/dom/form.ts"],"sourcesContent":["import { CHANGE, INPUT, TYPE, VALUE } from '../constants';\nimport { TaroElement } from './element';\n\nimport type { TaroEvent } from './event';\n\nexport class FormElement extends TaroElement {\n public get type() {\n return this.props[TYPE] ?? '';\n }\n\n public set type(val: string) {\n this.setAttribute(TYPE, val);\n }\n\n public get value() {\n
|
|
1
|
+
{"version":3,"file":"form.js","names":[],"sources":["../../src/dom/form.ts"],"sourcesContent":["import { CHANGE, INPUT, TYPE, VALUE } from '../constants';\nimport { TaroElement } from './element';\n\nimport type { TaroEvent } from './event';\n\nexport class FormElement extends TaroElement {\n public get type() {\n return this.props[TYPE] ?? '';\n }\n\n public set type(val: string) {\n this.setAttribute(TYPE, val);\n }\n\n public get value() {\n const val = this.props.value;\n return val == null ? '' : val;\n }\n\n public set value(val: string | boolean | number | any[]) {\n this.setAttribute(VALUE, val);\n }\n\n public dispatchEvent(event: TaroEvent) {\n if (event.mpEvent) {\n const val = event.mpEvent.detail.value;\n if (event.type === CHANGE) {\n this.props.value = val as string;\n } else if (event.type === INPUT) {\n // Web 规范中表单组件的 value 应该跟着输入改变\n // 只是改 this.props.value 的话不会进行 setData,因此这里修改 this.value。\n // 只测试了 React、Vue3 input 组件的 onInput 事件,onChange 事件不确定有没有副作用,所以暂不修改。\n this.value = val as string;\n }\n }\n\n return super.dispatchEvent(event);\n }\n}\n"],"mappings":";;;AAKA,IAAa,cAAb,cAAiC,YAAY;CAC3C,IAAW,OAAO;;EAChB,QAAA,mBAAO,KAAK,MAAA,aAAA,QAAA,qBAAA,KAAA,IAAA,mBAAe;CAC7B;CAEA,IAAW,KAAK,KAAa;EAC3B,KAAK,aAAa,MAAM,GAAG;CAC7B;CAEA,IAAW,QAAQ;EACjB,MAAM,MAAM,KAAK,MAAM;EACvB,OAAO,OAAO,OAAO,KAAK;CAC5B;CAEA,IAAW,MAAM,KAAwC;EACvD,KAAK,aAAa,OAAO,GAAG;CAC9B;CAEA,cAAqB,OAAkB;EACrC,IAAI,MAAM,SAAS;GACjB,MAAM,MAAM,MAAM,QAAQ,OAAO;GACjC,IAAI,MAAM,SAAA,UACR,KAAK,MAAM,QAAQ;QACd,IAAI,MAAM,SAAA,SAIf,KAAK,QAAQ;EAEjB;EAEA,OAAO,MAAM,cAAc,KAAK;CAClC;AACF"}
|
package/dist/dom/node.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { TaroEventTarget } from './event-target';
|
|
2
|
-
import { NodeType } from './
|
|
2
|
+
import { NodeType } from './node-types';
|
|
3
3
|
import type { TFunc, UpdatePayload } from '../interface';
|
|
4
4
|
import type { TaroDocument } from './document';
|
|
5
5
|
import type { TaroElement } from './element';
|
|
@@ -7,6 +7,7 @@ import type { TaroRootElement } from './root';
|
|
|
7
7
|
interface RemoveChildOptions {
|
|
8
8
|
cleanRef?: boolean;
|
|
9
9
|
doUpdate?: boolean;
|
|
10
|
+
recordMutation?: boolean;
|
|
10
11
|
}
|
|
11
12
|
export declare class TaroNode extends TaroEventTarget {
|
|
12
13
|
uid: string;
|
|
@@ -27,9 +28,9 @@ export declare class TaroNode extends TaroEventTarget {
|
|
|
27
28
|
get parentElement(): TaroElement | null;
|
|
28
29
|
get firstChild(): TaroNode | null;
|
|
29
30
|
get lastChild(): TaroNode | null;
|
|
31
|
+
get textContent(): string;
|
|
30
32
|
/**
|
|
31
|
-
* @textContent
|
|
32
|
-
* @TODO 等待完整 innerHTML 实现
|
|
33
|
+
* @textContent 当前实现会用纯文本节点替换全部子节点。
|
|
33
34
|
*/
|
|
34
35
|
set textContent(text: string);
|
|
35
36
|
/**
|
package/dist/dom/node.js
CHANGED
|
@@ -22,7 +22,7 @@ var TaroNode = class TaroNode extends TaroEventTarget {
|
|
|
22
22
|
updateChildNodes(isClean) {
|
|
23
23
|
const cleanChildNodes = () => [];
|
|
24
24
|
const rerenderChildNodes = () => {
|
|
25
|
-
return this.childNodes.filter((node) => !isComment(node)).map(hydrate);
|
|
25
|
+
return this.childNodes.filter((node) => !isComment(node)).map((childNode) => hydrate(childNode));
|
|
26
26
|
};
|
|
27
27
|
this.enqueueUpdate({
|
|
28
28
|
path: `${this._path}.${CHILDNODES}`,
|
|
@@ -40,7 +40,8 @@ var TaroNode = class TaroNode extends TaroEventTarget {
|
|
|
40
40
|
});
|
|
41
41
|
}
|
|
42
42
|
get _root() {
|
|
43
|
-
|
|
43
|
+
var _this$parentNode;
|
|
44
|
+
return ((_this$parentNode = this.parentNode) === null || _this$parentNode === void 0 ? void 0 : _this$parentNode._root) || null;
|
|
44
45
|
}
|
|
45
46
|
findIndex(refChild) {
|
|
46
47
|
const index = this.childNodes.indexOf(refChild);
|
|
@@ -58,15 +59,15 @@ var TaroNode = class TaroNode extends TaroEventTarget {
|
|
|
58
59
|
}
|
|
59
60
|
get nextSibling() {
|
|
60
61
|
const parentNode = this.parentNode;
|
|
61
|
-
return parentNode
|
|
62
|
+
return (parentNode === null || parentNode === void 0 ? void 0 : parentNode.childNodes[parentNode.findIndex(this) + 1]) || null;
|
|
62
63
|
}
|
|
63
64
|
get previousSibling() {
|
|
64
65
|
const parentNode = this.parentNode;
|
|
65
|
-
return parentNode
|
|
66
|
+
return (parentNode === null || parentNode === void 0 ? void 0 : parentNode.childNodes[parentNode.findIndex(this) - 1]) || null;
|
|
66
67
|
}
|
|
67
68
|
get parentElement() {
|
|
68
69
|
const parentNode = this.parentNode;
|
|
69
|
-
if (parentNode
|
|
70
|
+
if ((parentNode === null || parentNode === void 0 ? void 0 : parentNode.nodeType) === 1) return parentNode;
|
|
70
71
|
return null;
|
|
71
72
|
}
|
|
72
73
|
get firstChild() {
|
|
@@ -76,9 +77,11 @@ var TaroNode = class TaroNode extends TaroEventTarget {
|
|
|
76
77
|
const childNodes = this.childNodes;
|
|
77
78
|
return childNodes[childNodes.length - 1] || null;
|
|
78
79
|
}
|
|
80
|
+
get textContent() {
|
|
81
|
+
return this.childNodes.map((childNode) => childNode.textContent).join("");
|
|
82
|
+
}
|
|
79
83
|
/**
|
|
80
|
-
* @textContent
|
|
81
|
-
* @TODO 等待完整 innerHTML 实现
|
|
84
|
+
* @textContent 当前实现会用纯文本节点替换全部子节点。
|
|
82
85
|
*/
|
|
83
86
|
set textContent(text) {
|
|
84
87
|
const removedNodes = this.childNodes.slice();
|
|
@@ -87,8 +90,9 @@ var TaroNode = class TaroNode extends TaroEventTarget {
|
|
|
87
90
|
if (text === "") this.updateChildNodes(true);
|
|
88
91
|
else {
|
|
89
92
|
const newText = env.document.createTextNode(text);
|
|
93
|
+
newText.parentNode = this;
|
|
94
|
+
this.childNodes.push(newText);
|
|
90
95
|
addedNodes.push(newText);
|
|
91
|
-
this.appendChild(newText);
|
|
92
96
|
this.updateChildNodes();
|
|
93
97
|
}
|
|
94
98
|
MutationObserver.record({
|
|
@@ -114,7 +118,11 @@ var TaroNode = class TaroNode extends TaroEventTarget {
|
|
|
114
118
|
}, refChild);
|
|
115
119
|
return newChild;
|
|
116
120
|
}
|
|
117
|
-
|
|
121
|
+
const previousParentNode = newChild.parentNode;
|
|
122
|
+
newChild.remove({
|
|
123
|
+
cleanRef: false,
|
|
124
|
+
recordMutation: !!previousParentNode && previousParentNode !== this
|
|
125
|
+
});
|
|
118
126
|
let index = 0;
|
|
119
127
|
newChild.parentNode = this;
|
|
120
128
|
if (refChild) {
|
|
@@ -176,8 +184,8 @@ var TaroNode = class TaroNode extends TaroEventTarget {
|
|
|
176
184
|
* 2. remove C
|
|
177
185
|
*/
|
|
178
186
|
removeChild(child, options = {}) {
|
|
179
|
-
const { cleanRef, doUpdate } = options;
|
|
180
|
-
if (cleanRef !== false && doUpdate !== false) MutationObserver.record({
|
|
187
|
+
const { cleanRef, doUpdate, recordMutation } = options;
|
|
188
|
+
if (cleanRef !== false && doUpdate !== false || recordMutation) MutationObserver.record({
|
|
181
189
|
type: "childList",
|
|
182
190
|
target: this,
|
|
183
191
|
removedNodes: [child],
|
|
@@ -192,13 +200,15 @@ var TaroNode = class TaroNode extends TaroEventTarget {
|
|
|
192
200
|
return child;
|
|
193
201
|
}
|
|
194
202
|
remove(options) {
|
|
195
|
-
|
|
203
|
+
var _this$parentNode2;
|
|
204
|
+
(_this$parentNode2 = this.parentNode) === null || _this$parentNode2 === void 0 || _this$parentNode2.removeChild(this, options);
|
|
196
205
|
}
|
|
197
206
|
hasChildNodes() {
|
|
198
207
|
return this.childNodes.length > 0;
|
|
199
208
|
}
|
|
200
209
|
enqueueUpdate(payload) {
|
|
201
|
-
|
|
210
|
+
var _this$_root;
|
|
211
|
+
(_this$_root = this._root) === null || _this$_root === void 0 || _this$_root.enqueueUpdate(payload);
|
|
202
212
|
}
|
|
203
213
|
get ownerDocument() {
|
|
204
214
|
return env.document;
|
package/dist/dom/node.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node.js","names":[],"sources":["../../src/dom/node.ts"],"sourcesContent":["import { ensure, hooks, Shortcuts } from '@spcsn/taro-shared';\n\nimport { DOCUMENT_FRAGMENT } from '../constants';\nimport { MutationObserver, MutationRecordType } from '../dom-external/mutation-observer';\nimport env from '../env';\nimport { hydrate } from '../hydrate';\nimport { extend, incrementId, isComment } from '../utils';\nimport { eventSource } from './event-source';\nimport { TaroEventTarget } from './event-target';\nimport { NodeType } from './node_types';\n\nimport type { TFunc, UpdatePayload } from '../interface';\nimport type { TaroDocument } from './document';\nimport type { TaroElement } from './element';\nimport type { TaroRootElement } from './root';\n\ninterface RemoveChildOptions {\n cleanRef?: boolean;\n doUpdate?: boolean;\n}\n\nconst CHILDNODES = Shortcuts.Childnodes;\nconst nodeId = incrementId();\n\nexport class TaroNode extends TaroEventTarget {\n public uid: string;\n public sid: string;\n public nodeType: NodeType;\n public nodeName: string;\n public parentNode: TaroNode | null = null;\n public childNodes: TaroNode[] = [];\n\n public constructor() {\n super();\n this.uid = '_' + nodeId(); // dom 节点 id,开发者可修改\n this.sid = this.uid; // dom 节点全局唯一 id,不可被修改\n eventSource.set(this.sid, this);\n }\n\n private hydrate = (node: TaroNode) => () => hydrate(node as TaroElement);\n\n private updateChildNodes(isClean?: boolean) {\n const cleanChildNodes = () => [];\n const rerenderChildNodes = () => {\n const childNodes = this.childNodes.filter((node) => !isComment(node));\n return childNodes.map(hydrate);\n };\n\n this.enqueueUpdate({\n path: `${this._path}.${CHILDNODES}`,\n value: isClean ? cleanChildNodes : rerenderChildNodes,\n });\n }\n\n private updateSingleChild(index: number) {\n this.childNodes.forEach((child, childIndex) => {\n if (isComment(child)) return;\n\n if (index && childIndex < index) return;\n\n this.enqueueUpdate({\n path: child._path,\n value: this.hydrate(child),\n });\n });\n }\n\n public get _root(): TaroRootElement | null {\n return this.parentNode?._root || null;\n }\n\n protected findIndex(refChild: TaroNode): number {\n const index = this.childNodes.indexOf(refChild);\n\n ensure(index !== -1, 'The node to be replaced is not a child of this node.');\n\n return index;\n }\n\n public get _path(): string {\n const parentNode = this.parentNode;\n\n if (parentNode) {\n // 计算路径时,先过滤掉 comment 节点\n const list = parentNode.childNodes.filter((node) => !isComment(node));\n const indexOfNode = list.indexOf(this);\n const index = hooks.call('getPathIndex', indexOfNode);\n\n return `${parentNode._path}.${CHILDNODES}.${index}`;\n }\n\n return '';\n }\n\n public get nextSibling(): TaroNode | null {\n const parentNode = this.parentNode;\n return parentNode?.childNodes[parentNode.findIndex(this) + 1] || null;\n }\n\n public get previousSibling(): TaroNode | null {\n const parentNode = this.parentNode;\n return parentNode?.childNodes[parentNode.findIndex(this) - 1] || null;\n }\n\n public get parentElement(): TaroElement | null {\n const parentNode = this.parentNode;\n if (parentNode?.nodeType === NodeType.ELEMENT_NODE) {\n return parentNode as TaroElement;\n }\n return null;\n }\n\n public get firstChild(): TaroNode | null {\n return this.childNodes[0] || null;\n }\n\n public get lastChild(): TaroNode | null {\n const childNodes = this.childNodes;\n return childNodes[childNodes.length - 1] || null;\n }\n\n /**\n * @textContent 目前只能置空子元素\n * @TODO 等待完整 innerHTML 实现\n */\n // eslint-disable-next-line accessor-pairs\n public set textContent(text: string) {\n const removedNodes = this.childNodes.slice();\n const addedNodes: TaroNode[] = [];\n\n // Handle old children' data structure & ref\n while (this.firstChild) {\n this.removeChild(this.firstChild, { doUpdate: false });\n }\n\n if (text === '') {\n this.updateChildNodes(true);\n } else {\n const newText = env.document.createTextNode(text);\n addedNodes.push(newText);\n this.appendChild(newText);\n this.updateChildNodes();\n }\n\n // @Todo: appendChild 会多触发一次\n MutationObserver.record({\n type: MutationRecordType.CHILD_LIST,\n target: this,\n removedNodes,\n addedNodes,\n });\n }\n\n /**\n * @doc https://developer.mozilla.org/zh-CN/docs/Web/API/Node/insertBefore\n * @scenario\n * [A,B,C]\n * 1. insert D before C, D has no parent\n * 2. insert D before C, D has the same parent of C\n * 3. insert D before C, D has the different parent of C\n */\n public insertBefore<T extends TaroNode>(newChild: T, refChild?: TaroNode | null, isReplace?: boolean): T {\n if (newChild.nodeName === DOCUMENT_FRAGMENT) {\n newChild.childNodes.reduceRight((previousValue, currentValue) => {\n this.insertBefore(currentValue, previousValue);\n return currentValue;\n }, refChild);\n return newChild;\n }\n\n // Parent release newChild\n // - cleanRef: false (No need to clean eventSource, because newChild is about to be inserted)\n // - update: true (Need to update parent.childNodes, because parent.childNodes is reordered)\n newChild.remove({ cleanRef: false });\n\n let index = 0;\n // Data structure\n newChild.parentNode = this;\n if (refChild) {\n // insertBefore & replaceChild\n index = this.findIndex(refChild);\n this.childNodes.splice(index, 0, newChild);\n } else {\n // appendChild\n this.childNodes.push(newChild);\n }\n\n const childNodesLength = this.childNodes.length;\n // Serialization\n if (this._root) {\n if (!refChild) {\n // appendChild\n const isOnlyChild = childNodesLength === 1;\n if (isOnlyChild) {\n this.updateChildNodes();\n } else {\n this.enqueueUpdate({\n path: newChild._path,\n value: this.hydrate(newChild),\n });\n }\n } else if (isReplace) {\n // replaceChild\n this.enqueueUpdate({\n path: newChild._path,\n value: this.hydrate(newChild),\n });\n } else {\n // insertBefore 有两种更新模式\n // 比方说有 A B C 三个节点,现在要在 C 前插入 D\n // 1. 插入 D,然后更新整个父节点的 childNodes 数组\n // setData({ cn: [A, B, D, C] })\n // 2. 插入 D,然后更新 D 以及 D 之后每个节点的数据\n // setData ({\n // cn.[2]: D,\n // cn.[3]: C,\n // })\n // 由于微信解析 ’cn.[2]‘ 这些路径的时候也需要消耗时间,\n // 所以根据 insertBefore 插入的位置来做不同的处理\n const mark = (childNodesLength * 2) / 3;\n if (mark > index) {\n // 如果 insertBefore 的位置在 childNodes 的 2/3 前,则为了避免解析路径消耗过多的时间,采用第一种方式\n this.updateChildNodes();\n } else {\n // 如果 insertBefore 的位置在 childNodes 的 2/3 之后,则采用第二种方式,避免 childNodes 的全量更新\n this.updateSingleChild(index);\n }\n }\n }\n\n MutationObserver.record({\n type: MutationRecordType.CHILD_LIST,\n target: this,\n addedNodes: [newChild],\n removedNodes: isReplace ? [refChild as TaroNode] /** replaceChild */ : [],\n nextSibling: isReplace\n ? (refChild as TaroNode).nextSibling /** replaceChild */\n : refChild || null /** insertBefore & appendChild */,\n previousSibling: newChild.previousSibling,\n });\n\n return newChild;\n }\n\n /**\n * @doc https://developer.mozilla.org/zh-CN/docs/Web/API/Node/appendChild\n * @scenario\n * [A,B,C]\n * 1. append C, C has no parent\n * 2. append C, C has the same parent of B\n * 3. append C, C has the different parent of B\n */\n public appendChild(newChild: TaroNode) {\n return this.insertBefore(newChild);\n }\n\n /**\n * @doc https://developer.mozilla.org/zh-CN/docs/Web/API/Node/replaceChild\n * @scenario\n * [A,B,C]\n * 1. replace B with C, C has no parent\n * 2. replace B with C, C has no parent, C has the same parent of B\n * 3. replace B with C, C has no parent, C has the different parent of B\n */\n public replaceChild(newChild: TaroNode, oldChild: TaroNode) {\n if (oldChild.parentNode !== this) return;\n\n // Insert the newChild\n this.insertBefore(newChild, oldChild, true);\n\n // Destroy the oldChild\n // - cleanRef: true (Need to clean eventSource, because the oldChild was detached from the DOM tree)\n // - update: false (No need to update parent.childNodes, because replace will not cause the parent.childNodes being reordered)\n oldChild.remove({ doUpdate: false });\n\n return oldChild;\n }\n\n /**\n * @doc https://developer.mozilla.org/zh-CN/docs/Web/API/Node/removeChild\n * @scenario\n * [A,B,C]\n * 1. remove A or B\n * 2. remove C\n */\n public removeChild<T extends TaroNode>(child: T, options: RemoveChildOptions = {}): T {\n const { cleanRef, doUpdate } = options;\n\n if (cleanRef !== false && doUpdate !== false) {\n // appendChild/replaceChild/insertBefore 不应该触发\n // @Todo: 但其实如果 newChild 的父节点是另一颗子树的节点,应该是要触发的\n MutationObserver.record({\n type: MutationRecordType.CHILD_LIST,\n target: this,\n removedNodes: [child],\n nextSibling: child.nextSibling,\n previousSibling: child.previousSibling,\n });\n }\n\n // Data Structure\n const index = this.findIndex(child);\n this.childNodes.splice(index, 1);\n child.parentNode = null;\n\n // Set eventSource\n if (cleanRef !== false) {\n eventSource.removeNodeTree(child);\n }\n\n // Serialization\n if (this._root && doUpdate !== false) {\n this.updateChildNodes();\n }\n\n return child;\n }\n\n public remove(options?: RemoveChildOptions) {\n this.parentNode?.removeChild(this, options);\n }\n\n public hasChildNodes() {\n return this.childNodes.length > 0;\n }\n\n public enqueueUpdate(payload: UpdatePayload) {\n this._root?.enqueueUpdate(payload);\n }\n\n public get ownerDocument(): TaroDocument {\n return env.document;\n }\n\n static extend(methodName: string, options: TFunc | Record<string, any>) {\n extend(TaroNode, methodName, options);\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"node.js","names":[],"sources":["../../src/dom/node.ts"],"sourcesContent":["import { ensure, hooks, Shortcuts } from '@spcsn/taro-shared';\n\nimport { DOCUMENT_FRAGMENT } from '../constants';\nimport { MutationObserver, MutationRecordType } from '../dom-external/mutation-observer';\nimport env from '../env';\nimport { hydrate } from '../hydrate';\nimport { extend, incrementId, isComment } from '../utils';\nimport { eventSource } from './event-source';\nimport { TaroEventTarget } from './event-target';\nimport { NodeType } from './node-types';\n\nimport type { TFunc, UpdatePayload } from '../interface';\nimport type { TaroDocument } from './document';\nimport type { TaroElement } from './element';\nimport type { TaroRootElement } from './root';\nimport type { TaroText } from './text';\n\ninterface RemoveChildOptions {\n cleanRef?: boolean;\n doUpdate?: boolean;\n recordMutation?: boolean;\n}\n\nconst CHILDNODES = Shortcuts.Childnodes;\nconst nodeId = incrementId();\n\nexport class TaroNode extends TaroEventTarget {\n public uid: string;\n public sid: string;\n public nodeType!: NodeType;\n public nodeName!: string;\n public parentNode: TaroNode | null = null;\n public childNodes: TaroNode[] = [];\n\n public constructor() {\n super();\n this.uid = '_' + nodeId(); // dom 节点 id,开发者可修改\n this.sid = this.uid; // dom 节点全局唯一 id,不可被修改\n eventSource.set(this.sid, this);\n }\n\n private hydrate = (node: TaroNode) => () => hydrate(node as TaroElement | TaroText);\n\n private updateChildNodes(isClean?: boolean) {\n const cleanChildNodes = () => [];\n const rerenderChildNodes = () => {\n const childNodes = this.childNodes.filter((node) => !isComment(node));\n return childNodes.map((childNode) => hydrate(childNode as TaroElement | TaroText));\n };\n\n this.enqueueUpdate({\n path: `${this._path}.${CHILDNODES}`,\n value: isClean ? cleanChildNodes : rerenderChildNodes,\n });\n }\n\n private updateSingleChild(index: number) {\n this.childNodes.forEach((child, childIndex) => {\n if (isComment(child)) return;\n\n if (index && childIndex < index) return;\n\n this.enqueueUpdate({\n path: child._path,\n value: this.hydrate(child),\n });\n });\n }\n\n public get _root(): TaroRootElement | null {\n return this.parentNode?._root || null;\n }\n\n protected findIndex(refChild: TaroNode): number {\n const index = this.childNodes.indexOf(refChild);\n\n ensure(index !== -1, 'The node to be replaced is not a child of this node.');\n\n return index;\n }\n\n public get _path(): string {\n const parentNode = this.parentNode;\n\n if (parentNode) {\n // 计算路径时,先过滤掉 comment 节点\n const list = parentNode.childNodes.filter((node) => !isComment(node));\n const indexOfNode = list.indexOf(this);\n const index = hooks.call('getPathIndex', indexOfNode);\n\n return `${parentNode._path}.${CHILDNODES}.${index}`;\n }\n\n return '';\n }\n\n public get nextSibling(): TaroNode | null {\n const parentNode = this.parentNode;\n return parentNode?.childNodes[parentNode.findIndex(this) + 1] || null;\n }\n\n public get previousSibling(): TaroNode | null {\n const parentNode = this.parentNode;\n return parentNode?.childNodes[parentNode.findIndex(this) - 1] || null;\n }\n\n public get parentElement(): TaroElement | null {\n const parentNode = this.parentNode;\n if (parentNode?.nodeType === NodeType.ELEMENT_NODE) {\n return parentNode as TaroElement;\n }\n return null;\n }\n\n public get firstChild(): TaroNode | null {\n return this.childNodes[0] || null;\n }\n\n public get lastChild(): TaroNode | null {\n const childNodes = this.childNodes;\n return childNodes[childNodes.length - 1] || null;\n }\n\n public get textContent(): string {\n return this.childNodes.map((childNode) => childNode.textContent).join('');\n }\n\n /**\n * @textContent 当前实现会用纯文本节点替换全部子节点。\n */\n public set textContent(text: string) {\n const removedNodes = this.childNodes.slice();\n const addedNodes: TaroNode[] = [];\n\n // Handle old children' data structure & ref\n while (this.firstChild) {\n this.removeChild(this.firstChild, { doUpdate: false });\n }\n\n if (text === '') {\n this.updateChildNodes(true);\n } else {\n const newText = env.document.createTextNode(text);\n newText.parentNode = this;\n this.childNodes.push(newText);\n addedNodes.push(newText);\n this.updateChildNodes();\n }\n\n MutationObserver.record({\n type: MutationRecordType.CHILD_LIST,\n target: this,\n removedNodes,\n addedNodes,\n });\n }\n\n /**\n * @doc https://developer.mozilla.org/zh-CN/docs/Web/API/Node/insertBefore\n * @scenario\n * [A,B,C]\n * 1. insert D before C, D has no parent\n * 2. insert D before C, D has the same parent of C\n * 3. insert D before C, D has the different parent of C\n */\n public insertBefore<T extends TaroNode>(newChild: T, refChild?: TaroNode | null, isReplace?: boolean): T {\n if (newChild.nodeName === DOCUMENT_FRAGMENT) {\n newChild.childNodes.reduceRight((previousValue, currentValue) => {\n this.insertBefore(currentValue, previousValue);\n return currentValue;\n }, refChild);\n return newChild;\n }\n\n // Parent release newChild\n // - cleanRef: false (No need to clean eventSource, because newChild is about to be inserted)\n // - update: true (Need to update parent.childNodes, because parent.childNodes is reordered)\n const previousParentNode = newChild.parentNode;\n newChild.remove({ cleanRef: false, recordMutation: !!previousParentNode && previousParentNode !== this });\n\n let index = 0;\n // Data structure\n newChild.parentNode = this;\n if (refChild) {\n // insertBefore & replaceChild\n index = this.findIndex(refChild);\n this.childNodes.splice(index, 0, newChild);\n } else {\n // appendChild\n this.childNodes.push(newChild);\n }\n\n const childNodesLength = this.childNodes.length;\n // Serialization\n if (this._root) {\n if (!refChild) {\n // appendChild\n const isOnlyChild = childNodesLength === 1;\n if (isOnlyChild) {\n this.updateChildNodes();\n } else {\n this.enqueueUpdate({\n path: newChild._path,\n value: this.hydrate(newChild),\n });\n }\n } else if (isReplace) {\n // replaceChild\n this.enqueueUpdate({\n path: newChild._path,\n value: this.hydrate(newChild),\n });\n } else {\n // insertBefore 有两种更新模式\n // 比方说有 A B C 三个节点,现在要在 C 前插入 D\n // 1. 插入 D,然后更新整个父节点的 childNodes 数组\n // setData({ cn: [A, B, D, C] })\n // 2. 插入 D,然后更新 D 以及 D 之后每个节点的数据\n // setData ({\n // cn.[2]: D,\n // cn.[3]: C,\n // })\n // 由于微信解析 ’cn.[2]‘ 这些路径的时候也需要消耗时间,\n // 所以根据 insertBefore 插入的位置来做不同的处理\n const mark = (childNodesLength * 2) / 3;\n if (mark > index) {\n // 如果 insertBefore 的位置在 childNodes 的 2/3 前,则为了避免解析路径消耗过多的时间,采用第一种方式\n this.updateChildNodes();\n } else {\n // 如果 insertBefore 的位置在 childNodes 的 2/3 之后,则采用第二种方式,避免 childNodes 的全量更新\n this.updateSingleChild(index);\n }\n }\n }\n\n MutationObserver.record({\n type: MutationRecordType.CHILD_LIST,\n target: this,\n addedNodes: [newChild],\n removedNodes: isReplace ? [refChild as TaroNode] /** replaceChild */ : [],\n nextSibling: isReplace\n ? (refChild as TaroNode).nextSibling /** replaceChild */\n : refChild || null /** insertBefore & appendChild */,\n previousSibling: newChild.previousSibling,\n });\n\n return newChild;\n }\n\n /**\n * @doc https://developer.mozilla.org/zh-CN/docs/Web/API/Node/appendChild\n * @scenario\n * [A,B,C]\n * 1. append C, C has no parent\n * 2. append C, C has the same parent of B\n * 3. append C, C has the different parent of B\n */\n public appendChild(newChild: TaroNode) {\n return this.insertBefore(newChild);\n }\n\n /**\n * @doc https://developer.mozilla.org/zh-CN/docs/Web/API/Node/replaceChild\n * @scenario\n * [A,B,C]\n * 1. replace B with C, C has no parent\n * 2. replace B with C, C has no parent, C has the same parent of B\n * 3. replace B with C, C has no parent, C has the different parent of B\n */\n public replaceChild(newChild: TaroNode, oldChild: TaroNode) {\n if (oldChild.parentNode !== this) return;\n\n // Insert the newChild\n this.insertBefore(newChild, oldChild, true);\n\n // Destroy the oldChild\n // - cleanRef: true (Need to clean eventSource, because the oldChild was detached from the DOM tree)\n // - update: false (No need to update parent.childNodes, because replace will not cause the parent.childNodes being reordered)\n oldChild.remove({ doUpdate: false });\n\n return oldChild;\n }\n\n /**\n * @doc https://developer.mozilla.org/zh-CN/docs/Web/API/Node/removeChild\n * @scenario\n * [A,B,C]\n * 1. remove A or B\n * 2. remove C\n */\n public removeChild<T extends TaroNode>(child: T, options: RemoveChildOptions = {}): T {\n const { cleanRef, doUpdate, recordMutation } = options;\n\n if ((cleanRef !== false && doUpdate !== false) || recordMutation) {\n MutationObserver.record({\n type: MutationRecordType.CHILD_LIST,\n target: this,\n removedNodes: [child],\n nextSibling: child.nextSibling,\n previousSibling: child.previousSibling,\n });\n }\n\n // Data Structure\n const index = this.findIndex(child);\n this.childNodes.splice(index, 1);\n child.parentNode = null;\n\n // Set eventSource\n if (cleanRef !== false) {\n eventSource.removeNodeTree(child);\n }\n\n // Serialization\n if (this._root && doUpdate !== false) {\n this.updateChildNodes();\n }\n\n return child;\n }\n\n public remove(options?: RemoveChildOptions) {\n this.parentNode?.removeChild(this, options);\n }\n\n public hasChildNodes() {\n return this.childNodes.length > 0;\n }\n\n public enqueueUpdate(payload: UpdatePayload) {\n this._root?.enqueueUpdate(payload);\n }\n\n public get ownerDocument(): TaroDocument {\n return env.document;\n }\n\n static extend(methodName: string, options: TFunc | Record<string, any>) {\n extend(TaroNode, methodName, options);\n }\n}\n"],"mappings":"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"}
|
package/dist/dom/root.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { ROOT_STR, SET_DATA } from "../constants/index.js";
|
|
2
|
+
import { _objectSpread2 } from "../_virtual/_@oxc-project_runtime@0.130.0/helpers/objectSpread2.js";
|
|
2
3
|
import { customWrapperCache, isComment } from "../utils/index.js";
|
|
3
4
|
import { TaroElement } from "./element.js";
|
|
4
5
|
import { options } from "../options.js";
|
|
@@ -81,10 +82,7 @@ var TaroRootElement = class extends TaroElement {
|
|
|
81
82
|
const found = findCustomWrapper(this, dataPathArr);
|
|
82
83
|
if (found) {
|
|
83
84
|
const { customWrapper, splitedPath } = found;
|
|
84
|
-
customWrapperMap.set(customWrapper, {
|
|
85
|
-
...customWrapperMap.get(customWrapper) || {},
|
|
86
|
-
[`i.${splitedPath}`]: data[p]
|
|
87
|
-
});
|
|
85
|
+
customWrapperMap.set(customWrapper, _objectSpread2(_objectSpread2({}, customWrapperMap.get(customWrapper) || {}), {}, { [`i.${splitedPath}`]: data[p] }));
|
|
88
86
|
} else normalUpdate[p] = data[p];
|
|
89
87
|
}
|
|
90
88
|
const customWrapperCount = customWrapperMap.size;
|
|
@@ -99,11 +97,11 @@ var TaroRootElement = class extends TaroElement {
|
|
|
99
97
|
}
|
|
100
98
|
};
|
|
101
99
|
if (customWrapperCount) customWrapperMap.forEach((data, ctx) => {
|
|
102
|
-
if (options.debug) console.log("custom wrapper setData: ", data);
|
|
100
|
+
if (options.debug) globalThis.console.log("custom wrapper setData: ", data);
|
|
103
101
|
ctx.setData(data, cb);
|
|
104
102
|
});
|
|
105
103
|
if (isNeedNormalUpdate) {
|
|
106
|
-
if (options.debug) console.log("page setData:", normalUpdate);
|
|
104
|
+
if (options.debug) globalThis.console.log("page setData:", normalUpdate);
|
|
107
105
|
ctx.setData(normalUpdate, cb);
|
|
108
106
|
}
|
|
109
107
|
});
|