@elementor/frontend-handlers 3.35.0-325 → 3.35.0-326
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/dist/index.d.mts +14 -2
- package/dist/index.d.ts +14 -2
- package/dist/index.js +95 -22
- package/dist/index.mjs +92 -21
- package/package.json +1 -1
- package/src/__tests__/index.test.ts +3 -3
- package/src/handlers-registry.ts +57 -13
- package/src/index.ts +1 -1
- package/src/init.ts +17 -1
- package/src/lifecycle-events.ts +54 -11
package/dist/index.d.mts
CHANGED
|
@@ -4,12 +4,15 @@ interface ListenToChildrenAPI {
|
|
|
4
4
|
render: (callback: ChildRenderCallback) => void;
|
|
5
5
|
}
|
|
6
6
|
type ListenToChildrenFunction = (elementTypes: string[]) => ListenToChildrenAPI;
|
|
7
|
-
type
|
|
7
|
+
type SharedHandlerParams<TSettings extends Settings = Settings> = {
|
|
8
8
|
element: Element;
|
|
9
9
|
signal: AbortSignal;
|
|
10
10
|
settings: TSettings;
|
|
11
|
+
};
|
|
12
|
+
type Handler = <TSettings extends Settings = Settings>(params: SharedHandlerParams<TSettings> & {
|
|
11
13
|
listenToChildren: ListenToChildrenFunction;
|
|
12
14
|
}) => (() => void) | undefined;
|
|
15
|
+
type SelectorHandler = <TSettings extends Settings = Settings>(params: SharedHandlerParams<TSettings>) => (() => void) | undefined;
|
|
13
16
|
declare const register: ({ elementType, id, callback }: {
|
|
14
17
|
elementType: string;
|
|
15
18
|
id: string;
|
|
@@ -19,7 +22,16 @@ declare const unregister: ({ elementType, id }: {
|
|
|
19
22
|
elementType: string;
|
|
20
23
|
id?: string;
|
|
21
24
|
}) => void;
|
|
25
|
+
declare const registerBySelector: ({ id, selector, callback, }: {
|
|
26
|
+
selector: string;
|
|
27
|
+
id: string;
|
|
28
|
+
callback: SelectorHandler;
|
|
29
|
+
}) => void;
|
|
30
|
+
declare const unregisterBySelector: ({ selector, id }: {
|
|
31
|
+
selector: string;
|
|
32
|
+
id?: string;
|
|
33
|
+
}) => void;
|
|
22
34
|
|
|
23
35
|
declare function init(): void;
|
|
24
36
|
|
|
25
|
-
export { init, register, unregister };
|
|
37
|
+
export { init, register, registerBySelector, unregister, unregisterBySelector };
|
package/dist/index.d.ts
CHANGED
|
@@ -4,12 +4,15 @@ interface ListenToChildrenAPI {
|
|
|
4
4
|
render: (callback: ChildRenderCallback) => void;
|
|
5
5
|
}
|
|
6
6
|
type ListenToChildrenFunction = (elementTypes: string[]) => ListenToChildrenAPI;
|
|
7
|
-
type
|
|
7
|
+
type SharedHandlerParams<TSettings extends Settings = Settings> = {
|
|
8
8
|
element: Element;
|
|
9
9
|
signal: AbortSignal;
|
|
10
10
|
settings: TSettings;
|
|
11
|
+
};
|
|
12
|
+
type Handler = <TSettings extends Settings = Settings>(params: SharedHandlerParams<TSettings> & {
|
|
11
13
|
listenToChildren: ListenToChildrenFunction;
|
|
12
14
|
}) => (() => void) | undefined;
|
|
15
|
+
type SelectorHandler = <TSettings extends Settings = Settings>(params: SharedHandlerParams<TSettings>) => (() => void) | undefined;
|
|
13
16
|
declare const register: ({ elementType, id, callback }: {
|
|
14
17
|
elementType: string;
|
|
15
18
|
id: string;
|
|
@@ -19,7 +22,16 @@ declare const unregister: ({ elementType, id }: {
|
|
|
19
22
|
elementType: string;
|
|
20
23
|
id?: string;
|
|
21
24
|
}) => void;
|
|
25
|
+
declare const registerBySelector: ({ id, selector, callback, }: {
|
|
26
|
+
selector: string;
|
|
27
|
+
id: string;
|
|
28
|
+
callback: SelectorHandler;
|
|
29
|
+
}) => void;
|
|
30
|
+
declare const unregisterBySelector: ({ selector, id }: {
|
|
31
|
+
selector: string;
|
|
32
|
+
id?: string;
|
|
33
|
+
}) => void;
|
|
22
34
|
|
|
23
35
|
declare function init(): void;
|
|
24
36
|
|
|
25
|
-
export { init, register, unregister };
|
|
37
|
+
export { init, register, registerBySelector, unregister, unregisterBySelector };
|
package/dist/index.js
CHANGED
|
@@ -22,36 +22,65 @@ var index_exports = {};
|
|
|
22
22
|
__export(index_exports, {
|
|
23
23
|
init: () => init,
|
|
24
24
|
register: () => register,
|
|
25
|
-
|
|
25
|
+
registerBySelector: () => registerBySelector,
|
|
26
|
+
unregister: () => unregister,
|
|
27
|
+
unregisterBySelector: () => unregisterBySelector
|
|
26
28
|
});
|
|
27
29
|
module.exports = __toCommonJS(index_exports);
|
|
28
30
|
|
|
29
31
|
// src/handlers-registry.ts
|
|
30
|
-
var
|
|
32
|
+
var elementTypeHandlers = /* @__PURE__ */ new Map();
|
|
33
|
+
var elementSelectorHandlers = /* @__PURE__ */ new Map();
|
|
31
34
|
var register = ({ elementType, id, callback }) => {
|
|
32
|
-
if (!
|
|
33
|
-
|
|
35
|
+
if (!elementTypeHandlers.has(elementType)) {
|
|
36
|
+
elementTypeHandlers.set(elementType, /* @__PURE__ */ new Map());
|
|
34
37
|
}
|
|
35
|
-
if (!
|
|
36
|
-
|
|
38
|
+
if (!elementTypeHandlers.get(elementType)?.has(id)) {
|
|
39
|
+
elementTypeHandlers.get(elementType)?.set(id, callback);
|
|
37
40
|
}
|
|
38
41
|
};
|
|
39
42
|
var unregister = ({ elementType, id }) => {
|
|
40
|
-
if (!
|
|
43
|
+
if (!elementTypeHandlers.has(elementType)) {
|
|
41
44
|
return;
|
|
42
45
|
}
|
|
43
46
|
if (id) {
|
|
44
|
-
|
|
45
|
-
if (
|
|
46
|
-
|
|
47
|
+
elementTypeHandlers.get(elementType)?.delete(id);
|
|
48
|
+
if (elementTypeHandlers.get(elementType)?.size === 0) {
|
|
49
|
+
elementTypeHandlers.delete(elementType);
|
|
47
50
|
}
|
|
48
51
|
} else {
|
|
49
|
-
|
|
52
|
+
elementTypeHandlers.delete(elementType);
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
var registerBySelector = ({
|
|
56
|
+
id,
|
|
57
|
+
selector,
|
|
58
|
+
callback
|
|
59
|
+
}) => {
|
|
60
|
+
if (!elementSelectorHandlers.has(selector)) {
|
|
61
|
+
elementSelectorHandlers.set(selector, /* @__PURE__ */ new Map());
|
|
62
|
+
}
|
|
63
|
+
if (!elementSelectorHandlers.get(selector)?.has(id)) {
|
|
64
|
+
elementSelectorHandlers.get(selector)?.set(id, callback);
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
var unregisterBySelector = ({ selector, id }) => {
|
|
68
|
+
if (!elementSelectorHandlers.has(selector)) {
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
if (id) {
|
|
72
|
+
elementTypeHandlers.get(selector)?.delete(id);
|
|
73
|
+
if (elementTypeHandlers.get(selector)?.size === 0) {
|
|
74
|
+
elementTypeHandlers.delete(selector);
|
|
75
|
+
}
|
|
76
|
+
} else {
|
|
77
|
+
elementTypeHandlers.delete(selector);
|
|
50
78
|
}
|
|
51
79
|
};
|
|
52
80
|
|
|
53
81
|
// src/lifecycle-events.ts
|
|
54
|
-
var
|
|
82
|
+
var unmountElementTypeCallbacks = /* @__PURE__ */ new Map();
|
|
83
|
+
var unmountElementSelectorCallbacks = /* @__PURE__ */ new Map();
|
|
55
84
|
var ELEMENT_RENDERED_EVENT_NAME = "elementor/element/rendered";
|
|
56
85
|
var onElementRender = ({
|
|
57
86
|
element,
|
|
@@ -70,10 +99,10 @@ var onElementRender = ({
|
|
|
70
99
|
}
|
|
71
100
|
})
|
|
72
101
|
);
|
|
73
|
-
if (!
|
|
102
|
+
if (!elementTypeHandlers.has(elementType)) {
|
|
74
103
|
return;
|
|
75
104
|
}
|
|
76
|
-
Array.from(
|
|
105
|
+
Array.from(elementTypeHandlers.get(elementType)?.values() ?? []).forEach((handler) => {
|
|
77
106
|
const settings = element.getAttribute("data-e-settings");
|
|
78
107
|
const listenToChildren = (elementTypes) => ({
|
|
79
108
|
render: (callback) => {
|
|
@@ -101,23 +130,53 @@ var onElementRender = ({
|
|
|
101
130
|
manualUnmount.push(unmount);
|
|
102
131
|
}
|
|
103
132
|
});
|
|
104
|
-
if (!
|
|
105
|
-
|
|
133
|
+
if (!unmountElementTypeCallbacks.has(elementType)) {
|
|
134
|
+
unmountElementTypeCallbacks.set(elementType, /* @__PURE__ */ new Map());
|
|
106
135
|
}
|
|
107
|
-
|
|
136
|
+
unmountElementTypeCallbacks.get(elementType)?.set(elementId, () => {
|
|
108
137
|
controller.abort();
|
|
109
138
|
manualUnmount.forEach((callback) => callback());
|
|
110
139
|
});
|
|
111
140
|
};
|
|
141
|
+
var onElementSelectorRender = ({
|
|
142
|
+
element,
|
|
143
|
+
elementId,
|
|
144
|
+
controller
|
|
145
|
+
}) => {
|
|
146
|
+
Array.from(elementSelectorHandlers.entries() ?? []).forEach(([selector, handlers]) => {
|
|
147
|
+
if (!element.matches(selector)) {
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
const manualUnmount = [];
|
|
151
|
+
Array.from(handlers.values() ?? []).forEach((handler) => {
|
|
152
|
+
const settings = element.getAttribute("data-e-settings");
|
|
153
|
+
const unmount = handler({
|
|
154
|
+
element,
|
|
155
|
+
signal: controller.signal,
|
|
156
|
+
settings: settings ? JSON.parse(settings) : {}
|
|
157
|
+
});
|
|
158
|
+
if (typeof unmount === "function") {
|
|
159
|
+
manualUnmount.push(unmount);
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
if (!unmountElementSelectorCallbacks.has(elementId)) {
|
|
163
|
+
unmountElementTypeCallbacks.set(elementId, /* @__PURE__ */ new Map());
|
|
164
|
+
}
|
|
165
|
+
unmountElementSelectorCallbacks.get(elementId)?.set(selector, () => {
|
|
166
|
+
controller.abort();
|
|
167
|
+
manualUnmount.forEach((callback) => callback());
|
|
168
|
+
});
|
|
169
|
+
});
|
|
170
|
+
};
|
|
112
171
|
var onElementDestroy = ({ elementType, elementId }) => {
|
|
113
|
-
const unmount =
|
|
172
|
+
const unmount = unmountElementTypeCallbacks.get(elementType)?.get(elementId);
|
|
114
173
|
if (!unmount) {
|
|
115
174
|
return;
|
|
116
175
|
}
|
|
117
176
|
unmount();
|
|
118
|
-
|
|
119
|
-
if (
|
|
120
|
-
|
|
177
|
+
unmountElementTypeCallbacks.get(elementType)?.delete(elementId);
|
|
178
|
+
if (unmountElementTypeCallbacks.get(elementType)?.size === 0) {
|
|
179
|
+
unmountElementTypeCallbacks.delete(elementType);
|
|
121
180
|
}
|
|
122
181
|
};
|
|
123
182
|
|
|
@@ -135,6 +194,7 @@ function init() {
|
|
|
135
194
|
onElementDestroy({ elementType: type, elementId: id });
|
|
136
195
|
});
|
|
137
196
|
document.addEventListener("DOMContentLoaded", () => {
|
|
197
|
+
const controller = new AbortController();
|
|
138
198
|
document.querySelectorAll("[data-e-type]").forEach((element) => {
|
|
139
199
|
const el = element;
|
|
140
200
|
const { eType, id } = el.dataset;
|
|
@@ -151,12 +211,25 @@ function init() {
|
|
|
151
211
|
})
|
|
152
212
|
);
|
|
153
213
|
});
|
|
214
|
+
Array.from(elementSelectorHandlers.keys()).forEach((selector) => {
|
|
215
|
+
Array.from(document.querySelectorAll(selector)).forEach((element) => {
|
|
216
|
+
const el = element;
|
|
217
|
+
const elementId = el?.closest("[data-id]")?.getAttribute("data-id") ?? "";
|
|
218
|
+
onElementSelectorRender({
|
|
219
|
+
element,
|
|
220
|
+
controller,
|
|
221
|
+
elementId
|
|
222
|
+
});
|
|
223
|
+
});
|
|
224
|
+
});
|
|
154
225
|
});
|
|
155
226
|
}
|
|
156
227
|
// Annotate the CommonJS export names for ESM import in node:
|
|
157
228
|
0 && (module.exports = {
|
|
158
229
|
init,
|
|
159
230
|
register,
|
|
160
|
-
|
|
231
|
+
registerBySelector,
|
|
232
|
+
unregister,
|
|
233
|
+
unregisterBySelector
|
|
161
234
|
});
|
|
162
235
|
//# sourceMappingURL=index.js.map
|
package/dist/index.mjs
CHANGED
|
@@ -1,29 +1,56 @@
|
|
|
1
1
|
// src/handlers-registry.ts
|
|
2
|
-
var
|
|
2
|
+
var elementTypeHandlers = /* @__PURE__ */ new Map();
|
|
3
|
+
var elementSelectorHandlers = /* @__PURE__ */ new Map();
|
|
3
4
|
var register = ({ elementType, id, callback }) => {
|
|
4
|
-
if (!
|
|
5
|
-
|
|
5
|
+
if (!elementTypeHandlers.has(elementType)) {
|
|
6
|
+
elementTypeHandlers.set(elementType, /* @__PURE__ */ new Map());
|
|
6
7
|
}
|
|
7
|
-
if (!
|
|
8
|
-
|
|
8
|
+
if (!elementTypeHandlers.get(elementType)?.has(id)) {
|
|
9
|
+
elementTypeHandlers.get(elementType)?.set(id, callback);
|
|
9
10
|
}
|
|
10
11
|
};
|
|
11
12
|
var unregister = ({ elementType, id }) => {
|
|
12
|
-
if (!
|
|
13
|
+
if (!elementTypeHandlers.has(elementType)) {
|
|
13
14
|
return;
|
|
14
15
|
}
|
|
15
16
|
if (id) {
|
|
16
|
-
|
|
17
|
-
if (
|
|
18
|
-
|
|
17
|
+
elementTypeHandlers.get(elementType)?.delete(id);
|
|
18
|
+
if (elementTypeHandlers.get(elementType)?.size === 0) {
|
|
19
|
+
elementTypeHandlers.delete(elementType);
|
|
19
20
|
}
|
|
20
21
|
} else {
|
|
21
|
-
|
|
22
|
+
elementTypeHandlers.delete(elementType);
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
var registerBySelector = ({
|
|
26
|
+
id,
|
|
27
|
+
selector,
|
|
28
|
+
callback
|
|
29
|
+
}) => {
|
|
30
|
+
if (!elementSelectorHandlers.has(selector)) {
|
|
31
|
+
elementSelectorHandlers.set(selector, /* @__PURE__ */ new Map());
|
|
32
|
+
}
|
|
33
|
+
if (!elementSelectorHandlers.get(selector)?.has(id)) {
|
|
34
|
+
elementSelectorHandlers.get(selector)?.set(id, callback);
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
var unregisterBySelector = ({ selector, id }) => {
|
|
38
|
+
if (!elementSelectorHandlers.has(selector)) {
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
if (id) {
|
|
42
|
+
elementTypeHandlers.get(selector)?.delete(id);
|
|
43
|
+
if (elementTypeHandlers.get(selector)?.size === 0) {
|
|
44
|
+
elementTypeHandlers.delete(selector);
|
|
45
|
+
}
|
|
46
|
+
} else {
|
|
47
|
+
elementTypeHandlers.delete(selector);
|
|
22
48
|
}
|
|
23
49
|
};
|
|
24
50
|
|
|
25
51
|
// src/lifecycle-events.ts
|
|
26
|
-
var
|
|
52
|
+
var unmountElementTypeCallbacks = /* @__PURE__ */ new Map();
|
|
53
|
+
var unmountElementSelectorCallbacks = /* @__PURE__ */ new Map();
|
|
27
54
|
var ELEMENT_RENDERED_EVENT_NAME = "elementor/element/rendered";
|
|
28
55
|
var onElementRender = ({
|
|
29
56
|
element,
|
|
@@ -42,10 +69,10 @@ var onElementRender = ({
|
|
|
42
69
|
}
|
|
43
70
|
})
|
|
44
71
|
);
|
|
45
|
-
if (!
|
|
72
|
+
if (!elementTypeHandlers.has(elementType)) {
|
|
46
73
|
return;
|
|
47
74
|
}
|
|
48
|
-
Array.from(
|
|
75
|
+
Array.from(elementTypeHandlers.get(elementType)?.values() ?? []).forEach((handler) => {
|
|
49
76
|
const settings = element.getAttribute("data-e-settings");
|
|
50
77
|
const listenToChildren = (elementTypes) => ({
|
|
51
78
|
render: (callback) => {
|
|
@@ -73,23 +100,53 @@ var onElementRender = ({
|
|
|
73
100
|
manualUnmount.push(unmount);
|
|
74
101
|
}
|
|
75
102
|
});
|
|
76
|
-
if (!
|
|
77
|
-
|
|
103
|
+
if (!unmountElementTypeCallbacks.has(elementType)) {
|
|
104
|
+
unmountElementTypeCallbacks.set(elementType, /* @__PURE__ */ new Map());
|
|
78
105
|
}
|
|
79
|
-
|
|
106
|
+
unmountElementTypeCallbacks.get(elementType)?.set(elementId, () => {
|
|
80
107
|
controller.abort();
|
|
81
108
|
manualUnmount.forEach((callback) => callback());
|
|
82
109
|
});
|
|
83
110
|
};
|
|
111
|
+
var onElementSelectorRender = ({
|
|
112
|
+
element,
|
|
113
|
+
elementId,
|
|
114
|
+
controller
|
|
115
|
+
}) => {
|
|
116
|
+
Array.from(elementSelectorHandlers.entries() ?? []).forEach(([selector, handlers]) => {
|
|
117
|
+
if (!element.matches(selector)) {
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
const manualUnmount = [];
|
|
121
|
+
Array.from(handlers.values() ?? []).forEach((handler) => {
|
|
122
|
+
const settings = element.getAttribute("data-e-settings");
|
|
123
|
+
const unmount = handler({
|
|
124
|
+
element,
|
|
125
|
+
signal: controller.signal,
|
|
126
|
+
settings: settings ? JSON.parse(settings) : {}
|
|
127
|
+
});
|
|
128
|
+
if (typeof unmount === "function") {
|
|
129
|
+
manualUnmount.push(unmount);
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
if (!unmountElementSelectorCallbacks.has(elementId)) {
|
|
133
|
+
unmountElementTypeCallbacks.set(elementId, /* @__PURE__ */ new Map());
|
|
134
|
+
}
|
|
135
|
+
unmountElementSelectorCallbacks.get(elementId)?.set(selector, () => {
|
|
136
|
+
controller.abort();
|
|
137
|
+
manualUnmount.forEach((callback) => callback());
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
};
|
|
84
141
|
var onElementDestroy = ({ elementType, elementId }) => {
|
|
85
|
-
const unmount =
|
|
142
|
+
const unmount = unmountElementTypeCallbacks.get(elementType)?.get(elementId);
|
|
86
143
|
if (!unmount) {
|
|
87
144
|
return;
|
|
88
145
|
}
|
|
89
146
|
unmount();
|
|
90
|
-
|
|
91
|
-
if (
|
|
92
|
-
|
|
147
|
+
unmountElementTypeCallbacks.get(elementType)?.delete(elementId);
|
|
148
|
+
if (unmountElementTypeCallbacks.get(elementType)?.size === 0) {
|
|
149
|
+
unmountElementTypeCallbacks.delete(elementType);
|
|
93
150
|
}
|
|
94
151
|
};
|
|
95
152
|
|
|
@@ -107,6 +164,7 @@ function init() {
|
|
|
107
164
|
onElementDestroy({ elementType: type, elementId: id });
|
|
108
165
|
});
|
|
109
166
|
document.addEventListener("DOMContentLoaded", () => {
|
|
167
|
+
const controller = new AbortController();
|
|
110
168
|
document.querySelectorAll("[data-e-type]").forEach((element) => {
|
|
111
169
|
const el = element;
|
|
112
170
|
const { eType, id } = el.dataset;
|
|
@@ -123,11 +181,24 @@ function init() {
|
|
|
123
181
|
})
|
|
124
182
|
);
|
|
125
183
|
});
|
|
184
|
+
Array.from(elementSelectorHandlers.keys()).forEach((selector) => {
|
|
185
|
+
Array.from(document.querySelectorAll(selector)).forEach((element) => {
|
|
186
|
+
const el = element;
|
|
187
|
+
const elementId = el?.closest("[data-id]")?.getAttribute("data-id") ?? "";
|
|
188
|
+
onElementSelectorRender({
|
|
189
|
+
element,
|
|
190
|
+
controller,
|
|
191
|
+
elementId
|
|
192
|
+
});
|
|
193
|
+
});
|
|
194
|
+
});
|
|
126
195
|
});
|
|
127
196
|
}
|
|
128
197
|
export {
|
|
129
198
|
init,
|
|
130
199
|
register,
|
|
131
|
-
|
|
200
|
+
registerBySelector,
|
|
201
|
+
unregister,
|
|
202
|
+
unregisterBySelector
|
|
132
203
|
};
|
|
133
204
|
//# sourceMappingURL=index.mjs.map
|
package/package.json
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { elementTypeHandlers } from '../handlers-registry';
|
|
2
2
|
import { init, register, unregister } from '../index';
|
|
3
3
|
|
|
4
4
|
describe( 'Frontend Handlers', () => {
|
|
@@ -11,7 +11,7 @@ describe( 'Frontend Handlers', () => {
|
|
|
11
11
|
} );
|
|
12
12
|
|
|
13
13
|
beforeEach( () => {
|
|
14
|
-
|
|
14
|
+
elementTypeHandlers.clear();
|
|
15
15
|
document.body.innerHTML = '';
|
|
16
16
|
} );
|
|
17
17
|
|
|
@@ -545,7 +545,7 @@ describe( 'Frontend Handlers', () => {
|
|
|
545
545
|
describe( 'DOMContentLoaded Initialization', () => {
|
|
546
546
|
it( 'should initialize all existing elements on page load', () => {
|
|
547
547
|
// Arrange
|
|
548
|
-
|
|
548
|
+
elementTypeHandlers.clear();
|
|
549
549
|
document.body.innerHTML = '';
|
|
550
550
|
|
|
551
551
|
const initializedElements: string[] = [];
|
package/src/handlers-registry.ts
CHANGED
|
@@ -8,37 +8,81 @@ interface ListenToChildrenAPI {
|
|
|
8
8
|
|
|
9
9
|
type ListenToChildrenFunction = ( elementTypes: string[] ) => ListenToChildrenAPI;
|
|
10
10
|
|
|
11
|
-
type
|
|
11
|
+
type SharedHandlerParams< TSettings extends Settings = Settings > = {
|
|
12
12
|
element: Element;
|
|
13
13
|
signal: AbortSignal;
|
|
14
14
|
settings: TSettings;
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
export type Handler = < TSettings extends Settings = Settings >(
|
|
18
|
+
params: SharedHandlerParams< TSettings > & {
|
|
19
|
+
listenToChildren: ListenToChildrenFunction;
|
|
20
|
+
}
|
|
21
|
+
) => ( () => void ) | undefined;
|
|
17
22
|
|
|
18
|
-
export
|
|
23
|
+
export type SelectorHandler = < TSettings extends Settings = Settings >(
|
|
24
|
+
params: SharedHandlerParams< TSettings >
|
|
25
|
+
) => ( () => void ) | undefined;
|
|
26
|
+
|
|
27
|
+
export const elementTypeHandlers: Map< string, Map< string, Handler > > = new Map();
|
|
28
|
+
export const elementSelectorHandlers: Map< string, Map< string, SelectorHandler > > = new Map();
|
|
19
29
|
|
|
20
30
|
export const register = ( { elementType, id, callback }: { elementType: string; id: string; callback: Handler } ) => {
|
|
21
|
-
if ( !
|
|
22
|
-
|
|
31
|
+
if ( ! elementTypeHandlers.has( elementType ) ) {
|
|
32
|
+
elementTypeHandlers.set( elementType, new Map() );
|
|
23
33
|
}
|
|
24
34
|
|
|
25
|
-
if ( !
|
|
26
|
-
|
|
35
|
+
if ( ! elementTypeHandlers.get( elementType )?.has( id ) ) {
|
|
36
|
+
elementTypeHandlers.get( elementType )?.set( id, callback );
|
|
27
37
|
}
|
|
28
38
|
};
|
|
29
39
|
|
|
30
40
|
export const unregister = ( { elementType, id }: { elementType: string; id?: string } ) => {
|
|
31
|
-
if ( !
|
|
41
|
+
if ( ! elementTypeHandlers.has( elementType ) ) {
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
if ( id ) {
|
|
46
|
+
elementTypeHandlers.get( elementType )?.delete( id );
|
|
47
|
+
|
|
48
|
+
if ( elementTypeHandlers.get( elementType )?.size === 0 ) {
|
|
49
|
+
elementTypeHandlers.delete( elementType );
|
|
50
|
+
}
|
|
51
|
+
} else {
|
|
52
|
+
elementTypeHandlers.delete( elementType );
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
export const registerBySelector = ( {
|
|
57
|
+
id,
|
|
58
|
+
selector,
|
|
59
|
+
callback,
|
|
60
|
+
}: {
|
|
61
|
+
selector: string;
|
|
62
|
+
id: string;
|
|
63
|
+
callback: SelectorHandler;
|
|
64
|
+
} ) => {
|
|
65
|
+
if ( ! elementSelectorHandlers.has( selector ) ) {
|
|
66
|
+
elementSelectorHandlers.set( selector, new Map() );
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
if ( ! elementSelectorHandlers.get( selector )?.has( id ) ) {
|
|
70
|
+
elementSelectorHandlers.get( selector )?.set( id, callback );
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
export const unregisterBySelector = ( { selector, id }: { selector: string; id?: string } ) => {
|
|
75
|
+
if ( ! elementSelectorHandlers.has( selector ) ) {
|
|
32
76
|
return;
|
|
33
77
|
}
|
|
34
78
|
|
|
35
79
|
if ( id ) {
|
|
36
|
-
|
|
80
|
+
elementTypeHandlers.get( selector )?.delete( id );
|
|
37
81
|
|
|
38
|
-
if (
|
|
39
|
-
|
|
82
|
+
if ( elementTypeHandlers.get( selector )?.size === 0 ) {
|
|
83
|
+
elementTypeHandlers.delete( selector );
|
|
40
84
|
}
|
|
41
85
|
} else {
|
|
42
|
-
|
|
86
|
+
elementTypeHandlers.delete( selector );
|
|
43
87
|
}
|
|
44
88
|
};
|
package/src/index.ts
CHANGED
package/src/init.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { elementSelectorHandlers } from './handlers-registry';
|
|
2
|
+
import { onElementDestroy, onElementRender, onElementSelectorRender } from './lifecycle-events';
|
|
2
3
|
|
|
3
4
|
export function init() {
|
|
4
5
|
window.addEventListener( 'elementor/element/render', ( _event ) => {
|
|
@@ -19,6 +20,8 @@ export function init() {
|
|
|
19
20
|
} );
|
|
20
21
|
|
|
21
22
|
document.addEventListener( 'DOMContentLoaded', () => {
|
|
23
|
+
const controller = new AbortController();
|
|
24
|
+
|
|
22
25
|
document.querySelectorAll( '[data-e-type]' ).forEach( ( element ) => {
|
|
23
26
|
const el = element as HTMLElement;
|
|
24
27
|
|
|
@@ -38,5 +41,18 @@ export function init() {
|
|
|
38
41
|
} )
|
|
39
42
|
);
|
|
40
43
|
} );
|
|
44
|
+
|
|
45
|
+
Array.from( elementSelectorHandlers.keys() ).forEach( ( selector ) => {
|
|
46
|
+
Array.from( document.querySelectorAll( selector ) ).forEach( ( element ) => {
|
|
47
|
+
const el = element as HTMLElement;
|
|
48
|
+
const elementId = el?.closest( '[data-id]' )?.getAttribute( 'data-id' ) ?? '';
|
|
49
|
+
|
|
50
|
+
onElementSelectorRender( {
|
|
51
|
+
element,
|
|
52
|
+
controller,
|
|
53
|
+
elementId,
|
|
54
|
+
} );
|
|
55
|
+
} );
|
|
56
|
+
} );
|
|
41
57
|
} );
|
|
42
58
|
}
|
package/src/lifecycle-events.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { elementSelectorHandlers, elementTypeHandlers } from './handlers-registry';
|
|
2
2
|
|
|
3
|
-
const
|
|
3
|
+
const unmountElementTypeCallbacks: Map< string, Map< string, () => void > > = new Map();
|
|
4
|
+
const unmountElementSelectorCallbacks: Map< string, Map< string, () => void > > = new Map();
|
|
4
5
|
|
|
5
6
|
const ELEMENT_RENDERED_EVENT_NAME = 'elementor/element/rendered';
|
|
6
7
|
|
|
@@ -27,11 +28,11 @@ export const onElementRender = ( {
|
|
|
27
28
|
} )
|
|
28
29
|
);
|
|
29
30
|
|
|
30
|
-
if ( !
|
|
31
|
+
if ( ! elementTypeHandlers.has( elementType ) ) {
|
|
31
32
|
return;
|
|
32
33
|
}
|
|
33
34
|
|
|
34
|
-
Array.from(
|
|
35
|
+
Array.from( elementTypeHandlers.get( elementType )?.values() ?? [] ).forEach( ( handler ) => {
|
|
35
36
|
const settings = element.getAttribute( 'data-e-settings' );
|
|
36
37
|
|
|
37
38
|
const listenToChildren = ( elementTypes: string[] ) => ( {
|
|
@@ -66,19 +67,61 @@ export const onElementRender = ( {
|
|
|
66
67
|
}
|
|
67
68
|
} );
|
|
68
69
|
|
|
69
|
-
if ( !
|
|
70
|
-
|
|
70
|
+
if ( ! unmountElementTypeCallbacks.has( elementType ) ) {
|
|
71
|
+
unmountElementTypeCallbacks.set( elementType, new Map() );
|
|
71
72
|
}
|
|
72
73
|
|
|
73
|
-
|
|
74
|
+
unmountElementTypeCallbacks.get( elementType )?.set( elementId, () => {
|
|
74
75
|
controller.abort();
|
|
75
76
|
|
|
76
77
|
manualUnmount.forEach( ( callback ) => callback() );
|
|
77
78
|
} );
|
|
78
79
|
};
|
|
79
80
|
|
|
81
|
+
export const onElementSelectorRender = ( {
|
|
82
|
+
element,
|
|
83
|
+
elementId,
|
|
84
|
+
controller,
|
|
85
|
+
}: {
|
|
86
|
+
element: Element;
|
|
87
|
+
elementId: string;
|
|
88
|
+
controller: AbortController;
|
|
89
|
+
} ) => {
|
|
90
|
+
Array.from( elementSelectorHandlers.entries() ?? [] ).forEach( ( [ selector, handlers ] ) => {
|
|
91
|
+
if ( ! element.matches( selector ) ) {
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
const manualUnmount: ( () => void )[] = [];
|
|
96
|
+
|
|
97
|
+
Array.from( handlers.values() ?? [] ).forEach( ( handler ) => {
|
|
98
|
+
const settings = element.getAttribute( 'data-e-settings' );
|
|
99
|
+
|
|
100
|
+
const unmount = handler( {
|
|
101
|
+
element,
|
|
102
|
+
signal: controller.signal,
|
|
103
|
+
settings: settings ? JSON.parse( settings ) : {},
|
|
104
|
+
} );
|
|
105
|
+
|
|
106
|
+
if ( typeof unmount === 'function' ) {
|
|
107
|
+
manualUnmount.push( unmount );
|
|
108
|
+
}
|
|
109
|
+
} );
|
|
110
|
+
|
|
111
|
+
if ( ! unmountElementSelectorCallbacks.has( elementId ) ) {
|
|
112
|
+
unmountElementTypeCallbacks.set( elementId, new Map() );
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
unmountElementSelectorCallbacks.get( elementId )?.set( selector, () => {
|
|
116
|
+
controller.abort();
|
|
117
|
+
|
|
118
|
+
manualUnmount.forEach( ( callback ) => callback() );
|
|
119
|
+
} );
|
|
120
|
+
} );
|
|
121
|
+
};
|
|
122
|
+
|
|
80
123
|
export const onElementDestroy = ( { elementType, elementId }: { elementType: string; elementId: string } ) => {
|
|
81
|
-
const unmount =
|
|
124
|
+
const unmount = unmountElementTypeCallbacks.get( elementType )?.get( elementId );
|
|
82
125
|
|
|
83
126
|
if ( ! unmount ) {
|
|
84
127
|
return;
|
|
@@ -86,9 +129,9 @@ export const onElementDestroy = ( { elementType, elementId }: { elementType: str
|
|
|
86
129
|
|
|
87
130
|
unmount();
|
|
88
131
|
|
|
89
|
-
|
|
132
|
+
unmountElementTypeCallbacks.get( elementType )?.delete( elementId );
|
|
90
133
|
|
|
91
|
-
if (
|
|
92
|
-
|
|
134
|
+
if ( unmountElementTypeCallbacks.get( elementType )?.size === 0 ) {
|
|
135
|
+
unmountElementTypeCallbacks.delete( elementType );
|
|
93
136
|
}
|
|
94
137
|
};
|