@elementor/frontend-handlers 3.35.0-325 → 3.35.0-327

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 CHANGED
@@ -4,12 +4,15 @@ interface ListenToChildrenAPI {
4
4
  render: (callback: ChildRenderCallback) => void;
5
5
  }
6
6
  type ListenToChildrenFunction = (elementTypes: string[]) => ListenToChildrenAPI;
7
- type Handler = <TSettings extends Settings = Settings>(params: {
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 Handler = <TSettings extends Settings = Settings>(params: {
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
- unregister: () => unregister
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 handlers = /* @__PURE__ */ new Map();
32
+ var elementTypeHandlers = /* @__PURE__ */ new Map();
33
+ var elementSelectorHandlers = /* @__PURE__ */ new Map();
31
34
  var register = ({ elementType, id, callback }) => {
32
- if (!handlers.has(elementType)) {
33
- handlers.set(elementType, /* @__PURE__ */ new Map());
35
+ if (!elementTypeHandlers.has(elementType)) {
36
+ elementTypeHandlers.set(elementType, /* @__PURE__ */ new Map());
34
37
  }
35
- if (!handlers.get(elementType)?.has(id)) {
36
- handlers.get(elementType)?.set(id, callback);
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 (!handlers.has(elementType)) {
43
+ if (!elementTypeHandlers.has(elementType)) {
41
44
  return;
42
45
  }
43
46
  if (id) {
44
- handlers.get(elementType)?.delete(id);
45
- if (handlers.get(elementType)?.size === 0) {
46
- handlers.delete(elementType);
47
+ elementTypeHandlers.get(elementType)?.delete(id);
48
+ if (elementTypeHandlers.get(elementType)?.size === 0) {
49
+ elementTypeHandlers.delete(elementType);
47
50
  }
48
51
  } else {
49
- handlers.delete(elementType);
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 unmountCallbacks = /* @__PURE__ */ new Map();
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 (!handlers.has(elementType)) {
102
+ if (!elementTypeHandlers.has(elementType)) {
74
103
  return;
75
104
  }
76
- Array.from(handlers.get(elementType)?.values() ?? []).forEach((handler) => {
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 (!unmountCallbacks.has(elementType)) {
105
- unmountCallbacks.set(elementType, /* @__PURE__ */ new Map());
133
+ if (!unmountElementTypeCallbacks.has(elementType)) {
134
+ unmountElementTypeCallbacks.set(elementType, /* @__PURE__ */ new Map());
106
135
  }
107
- unmountCallbacks.get(elementType)?.set(elementId, () => {
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 = unmountCallbacks.get(elementType)?.get(elementId);
172
+ const unmount = unmountElementTypeCallbacks.get(elementType)?.get(elementId);
114
173
  if (!unmount) {
115
174
  return;
116
175
  }
117
176
  unmount();
118
- unmountCallbacks.get(elementType)?.delete(elementId);
119
- if (unmountCallbacks.get(elementType)?.size === 0) {
120
- unmountCallbacks.delete(elementType);
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
- unregister
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 handlers = /* @__PURE__ */ new Map();
2
+ var elementTypeHandlers = /* @__PURE__ */ new Map();
3
+ var elementSelectorHandlers = /* @__PURE__ */ new Map();
3
4
  var register = ({ elementType, id, callback }) => {
4
- if (!handlers.has(elementType)) {
5
- handlers.set(elementType, /* @__PURE__ */ new Map());
5
+ if (!elementTypeHandlers.has(elementType)) {
6
+ elementTypeHandlers.set(elementType, /* @__PURE__ */ new Map());
6
7
  }
7
- if (!handlers.get(elementType)?.has(id)) {
8
- handlers.get(elementType)?.set(id, callback);
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 (!handlers.has(elementType)) {
13
+ if (!elementTypeHandlers.has(elementType)) {
13
14
  return;
14
15
  }
15
16
  if (id) {
16
- handlers.get(elementType)?.delete(id);
17
- if (handlers.get(elementType)?.size === 0) {
18
- handlers.delete(elementType);
17
+ elementTypeHandlers.get(elementType)?.delete(id);
18
+ if (elementTypeHandlers.get(elementType)?.size === 0) {
19
+ elementTypeHandlers.delete(elementType);
19
20
  }
20
21
  } else {
21
- handlers.delete(elementType);
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 unmountCallbacks = /* @__PURE__ */ new Map();
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 (!handlers.has(elementType)) {
72
+ if (!elementTypeHandlers.has(elementType)) {
46
73
  return;
47
74
  }
48
- Array.from(handlers.get(elementType)?.values() ?? []).forEach((handler) => {
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 (!unmountCallbacks.has(elementType)) {
77
- unmountCallbacks.set(elementType, /* @__PURE__ */ new Map());
103
+ if (!unmountElementTypeCallbacks.has(elementType)) {
104
+ unmountElementTypeCallbacks.set(elementType, /* @__PURE__ */ new Map());
78
105
  }
79
- unmountCallbacks.get(elementType)?.set(elementId, () => {
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 = unmountCallbacks.get(elementType)?.get(elementId);
142
+ const unmount = unmountElementTypeCallbacks.get(elementType)?.get(elementId);
86
143
  if (!unmount) {
87
144
  return;
88
145
  }
89
146
  unmount();
90
- unmountCallbacks.get(elementType)?.delete(elementId);
91
- if (unmountCallbacks.get(elementType)?.size === 0) {
92
- unmountCallbacks.delete(elementType);
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
- unregister
200
+ registerBySelector,
201
+ unregister,
202
+ unregisterBySelector
132
203
  };
133
204
  //# sourceMappingURL=index.mjs.map
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@elementor/frontend-handlers",
3
3
  "description": "Elementor Frontend Handlers",
4
- "version": "3.35.0-325",
4
+ "version": "3.35.0-327",
5
5
  "private": false,
6
6
  "author": "Elementor Team",
7
7
  "homepage": "https://elementor.com/",
@@ -1,4 +1,4 @@
1
- import { handlers } from '../handlers-registry';
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
- handlers.clear();
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
- handlers.clear();
548
+ elementTypeHandlers.clear();
549
549
  document.body.innerHTML = '';
550
550
 
551
551
  const initializedElements: string[] = [];
@@ -8,37 +8,81 @@ interface ListenToChildrenAPI {
8
8
 
9
9
  type ListenToChildrenFunction = ( elementTypes: string[] ) => ListenToChildrenAPI;
10
10
 
11
- type Handler = < TSettings extends Settings = Settings >( params: {
11
+ type SharedHandlerParams< TSettings extends Settings = Settings > = {
12
12
  element: Element;
13
13
  signal: AbortSignal;
14
14
  settings: TSettings;
15
- listenToChildren: ListenToChildrenFunction;
16
- } ) => ( () => void ) | undefined;
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 const handlers: Map< string, Map< string, Handler > > = new Map();
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 ( ! handlers.has( elementType ) ) {
22
- handlers.set( elementType, new Map() );
31
+ if ( ! elementTypeHandlers.has( elementType ) ) {
32
+ elementTypeHandlers.set( elementType, new Map() );
23
33
  }
24
34
 
25
- if ( ! handlers.get( elementType )?.has( id ) ) {
26
- handlers.get( elementType )?.set( id, callback );
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 ( ! handlers.has( elementType ) ) {
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
- handlers.get( elementType )?.delete( id );
80
+ elementTypeHandlers.get( selector )?.delete( id );
37
81
 
38
- if ( handlers.get( elementType )?.size === 0 ) {
39
- handlers.delete( elementType );
82
+ if ( elementTypeHandlers.get( selector )?.size === 0 ) {
83
+ elementTypeHandlers.delete( selector );
40
84
  }
41
85
  } else {
42
- handlers.delete( elementType );
86
+ elementTypeHandlers.delete( selector );
43
87
  }
44
88
  };
package/src/index.ts CHANGED
@@ -1,3 +1,3 @@
1
- export { register, unregister } from './handlers-registry';
1
+ export { register, unregister, registerBySelector, unregisterBySelector } from './handlers-registry';
2
2
 
3
3
  export { init } from './init';
package/src/init.ts CHANGED
@@ -1,4 +1,5 @@
1
- import { onElementDestroy, onElementRender } from './lifecycle-events';
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
  }
@@ -1,6 +1,7 @@
1
- import { handlers } from './handlers-registry';
1
+ import { elementSelectorHandlers, elementTypeHandlers } from './handlers-registry';
2
2
 
3
- const unmountCallbacks: Map< string, Map< string, () => void > > = new Map();
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 ( ! handlers.has( elementType ) ) {
31
+ if ( ! elementTypeHandlers.has( elementType ) ) {
31
32
  return;
32
33
  }
33
34
 
34
- Array.from( handlers.get( elementType )?.values() ?? [] ).forEach( ( handler ) => {
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 ( ! unmountCallbacks.has( elementType ) ) {
70
- unmountCallbacks.set( elementType, new Map() );
70
+ if ( ! unmountElementTypeCallbacks.has( elementType ) ) {
71
+ unmountElementTypeCallbacks.set( elementType, new Map() );
71
72
  }
72
73
 
73
- unmountCallbacks.get( elementType )?.set( elementId, () => {
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 = unmountCallbacks.get( elementType )?.get( elementId );
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
- unmountCallbacks.get( elementType )?.delete( elementId );
132
+ unmountElementTypeCallbacks.get( elementType )?.delete( elementId );
90
133
 
91
- if ( unmountCallbacks.get( elementType )?.size === 0 ) {
92
- unmountCallbacks.delete( elementType );
134
+ if ( unmountElementTypeCallbacks.get( elementType )?.size === 0 ) {
135
+ unmountElementTypeCallbacks.delete( elementType );
93
136
  }
94
137
  };