@tarojs/runtime 4.0.0-canary.8 → 4.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/LICENSE +17 -3
- package/dist/bom/URL.d.ts +54 -0
- package/dist/bom/URL.js +221 -0
- package/dist/bom/URL.js.map +1 -0
- package/dist/bom/URLSearchParams.d.ts +2 -0
- package/dist/bom/URLSearchParams.js +131 -0
- package/dist/bom/URLSearchParams.js.map +1 -0
- package/dist/bom/document.d.ts +3 -0
- package/dist/bom/document.js +39 -0
- package/dist/bom/document.js.map +1 -0
- package/dist/bom/getComputedStyle.d.ts +5 -0
- package/dist/bom/getComputedStyle.js +8 -0
- package/dist/bom/getComputedStyle.js.map +1 -0
- package/dist/bom/history.d.ts +32 -0
- package/dist/bom/history.js +121 -0
- package/dist/bom/history.js.map +1 -0
- package/dist/bom/location.d.ts +39 -0
- package/dist/bom/location.js +240 -0
- package/dist/bom/location.js.map +1 -0
- package/dist/bom/navigator.d.ts +2 -0
- package/dist/bom/navigator.js +24 -0
- package/dist/bom/navigator.js.map +1 -0
- package/dist/bom/raf.d.ts +5 -0
- package/dist/bom/raf.js +33 -0
- package/dist/bom/raf.js.map +1 -0
- package/dist/bom/window.d.ts +26 -0
- package/dist/bom/window.js +92 -0
- package/dist/bom/window.js.map +1 -0
- package/dist/constants/index.d.ts +60 -0
- package/dist/constants/index.js +63 -0
- package/dist/constants/index.js.map +1 -0
- package/dist/current.d.ts +19 -0
- package/dist/current.js +9 -0
- package/dist/current.js.map +1 -0
- package/dist/dom/anchor-element.d.ts +14 -0
- package/dist/dom/anchor-element.js +54 -0
- package/dist/dom/anchor-element.js.map +1 -0
- package/dist/dom/class-list.d.ts +17 -0
- package/dist/dom/class-list.js +92 -0
- package/dist/dom/class-list.js.map +1 -0
- package/dist/dom/document.d.ts +25 -0
- package/dist/dom/document.js +80 -0
- package/dist/dom/document.js.map +1 -0
- package/dist/dom/element.d.ts +40 -0
- package/dist/dom/element.js +315 -0
- package/dist/dom/element.js.map +1 -0
- package/dist/dom/event-source.d.ts +7 -0
- package/dist/dom/event-source.js +17 -0
- package/dist/dom/event-source.js.map +1 -0
- package/dist/dom/event-target.d.ts +8 -0
- package/dist/dom/event-target.js +78 -0
- package/dist/dom/event-target.js.map +1 -0
- package/dist/dom/event.d.ts +24 -0
- package/dist/dom/event.js +152 -0
- package/dist/dom/event.js.map +1 -0
- package/dist/dom/form.d.ts +10 -0
- package/dist/dom/form.js +38 -0
- package/dist/dom/form.js.map +1 -0
- package/dist/dom/node.d.ts +107 -0
- package/dist/dom/node.js +292 -0
- package/dist/dom/node.js.map +1 -0
- package/dist/dom/root.d.ts +16 -0
- package/dist/dom/root.js +169 -0
- package/dist/dom/root.js.map +1 -0
- package/dist/dom/style.d.ts +15 -0
- package/dist/dom/style.js +168 -0
- package/dist/dom/style.js.map +1 -0
- package/dist/dom/style_properties.d.ts +3 -0
- package/dist/dom/style_properties.js +186 -0
- package/dist/dom/style_properties.js.map +1 -0
- package/dist/dom/svg.d.ts +4 -0
- package/dist/dom/svg.js +8 -0
- package/dist/dom/svg.js.map +1 -0
- package/dist/dom/text.d.ts +15 -0
- package/dist/dom/text.js +41 -0
- package/dist/dom/text.js.map +1 -0
- package/dist/dom/transfer.d.ts +8 -0
- package/dist/dom/transfer.js +15 -0
- package/dist/dom/transfer.js.map +1 -0
- package/dist/dom/tree.d.ts +4 -0
- package/dist/dom/tree.js +38 -0
- package/dist/dom/tree.js.map +1 -0
- package/dist/dom-external/element.d.ts +4 -0
- package/dist/dom-external/element.js +29 -0
- package/dist/dom-external/element.js.map +1 -0
- package/dist/dom-external/index.d.ts +1 -0
- package/dist/dom-external/index.js +38 -0
- package/dist/dom-external/index.js.map +1 -0
- package/dist/dom-external/inner-html/html.d.ts +3 -0
- package/dist/dom-external/inner-html/html.js +28 -0
- package/dist/dom-external/inner-html/html.js.map +1 -0
- package/dist/dom-external/inner-html/parser.d.ts +25 -0
- package/dist/dom-external/inner-html/parser.js +216 -0
- package/dist/dom-external/inner-html/parser.js.map +1 -0
- package/dist/dom-external/inner-html/scaner.d.ts +30 -0
- package/dist/dom-external/inner-html/scaner.js +304 -0
- package/dist/dom-external/inner-html/scaner.js.map +1 -0
- package/dist/dom-external/inner-html/style.d.ts +27 -0
- package/dist/dom-external/inner-html/style.js +235 -0
- package/dist/dom-external/inner-html/style.js.map +1 -0
- package/dist/dom-external/inner-html/tags.d.ts +9 -0
- package/dist/dom-external/inner-html/tags.js +26 -0
- package/dist/dom-external/inner-html/tags.js.map +1 -0
- package/dist/dom-external/inner-html/utils.d.ts +2 -0
- package/dist/dom-external/inner-html/utils.js +12 -0
- package/dist/dom-external/inner-html/utils.js.map +1 -0
- package/dist/dom-external/mutation-observer/implements.d.ts +71 -0
- package/dist/dom-external/mutation-observer/implements.js +108 -0
- package/dist/dom-external/mutation-observer/implements.js.map +1 -0
- package/dist/dom-external/mutation-observer/index.d.ts +12 -0
- package/dist/dom-external/mutation-observer/index.js +35 -0
- package/dist/dom-external/mutation-observer/index.js.map +1 -0
- package/dist/dom-external/node.d.ts +12 -0
- package/dist/dom-external/node.js +75 -0
- package/dist/dom-external/node.js.map +1 -0
- package/dist/dsl/common.d.ts +16 -0
- package/dist/dsl/common.js +337 -0
- package/dist/dsl/common.js.map +1 -0
- package/dist/emitter/emitter.d.ts +4 -0
- package/dist/emitter/emitter.js +7 -0
- package/dist/emitter/emitter.js.map +1 -0
- package/dist/env.d.ts +7 -0
- package/dist/env.js +9 -0
- package/dist/env.js.map +1 -0
- package/dist/hydrate.d.ts +11 -0
- package/dist/hydrate.js +91 -0
- package/dist/hydrate.js.map +1 -0
- package/dist/index-26658829.d.ts +23 -0
- package/dist/{runtime.cjs.d.ts → index.cjs.d.ts} +108 -102
- package/dist/{runtime.h5.js → index.cjs.js} +4301 -2495
- package/dist/index.cjs.js.map +1 -0
- package/dist/index.d.ts +34 -0
- package/dist/index.js +35 -0
- package/dist/index.js.map +1 -0
- package/dist/instance-4c64b022.d.ts +85 -0
- package/dist/next-tick.d.ts +3 -0
- package/dist/next-tick.js +47 -0
- package/dist/next-tick.js.map +1 -0
- package/dist/node_types-9ac5b4dd.d.ts +11 -0
- package/dist/options-4c64b022.d.ts +17 -0
- package/dist/options.d.ts +3 -0
- package/dist/options.js +7 -0
- package/dist/options.js.map +1 -0
- package/dist/perf.d.ts +9 -0
- package/dist/perf.js +49 -0
- package/dist/perf.js.map +1 -0
- package/dist/polyfill/array.d.ts +3 -0
- package/dist/polyfill/array.js +56 -0
- package/dist/polyfill/array.js.map +1 -0
- package/dist/polyfill/index.d.ts +2 -0
- package/dist/polyfill/index.js +34 -0
- package/dist/polyfill/index.js.map +1 -0
- package/dist/polyfill/intersection-observer.d.ts +2 -0
- package/dist/polyfill/intersection-observer.js +600 -0
- package/dist/polyfill/intersection-observer.js.map +1 -0
- package/dist/polyfill/object.d.ts +4 -0
- package/dist/polyfill/object.js +102 -0
- package/dist/polyfill/object.js.map +1 -0
- package/dist/record-32b054d8.d.ts +25 -0
- package/dist/runtime.esm.d.ts +108 -102
- package/dist/runtime.esm.js +4126 -3320
- package/dist/runtime.esm.js.map +1 -1
- package/dist/utils/cache.d.ts +13 -0
- package/dist/utils/cache.js +27 -0
- package/dist/utils/cache.js.map +1 -0
- package/dist/utils/index.d.ts +26 -0
- package/dist/utils/index.js +99 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/lodash.d.ts +3 -0
- package/dist/utils/lodash.js +32 -0
- package/dist/utils/lodash.js.map +1 -0
- package/dist/utils/router.d.ts +8 -0
- package/dist/utils/router.js +24 -0
- package/dist/utils/router.js.map +1 -0
- package/package.json +23 -26
- package/dist/runtime.cjs.js +0 -4628
- package/dist/runtime.h5.d.ts +0 -800
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import { EMPTY_OBJ, hooks, isUndefined } from '@tarojs/shared';
|
|
2
|
+
import { CURRENT_TARGET, TARGET, TYPE, TIME_STAMP, CONFIRM, INPUT, KEY_CODE, TOUCHMOVE, EVENT_CALLBACK_RESULT } from '../constants/index.js';
|
|
3
|
+
import env from '../env.js';
|
|
4
|
+
import { isParentBinded } from '../utils/index.js';
|
|
5
|
+
|
|
6
|
+
// Taro 事件对象。以 Web 标准的事件对象为基础,加入小程序事件对象中携带的部分信息,并模拟实现事件冒泡。
|
|
7
|
+
class TaroEvent {
|
|
8
|
+
constructor(type, opts, event) {
|
|
9
|
+
this._stop = false;
|
|
10
|
+
this._end = false;
|
|
11
|
+
this.defaultPrevented = false;
|
|
12
|
+
// Mouse Event botton property, it's used in 3rd lib, like react-router. default 0 in general
|
|
13
|
+
this.button = 0;
|
|
14
|
+
// timestamp can either be hi-res ( relative to page load) or low-res (relative to UNIX epoch)
|
|
15
|
+
// here use hi-res timestamp
|
|
16
|
+
this.timeStamp = Date.now();
|
|
17
|
+
this.type = type.toLowerCase();
|
|
18
|
+
this.mpEvent = event;
|
|
19
|
+
this.bubbles = Boolean(opts && opts.bubbles);
|
|
20
|
+
this.cancelable = Boolean(opts && opts.cancelable);
|
|
21
|
+
}
|
|
22
|
+
stopPropagation() {
|
|
23
|
+
this._stop = true;
|
|
24
|
+
}
|
|
25
|
+
stopImmediatePropagation() {
|
|
26
|
+
this._end = this._stop = true;
|
|
27
|
+
}
|
|
28
|
+
preventDefault() {
|
|
29
|
+
this.defaultPrevented = true;
|
|
30
|
+
}
|
|
31
|
+
get target() {
|
|
32
|
+
var _a, _b, _c, _d, _e;
|
|
33
|
+
const cacheTarget = this.cacheTarget;
|
|
34
|
+
if (!cacheTarget) {
|
|
35
|
+
const target = Object.create(((_a = this.mpEvent) === null || _a === void 0 ? void 0 : _a.target) || null);
|
|
36
|
+
const currentEle = env.document.getElementById(((_b = target.dataset) === null || _b === void 0 ? void 0 : _b.sid) || target.id || null);
|
|
37
|
+
// Note:优先判断冒泡场景alipay的targetDataset的sid, 不然冒泡场景target属性吐出不对,其余拿取当前绑定id
|
|
38
|
+
const element = env.document.getElementById(((_c = target.targetDataset) === null || _c === void 0 ? void 0 : _c.sid) || ((_d = target.dataset) === null || _d === void 0 ? void 0 : _d.sid) || target.id || null);
|
|
39
|
+
target.dataset = Object.assign(Object.assign({}, (currentEle !== null ? currentEle.dataset : EMPTY_OBJ)), (element !== null ? element.dataset : EMPTY_OBJ));
|
|
40
|
+
for (const key in (_e = this.mpEvent) === null || _e === void 0 ? void 0 : _e.detail) {
|
|
41
|
+
target[key] = this.mpEvent.detail[key];
|
|
42
|
+
}
|
|
43
|
+
this.cacheTarget = target;
|
|
44
|
+
return target;
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
return cacheTarget;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
get currentTarget() {
|
|
51
|
+
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
52
|
+
const cacheCurrentTarget = this.cacheCurrentTarget;
|
|
53
|
+
if (!cacheCurrentTarget) {
|
|
54
|
+
const doc = env.document;
|
|
55
|
+
const currentTarget = Object.create(((_a = this.mpEvent) === null || _a === void 0 ? void 0 : _a.currentTarget) || null);
|
|
56
|
+
const element = doc.getElementById(((_b = currentTarget.dataset) === null || _b === void 0 ? void 0 : _b.sid) || currentTarget.id || null);
|
|
57
|
+
const targetElement = doc.getElementById(((_e = (_d = (_c = this.mpEvent) === null || _c === void 0 ? void 0 : _c.target) === null || _d === void 0 ? void 0 : _d.dataset) === null || _e === void 0 ? void 0 : _e.sid) || ((_g = (_f = this.mpEvent) === null || _f === void 0 ? void 0 : _f.target) === null || _g === void 0 ? void 0 : _g.id) || null);
|
|
58
|
+
if (element === null || (element && element === targetElement)) {
|
|
59
|
+
this.cacheCurrentTarget = this.target;
|
|
60
|
+
return this.target;
|
|
61
|
+
}
|
|
62
|
+
currentTarget.dataset = element.dataset;
|
|
63
|
+
for (const key in (_h = this.mpEvent) === null || _h === void 0 ? void 0 : _h.detail) {
|
|
64
|
+
currentTarget[key] = this.mpEvent.detail[key];
|
|
65
|
+
}
|
|
66
|
+
this.cacheCurrentTarget = currentTarget;
|
|
67
|
+
return currentTarget;
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
return cacheCurrentTarget;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
function createEvent(event, node) {
|
|
75
|
+
if (typeof event === 'string') {
|
|
76
|
+
// For Vue3 using document.createEvent
|
|
77
|
+
return new TaroEvent(event, { bubbles: true, cancelable: true });
|
|
78
|
+
}
|
|
79
|
+
const domEv = new TaroEvent(event.type, { bubbles: true, cancelable: true }, event);
|
|
80
|
+
for (const key in event) {
|
|
81
|
+
if (key === CURRENT_TARGET || key === TARGET || key === TYPE || key === TIME_STAMP) {
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
domEv[key] = event[key];
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
if (domEv.type === CONFIRM && (node === null || node === void 0 ? void 0 : node.nodeName) === INPUT) {
|
|
89
|
+
// eslint-disable-next-line dot-notation
|
|
90
|
+
domEv[KEY_CODE] = 13;
|
|
91
|
+
}
|
|
92
|
+
return domEv;
|
|
93
|
+
}
|
|
94
|
+
const eventsBatch = {};
|
|
95
|
+
function getEventCBResult(event) {
|
|
96
|
+
const result = event[EVENT_CALLBACK_RESULT];
|
|
97
|
+
if (!isUndefined(result)) {
|
|
98
|
+
delete event[EVENT_CALLBACK_RESULT];
|
|
99
|
+
}
|
|
100
|
+
return result;
|
|
101
|
+
}
|
|
102
|
+
// 小程序的事件代理回调函数
|
|
103
|
+
function eventHandler(event) {
|
|
104
|
+
var _a, _b;
|
|
105
|
+
// Note: ohos 上事件没有设置 type、detail 类型 setter 方法,且部分事件(例如 load 等)缺失 target 导致事件错误
|
|
106
|
+
event.type === undefined && Object.defineProperty(event, 'type', {
|
|
107
|
+
value: event._type // ohos only
|
|
108
|
+
});
|
|
109
|
+
event.detail === undefined && Object.defineProperty(event, 'detail', {
|
|
110
|
+
value: event._detail || Object.assign({}, event) // ohos only
|
|
111
|
+
});
|
|
112
|
+
event.currentTarget = event.currentTarget || event.target || Object.assign({}, event);
|
|
113
|
+
hooks.call('modifyMpEventImpl', event);
|
|
114
|
+
const currentTarget = event.currentTarget;
|
|
115
|
+
const id = ((_a = currentTarget.dataset) === null || _a === void 0 ? void 0 : _a.sid /** sid */) || currentTarget.id /** uid */ || ((_b = event.detail) === null || _b === void 0 ? void 0 : _b.id) || '';
|
|
116
|
+
const node = env.document.getElementById(id);
|
|
117
|
+
if (node) {
|
|
118
|
+
const dispatch = () => {
|
|
119
|
+
const e = createEvent(event, node);
|
|
120
|
+
hooks.call('modifyTaroEvent', e, node);
|
|
121
|
+
hooks.call('dispatchTaroEvent', e, node);
|
|
122
|
+
hooks.call('dispatchTaroEventFinish', e, node);
|
|
123
|
+
};
|
|
124
|
+
if (hooks.isExist('batchedEventUpdates')) {
|
|
125
|
+
const type = event.type;
|
|
126
|
+
if (!hooks.call('isBubbleEvents', type) ||
|
|
127
|
+
!isParentBinded(node, type) ||
|
|
128
|
+
(type === TOUCHMOVE && !!node.props.catchMove)) {
|
|
129
|
+
// 最上层组件统一 batchUpdate
|
|
130
|
+
hooks.call('batchedEventUpdates', () => {
|
|
131
|
+
if (eventsBatch[type]) {
|
|
132
|
+
eventsBatch[type].forEach(fn => fn());
|
|
133
|
+
delete eventsBatch[type];
|
|
134
|
+
}
|
|
135
|
+
dispatch();
|
|
136
|
+
});
|
|
137
|
+
return getEventCBResult(event);
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
// 如果上层组件也有绑定同类型的组件,委托给上层组件调用事件回调
|
|
141
|
+
(eventsBatch[type] || (eventsBatch[type] = [])).push(dispatch);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
dispatch();
|
|
146
|
+
return getEventCBResult(event);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
export { TaroEvent, createEvent, eventHandler };
|
|
152
|
+
//# sourceMappingURL=event.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event.js","sources":["../../src/dom/event.ts"],"sourcesContent":["import { EMPTY_OBJ, hooks, isUndefined } from '@tarojs/shared'\n\nimport {\n CONFIRM,\n CURRENT_TARGET,\n EVENT_CALLBACK_RESULT,\n INPUT,\n KEY_CODE,\n TARGET,\n TIME_STAMP,\n TOUCHMOVE,\n TYPE\n} from '../constants'\nimport env from '../env'\nimport { isParentBinded } 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 // 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(target.targetDataset?.sid || target.dataset?.sid || target.id || null)\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(this.mpEvent?.target?.dataset?.sid as string || this.mpEvent?.target?.id as string || null)\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 // eslint-disable-next-line dot-notation\n domEv[KEY_CODE] = 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 // Note: ohos 上事件没有设置 type、detail 类型 setter 方法,且部分事件(例如 load 等)缺失 target 导致事件错误\n event.type === undefined && Object.defineProperty(event, 'type', {\n value: (event as any)._type // ohos only\n })\n event.detail === undefined && Object.defineProperty(event, 'detail', {\n value: (event as any)._detail || { ...event } // ohos only\n })\n event.currentTarget = event.currentTarget || event.target || { ...event }\n hooks.call('modifyMpEventImpl', event)\n\n const currentTarget = event.currentTarget\n const id = currentTarget.dataset?.sid as string /** sid */ || currentTarget.id /** uid */ || event.detail?.id as string || ''\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 !isParentBinded(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"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { TaroElement } from "./element.js";
|
|
2
|
+
import { TaroEvent } from "./event.js";
|
|
3
|
+
declare class FormElement extends TaroElement {
|
|
4
|
+
get type(): string;
|
|
5
|
+
set type(val: string);
|
|
6
|
+
get value(): string | boolean | number | any[];
|
|
7
|
+
set value(val: string | boolean | number | any[]);
|
|
8
|
+
dispatchEvent(event: TaroEvent): boolean;
|
|
9
|
+
}
|
|
10
|
+
export { FormElement };
|
package/dist/dom/form.js
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { TYPE, VALUE, CHANGE, INPUT } from '../constants/index.js';
|
|
2
|
+
import { TaroElement } from './element.js';
|
|
3
|
+
|
|
4
|
+
class FormElement extends TaroElement {
|
|
5
|
+
get type() {
|
|
6
|
+
var _a;
|
|
7
|
+
return (_a = this.props[TYPE]) !== null && _a !== void 0 ? _a : '';
|
|
8
|
+
}
|
|
9
|
+
set type(val) {
|
|
10
|
+
this.setAttribute(TYPE, val);
|
|
11
|
+
}
|
|
12
|
+
get value() {
|
|
13
|
+
// eslint-disable-next-line dot-notation
|
|
14
|
+
const val = this.props[VALUE];
|
|
15
|
+
return val == null ? '' : val;
|
|
16
|
+
}
|
|
17
|
+
set value(val) {
|
|
18
|
+
this.setAttribute(VALUE, val);
|
|
19
|
+
}
|
|
20
|
+
dispatchEvent(event) {
|
|
21
|
+
if (event.mpEvent) {
|
|
22
|
+
const val = event.mpEvent.detail.value;
|
|
23
|
+
if (event.type === CHANGE) {
|
|
24
|
+
this.props.value = val;
|
|
25
|
+
}
|
|
26
|
+
else if (event.type === INPUT) {
|
|
27
|
+
// Web 规范中表单组件的 value 应该跟着输入改变
|
|
28
|
+
// 只是改 this.props.value 的话不会进行 setData,因此这里修改 this.value。
|
|
29
|
+
// 只测试了 React、Vue3 input 组件的 onInput 事件,onChange 事件不确定有没有副作用,所以暂不修改。
|
|
30
|
+
this.value = val;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return super.dispatchEvent(event);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export { FormElement };
|
|
38
|
+
//# sourceMappingURL=form.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"form.js","sources":["../../src/dom/form.ts"],"sourcesContent":["import {\n CHANGE,\n INPUT,\n TYPE,\n VALUE\n} 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 // eslint-disable-next-line dot-notation\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"],"names":[],"mappings":";;;AAUM,MAAO,WAAY,SAAQ,WAAW,CAAA;AAC1C,IAAA,IAAW,IAAI,GAAA;;QACb,OAAO,CAAA,EAAA,GAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAI,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,EAAA,GAAA,EAAE,CAAA;KAC9B;IAED,IAAW,IAAI,CAAE,GAAW,EAAA;AAC1B,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;KAC7B;AAED,IAAA,IAAW,KAAK,GAAA;;QAEd,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;QAC7B,OAAO,GAAG,IAAI,IAAI,GAAG,EAAE,GAAG,GAAG,CAAA;KAC9B;IAED,IAAW,KAAK,CAAE,GAAsC,EAAA;AACtD,QAAA,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;KAC9B;AAEM,IAAA,aAAa,CAAE,KAAgB,EAAA;AACpC,QAAA,IAAI,KAAK,CAAC,OAAO,EAAE;YACjB,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAA;AACtC,YAAA,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE;AACzB,gBAAA,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,GAAa,CAAA;aACjC;AAAM,iBAAA,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,EAAE;;;;AAI/B,gBAAA,IAAI,CAAC,KAAK,GAAG,GAAa,CAAA;aAC3B;SACF;AAED,QAAA,OAAO,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,CAAA;KAClC;AACF;;;;"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { TaroEventTarget } from "./event-target.js";
|
|
2
|
+
import { NodeType } from "../node_types-9ac5b4dd.js";
|
|
3
|
+
import { TFunc, UpdatePayload } from "../index-26658829.js";
|
|
4
|
+
import { TaroDocument } from "./document.js";
|
|
5
|
+
import { TaroElement } from "./element.js";
|
|
6
|
+
import { TaroRootElement } from "./root.js";
|
|
7
|
+
interface RemoveChildOptions {
|
|
8
|
+
cleanRef?: boolean;
|
|
9
|
+
doUpdate?: boolean;
|
|
10
|
+
}
|
|
11
|
+
declare class TaroNode extends TaroEventTarget {
|
|
12
|
+
uid: string;
|
|
13
|
+
sid: string;
|
|
14
|
+
nodeType: NodeType;
|
|
15
|
+
nodeName: string;
|
|
16
|
+
parentNode: TaroNode | null;
|
|
17
|
+
childNodes: TaroNode[];
|
|
18
|
+
constructor();
|
|
19
|
+
private hydrate;
|
|
20
|
+
private updateChildNodes;
|
|
21
|
+
private updateSingleChild;
|
|
22
|
+
get _root(): TaroRootElement | null;
|
|
23
|
+
protected findIndex(refChild: TaroNode): number;
|
|
24
|
+
get _path(): string;
|
|
25
|
+
get nextSibling(): TaroNode | null;
|
|
26
|
+
get previousSibling(): TaroNode | null;
|
|
27
|
+
get parentElement(): TaroElement | null;
|
|
28
|
+
get firstChild(): TaroNode | null;
|
|
29
|
+
get lastChild(): TaroNode | null;
|
|
30
|
+
/**
|
|
31
|
+
* @textContent 目前只能置空子元素
|
|
32
|
+
* @TODO 等待完整 innerHTML 实现
|
|
33
|
+
*/
|
|
34
|
+
set textContent(text: string);
|
|
35
|
+
/**
|
|
36
|
+
* @doc https://developer.mozilla.org/zh-CN/docs/Web/API/Node/insertBefore
|
|
37
|
+
* @scenario
|
|
38
|
+
* [A,B,C]
|
|
39
|
+
* 1. insert D before C, D has no parent
|
|
40
|
+
* 2. insert D before C, D has the same parent of C
|
|
41
|
+
* 3. insert D before C, D has the different parent of C
|
|
42
|
+
*/
|
|
43
|
+
/**
|
|
44
|
+
* @doc https://developer.mozilla.org/zh-CN/docs/Web/API/Node/insertBefore
|
|
45
|
+
* @scenario
|
|
46
|
+
* [A,B,C]
|
|
47
|
+
* 1. insert D before C, D has no parent
|
|
48
|
+
* 2. insert D before C, D has the same parent of C
|
|
49
|
+
* 3. insert D before C, D has the different parent of C
|
|
50
|
+
*/
|
|
51
|
+
insertBefore<T extends TaroNode>(newChild: T, refChild?: TaroNode | null, isReplace?: boolean): T;
|
|
52
|
+
/**
|
|
53
|
+
* @doc https://developer.mozilla.org/zh-CN/docs/Web/API/Node/appendChild
|
|
54
|
+
* @scenario
|
|
55
|
+
* [A,B,C]
|
|
56
|
+
* 1. append C, C has no parent
|
|
57
|
+
* 2. append C, C has the same parent of B
|
|
58
|
+
* 3. append C, C has the different parent of B
|
|
59
|
+
*/
|
|
60
|
+
/**
|
|
61
|
+
* @doc https://developer.mozilla.org/zh-CN/docs/Web/API/Node/appendChild
|
|
62
|
+
* @scenario
|
|
63
|
+
* [A,B,C]
|
|
64
|
+
* 1. append C, C has no parent
|
|
65
|
+
* 2. append C, C has the same parent of B
|
|
66
|
+
* 3. append C, C has the different parent of B
|
|
67
|
+
*/
|
|
68
|
+
appendChild(newChild: TaroNode): TaroNode;
|
|
69
|
+
/**
|
|
70
|
+
* @doc https://developer.mozilla.org/zh-CN/docs/Web/API/Node/replaceChild
|
|
71
|
+
* @scenario
|
|
72
|
+
* [A,B,C]
|
|
73
|
+
* 1. replace B with C, C has no parent
|
|
74
|
+
* 2. replace B with C, C has no parent, C has the same parent of B
|
|
75
|
+
* 3. replace B with C, C has no parent, C has the different parent of B
|
|
76
|
+
*/
|
|
77
|
+
/**
|
|
78
|
+
* @doc https://developer.mozilla.org/zh-CN/docs/Web/API/Node/replaceChild
|
|
79
|
+
* @scenario
|
|
80
|
+
* [A,B,C]
|
|
81
|
+
* 1. replace B with C, C has no parent
|
|
82
|
+
* 2. replace B with C, C has no parent, C has the same parent of B
|
|
83
|
+
* 3. replace B with C, C has no parent, C has the different parent of B
|
|
84
|
+
*/
|
|
85
|
+
replaceChild(newChild: TaroNode, oldChild: TaroNode): TaroNode | undefined;
|
|
86
|
+
/**
|
|
87
|
+
* @doc https://developer.mozilla.org/zh-CN/docs/Web/API/Node/removeChild
|
|
88
|
+
* @scenario
|
|
89
|
+
* [A,B,C]
|
|
90
|
+
* 1. remove A or B
|
|
91
|
+
* 2. remove C
|
|
92
|
+
*/
|
|
93
|
+
/**
|
|
94
|
+
* @doc https://developer.mozilla.org/zh-CN/docs/Web/API/Node/removeChild
|
|
95
|
+
* @scenario
|
|
96
|
+
* [A,B,C]
|
|
97
|
+
* 1. remove A or B
|
|
98
|
+
* 2. remove C
|
|
99
|
+
*/
|
|
100
|
+
removeChild<T extends TaroNode>(child: T, options?: RemoveChildOptions): T;
|
|
101
|
+
remove(options?: RemoveChildOptions): void;
|
|
102
|
+
hasChildNodes(): boolean;
|
|
103
|
+
enqueueUpdate(payload: UpdatePayload): void;
|
|
104
|
+
get ownerDocument(): TaroDocument;
|
|
105
|
+
static extend(methodName: string, options: TFunc | Record<string, any>): void;
|
|
106
|
+
}
|
|
107
|
+
export { TaroNode };
|
package/dist/dom/node.js
ADDED
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
import { ensure, hooks } from '@tarojs/shared';
|
|
2
|
+
import { DOCUMENT_FRAGMENT } from '../constants/index.js';
|
|
3
|
+
import { MutationObserver } from '../dom-external/mutation-observer/index.js';
|
|
4
|
+
import env from '../env.js';
|
|
5
|
+
import { hydrate } from '../hydrate.js';
|
|
6
|
+
import { incrementId, isComment, extend } from '../utils/index.js';
|
|
7
|
+
import { eventSource } from './event-source.js';
|
|
8
|
+
import { TaroEventTarget } from './event-target.js';
|
|
9
|
+
|
|
10
|
+
const CHILDNODES = "cn" /* Shortcuts.Childnodes */;
|
|
11
|
+
const nodeId = incrementId();
|
|
12
|
+
class TaroNode extends TaroEventTarget {
|
|
13
|
+
constructor() {
|
|
14
|
+
super();
|
|
15
|
+
this.parentNode = null;
|
|
16
|
+
this.childNodes = [];
|
|
17
|
+
this.hydrate = (node) => () => hydrate(node);
|
|
18
|
+
this.uid = '_' + nodeId(); // dom 节点 id,开发者可修改
|
|
19
|
+
this.sid = this.uid; // dom 节点全局唯一 id,不可被修改
|
|
20
|
+
eventSource.set(this.sid, this);
|
|
21
|
+
}
|
|
22
|
+
updateChildNodes(isClean) {
|
|
23
|
+
const cleanChildNodes = () => [];
|
|
24
|
+
const rerenderChildNodes = () => {
|
|
25
|
+
const childNodes = this.childNodes.filter(node => !isComment(node));
|
|
26
|
+
return childNodes.map(hydrate);
|
|
27
|
+
};
|
|
28
|
+
this.enqueueUpdate({
|
|
29
|
+
path: `${this._path}.${CHILDNODES}`,
|
|
30
|
+
value: isClean ? cleanChildNodes : rerenderChildNodes
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
updateSingleChild(index) {
|
|
34
|
+
this.childNodes.forEach((child, childIndex) => {
|
|
35
|
+
if (isComment(child))
|
|
36
|
+
return;
|
|
37
|
+
if (index && childIndex < index)
|
|
38
|
+
return;
|
|
39
|
+
this.enqueueUpdate({
|
|
40
|
+
path: child._path,
|
|
41
|
+
value: this.hydrate(child)
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
get _root() {
|
|
46
|
+
var _a;
|
|
47
|
+
return ((_a = this.parentNode) === null || _a === void 0 ? void 0 : _a._root) || null;
|
|
48
|
+
}
|
|
49
|
+
findIndex(refChild) {
|
|
50
|
+
const index = this.childNodes.indexOf(refChild);
|
|
51
|
+
ensure(index !== -1, 'The node to be replaced is not a child of this node.');
|
|
52
|
+
return index;
|
|
53
|
+
}
|
|
54
|
+
get _path() {
|
|
55
|
+
const parentNode = this.parentNode;
|
|
56
|
+
if (parentNode) {
|
|
57
|
+
// 计算路径时,先过滤掉 comment 节点
|
|
58
|
+
const list = parentNode.childNodes.filter(node => !isComment(node));
|
|
59
|
+
const indexOfNode = list.indexOf(this);
|
|
60
|
+
const index = hooks.call('getPathIndex', indexOfNode);
|
|
61
|
+
return `${parentNode._path}.${CHILDNODES}.${index}`;
|
|
62
|
+
}
|
|
63
|
+
return '';
|
|
64
|
+
}
|
|
65
|
+
get nextSibling() {
|
|
66
|
+
const parentNode = this.parentNode;
|
|
67
|
+
return (parentNode === null || parentNode === void 0 ? void 0 : parentNode.childNodes[parentNode.findIndex(this) + 1]) || null;
|
|
68
|
+
}
|
|
69
|
+
get previousSibling() {
|
|
70
|
+
const parentNode = this.parentNode;
|
|
71
|
+
return (parentNode === null || parentNode === void 0 ? void 0 : parentNode.childNodes[parentNode.findIndex(this) - 1]) || null;
|
|
72
|
+
}
|
|
73
|
+
get parentElement() {
|
|
74
|
+
const parentNode = this.parentNode;
|
|
75
|
+
if ((parentNode === null || parentNode === void 0 ? void 0 : parentNode.nodeType) === 1 /* NodeType.ELEMENT_NODE */) {
|
|
76
|
+
return parentNode;
|
|
77
|
+
}
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
get firstChild() {
|
|
81
|
+
return this.childNodes[0] || null;
|
|
82
|
+
}
|
|
83
|
+
get lastChild() {
|
|
84
|
+
const childNodes = this.childNodes;
|
|
85
|
+
return childNodes[childNodes.length - 1] || null;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* @textContent 目前只能置空子元素
|
|
89
|
+
* @TODO 等待完整 innerHTML 实现
|
|
90
|
+
*/
|
|
91
|
+
// eslint-disable-next-line accessor-pairs
|
|
92
|
+
set textContent(text) {
|
|
93
|
+
const removedNodes = this.childNodes.slice();
|
|
94
|
+
const addedNodes = [];
|
|
95
|
+
// Handle old children' data structure & ref
|
|
96
|
+
while (this.firstChild) {
|
|
97
|
+
this.removeChild(this.firstChild, { doUpdate: false });
|
|
98
|
+
}
|
|
99
|
+
if (text === '') {
|
|
100
|
+
this.updateChildNodes(true);
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
const newText = env.document.createTextNode(text);
|
|
104
|
+
addedNodes.push(newText);
|
|
105
|
+
this.appendChild(newText);
|
|
106
|
+
this.updateChildNodes();
|
|
107
|
+
}
|
|
108
|
+
// @Todo: appendChild 会多触发一次
|
|
109
|
+
MutationObserver.record({
|
|
110
|
+
type: "childList" /* MutationRecordType.CHILD_LIST */,
|
|
111
|
+
target: this,
|
|
112
|
+
removedNodes,
|
|
113
|
+
addedNodes
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* @doc https://developer.mozilla.org/zh-CN/docs/Web/API/Node/insertBefore
|
|
118
|
+
* @scenario
|
|
119
|
+
* [A,B,C]
|
|
120
|
+
* 1. insert D before C, D has no parent
|
|
121
|
+
* 2. insert D before C, D has the same parent of C
|
|
122
|
+
* 3. insert D before C, D has the different parent of C
|
|
123
|
+
*/
|
|
124
|
+
insertBefore(newChild, refChild, isReplace) {
|
|
125
|
+
if (newChild.nodeName === DOCUMENT_FRAGMENT) {
|
|
126
|
+
newChild.childNodes.reduceRight((previousValue, currentValue) => {
|
|
127
|
+
this.insertBefore(currentValue, previousValue);
|
|
128
|
+
return currentValue;
|
|
129
|
+
}, refChild);
|
|
130
|
+
return newChild;
|
|
131
|
+
}
|
|
132
|
+
// Parent release newChild
|
|
133
|
+
// - cleanRef: false (No need to clean eventSource, because newChild is about to be inserted)
|
|
134
|
+
// - update: true (Need to update parent.childNodes, because parent.childNodes is reordered)
|
|
135
|
+
newChild.remove({ cleanRef: false });
|
|
136
|
+
let index = 0;
|
|
137
|
+
// Data structure
|
|
138
|
+
newChild.parentNode = this;
|
|
139
|
+
if (refChild) {
|
|
140
|
+
// insertBefore & replaceChild
|
|
141
|
+
index = this.findIndex(refChild);
|
|
142
|
+
this.childNodes.splice(index, 0, newChild);
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
// appendChild
|
|
146
|
+
this.childNodes.push(newChild);
|
|
147
|
+
}
|
|
148
|
+
const childNodesLength = this.childNodes.length;
|
|
149
|
+
// Serialization
|
|
150
|
+
if (this._root) {
|
|
151
|
+
if (!refChild) {
|
|
152
|
+
// appendChild
|
|
153
|
+
const isOnlyChild = childNodesLength === 1;
|
|
154
|
+
if (isOnlyChild) {
|
|
155
|
+
this.updateChildNodes();
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
this.enqueueUpdate({
|
|
159
|
+
path: newChild._path,
|
|
160
|
+
value: this.hydrate(newChild)
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
else if (isReplace) {
|
|
165
|
+
// replaceChild
|
|
166
|
+
this.enqueueUpdate({
|
|
167
|
+
path: newChild._path,
|
|
168
|
+
value: this.hydrate(newChild)
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
// insertBefore 有两种更新模式
|
|
173
|
+
// 比方说有 A B C 三个节点,现在要在 C 前插入 D
|
|
174
|
+
// 1. 插入 D,然后更新整个父节点的 childNodes 数组
|
|
175
|
+
// setData({ cn: [A, B, D, C] })
|
|
176
|
+
// 2. 插入 D,然后更新 D 以及 D 之后每个节点的数据
|
|
177
|
+
// setData ({
|
|
178
|
+
// cn.[2]: D,
|
|
179
|
+
// cn.[3]: C,
|
|
180
|
+
// })
|
|
181
|
+
// 由于微信解析 ’cn.[2]‘ 这些路径的时候也需要消耗时间,
|
|
182
|
+
// 所以根据 insertBefore 插入的位置来做不同的处理
|
|
183
|
+
const mark = childNodesLength * 2 / 3;
|
|
184
|
+
if (mark > index) {
|
|
185
|
+
// 如果 insertBefore 的位置在 childNodes 的 2/3 前,则为了避免解析路径消耗过多的时间,采用第一种方式
|
|
186
|
+
this.updateChildNodes();
|
|
187
|
+
}
|
|
188
|
+
else {
|
|
189
|
+
// 如果 insertBefore 的位置在 childNodes 的 2/3 之后,则采用第二种方式,避免 childNodes 的全量更新
|
|
190
|
+
this.updateSingleChild(index);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
MutationObserver.record({
|
|
195
|
+
type: "childList" /* MutationRecordType.CHILD_LIST */,
|
|
196
|
+
target: this,
|
|
197
|
+
addedNodes: [newChild],
|
|
198
|
+
removedNodes: isReplace
|
|
199
|
+
? [refChild] /** replaceChild */
|
|
200
|
+
: [],
|
|
201
|
+
nextSibling: isReplace
|
|
202
|
+
? refChild.nextSibling /** replaceChild */
|
|
203
|
+
: (refChild || null), /** insertBefore & appendChild */
|
|
204
|
+
previousSibling: newChild.previousSibling
|
|
205
|
+
});
|
|
206
|
+
return newChild;
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* @doc https://developer.mozilla.org/zh-CN/docs/Web/API/Node/appendChild
|
|
210
|
+
* @scenario
|
|
211
|
+
* [A,B,C]
|
|
212
|
+
* 1. append C, C has no parent
|
|
213
|
+
* 2. append C, C has the same parent of B
|
|
214
|
+
* 3. append C, C has the different parent of B
|
|
215
|
+
*/
|
|
216
|
+
appendChild(newChild) {
|
|
217
|
+
return this.insertBefore(newChild);
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* @doc https://developer.mozilla.org/zh-CN/docs/Web/API/Node/replaceChild
|
|
221
|
+
* @scenario
|
|
222
|
+
* [A,B,C]
|
|
223
|
+
* 1. replace B with C, C has no parent
|
|
224
|
+
* 2. replace B with C, C has no parent, C has the same parent of B
|
|
225
|
+
* 3. replace B with C, C has no parent, C has the different parent of B
|
|
226
|
+
*/
|
|
227
|
+
replaceChild(newChild, oldChild) {
|
|
228
|
+
if (oldChild.parentNode !== this)
|
|
229
|
+
return;
|
|
230
|
+
// Insert the newChild
|
|
231
|
+
this.insertBefore(newChild, oldChild, true);
|
|
232
|
+
// Destroy the oldChild
|
|
233
|
+
// - cleanRef: true (Need to clean eventSource, because the oldChild was detached from the DOM tree)
|
|
234
|
+
// - update: false (No need to update parent.childNodes, because replace will not cause the parent.childNodes being reordered)
|
|
235
|
+
oldChild.remove({ doUpdate: false });
|
|
236
|
+
return oldChild;
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* @doc https://developer.mozilla.org/zh-CN/docs/Web/API/Node/removeChild
|
|
240
|
+
* @scenario
|
|
241
|
+
* [A,B,C]
|
|
242
|
+
* 1. remove A or B
|
|
243
|
+
* 2. remove C
|
|
244
|
+
*/
|
|
245
|
+
removeChild(child, options = {}) {
|
|
246
|
+
const { cleanRef, doUpdate } = options;
|
|
247
|
+
if (cleanRef !== false && doUpdate !== false) {
|
|
248
|
+
// appendChild/replaceChild/insertBefore 不应该触发
|
|
249
|
+
// @Todo: 但其实如果 newChild 的父节点是另一颗子树的节点,应该是要触发的
|
|
250
|
+
MutationObserver.record({
|
|
251
|
+
type: "childList" /* MutationRecordType.CHILD_LIST */,
|
|
252
|
+
target: this,
|
|
253
|
+
removedNodes: [child],
|
|
254
|
+
nextSibling: child.nextSibling,
|
|
255
|
+
previousSibling: child.previousSibling
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
// Data Structure
|
|
259
|
+
const index = this.findIndex(child);
|
|
260
|
+
this.childNodes.splice(index, 1);
|
|
261
|
+
child.parentNode = null;
|
|
262
|
+
// Set eventSource
|
|
263
|
+
if (cleanRef !== false) {
|
|
264
|
+
eventSource.removeNodeTree(child);
|
|
265
|
+
}
|
|
266
|
+
// Serialization
|
|
267
|
+
if (this._root && doUpdate !== false) {
|
|
268
|
+
this.updateChildNodes();
|
|
269
|
+
}
|
|
270
|
+
return child;
|
|
271
|
+
}
|
|
272
|
+
remove(options) {
|
|
273
|
+
var _a;
|
|
274
|
+
(_a = this.parentNode) === null || _a === void 0 ? void 0 : _a.removeChild(this, options);
|
|
275
|
+
}
|
|
276
|
+
hasChildNodes() {
|
|
277
|
+
return this.childNodes.length > 0;
|
|
278
|
+
}
|
|
279
|
+
enqueueUpdate(payload) {
|
|
280
|
+
var _a;
|
|
281
|
+
(_a = this._root) === null || _a === void 0 ? void 0 : _a.enqueueUpdate(payload);
|
|
282
|
+
}
|
|
283
|
+
get ownerDocument() {
|
|
284
|
+
return env.document;
|
|
285
|
+
}
|
|
286
|
+
static extend(methodName, options) {
|
|
287
|
+
extend(TaroNode, methodName, options);
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
export { TaroNode };
|
|
292
|
+
//# sourceMappingURL=node.js.map
|