@whitesev/pops 4.2.0 → 4.2.2
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.amd.js +169 -145
- package/dist/index.amd.js.map +1 -1
- package/dist/index.amd.min.js +1 -1
- package/dist/index.amd.min.js.map +1 -1
- package/dist/index.cjs.js +169 -145
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.cjs.min.js +1 -1
- package/dist/index.cjs.min.js.map +1 -1
- package/dist/index.esm.js +169 -145
- package/dist/index.esm.js.map +1 -1
- package/dist/index.esm.min.js +1 -1
- package/dist/index.esm.min.js.map +1 -1
- package/dist/index.iife.js +169 -145
- package/dist/index.iife.js.map +1 -1
- package/dist/index.iife.min.js +1 -1
- package/dist/index.iife.min.js.map +1 -1
- package/dist/index.system.js +169 -145
- package/dist/index.system.js.map +1 -1
- package/dist/index.system.min.js +1 -1
- package/dist/index.system.min.js.map +1 -1
- package/dist/index.umd.js +169 -145
- package/dist/index.umd.js.map +1 -1
- package/dist/index.umd.min.js +1 -1
- package/dist/index.umd.min.js.map +1 -1
- package/dist/types/src/Pops.d.ts +10 -10
- package/dist/types/src/types/PopsDOMUtilsEventType.d.ts +3 -3
- package/dist/types/src/utils/PopsDOMUtils.d.ts +11 -11
- package/package.json +1 -1
- package/src/types/PopsDOMUtilsEventType.d.ts +3 -3
- package/src/utils/PopsDOMUtils.ts +159 -138
|
@@ -1,20 +1,20 @@
|
|
|
1
|
+
import { PopsCommonCSSClassName } from "../config/CommonCSSClassName";
|
|
2
|
+
import { OriginPrototype, PopsCore } from "../PopsCore";
|
|
1
3
|
import type {
|
|
2
4
|
ParseHTMLReturnType,
|
|
3
|
-
PopsDOMUtils_EventType,
|
|
4
|
-
PopsDOMUtilsCreateElementAttributesMap,
|
|
5
|
-
PopsDOMUtilsEventListenerOption,
|
|
6
|
-
PopsDOMUtilsEventListenerOptionsAttribute,
|
|
7
5
|
PopsDOMUtils_Event,
|
|
8
|
-
|
|
6
|
+
PopsDOMUtils_EventType,
|
|
9
7
|
PopsDOMUtilsAddEventListenerResult,
|
|
8
|
+
PopsDOMUtilsCreateElementAttributesMap,
|
|
10
9
|
PopsDOMUtilsCSSProperty,
|
|
11
10
|
PopsDOMUtilsCSSPropertyType,
|
|
11
|
+
PopsDOMUtilsElementEventType,
|
|
12
|
+
PopsDOMUtilsEventListenerOption,
|
|
13
|
+
PopsDOMUtilsEventListenerOptionsAttribute,
|
|
12
14
|
PopsDOMUtilsTargetElementType,
|
|
13
15
|
} from "../types/PopsDOMUtilsEventType";
|
|
14
|
-
import { OriginPrototype, PopsCore } from "../PopsCore";
|
|
15
|
-
import { popsUtils } from "./PopsUtils";
|
|
16
16
|
import { PopsSafeUtils } from "./PopsSafeUtils";
|
|
17
|
-
import {
|
|
17
|
+
import { popsUtils } from "./PopsUtils";
|
|
18
18
|
/**
|
|
19
19
|
* 存储在元素属性上的事件名
|
|
20
20
|
*/
|
|
@@ -39,7 +39,7 @@ class PopsDOMUtilsEvent {
|
|
|
39
39
|
* console.log("事件触发",event)
|
|
40
40
|
* })
|
|
41
41
|
*/
|
|
42
|
-
on<T extends PopsDOMUtils_EventType>(
|
|
42
|
+
on<T extends PopsDOMUtils_EventType = PopsDOMUtils_EventType>(
|
|
43
43
|
element: PopsDOMUtilsElementEventType,
|
|
44
44
|
eventType: T | T[],
|
|
45
45
|
callback: (this: HTMLElement, event: PopsDOMUtils_Event[T]) => void,
|
|
@@ -63,7 +63,7 @@ class PopsDOMUtilsEvent {
|
|
|
63
63
|
* console.log("事件触发",event)
|
|
64
64
|
* })
|
|
65
65
|
*/
|
|
66
|
-
on<T extends Event>(
|
|
66
|
+
on<T extends Event = Event>(
|
|
67
67
|
element: PopsDOMUtilsElementEventType,
|
|
68
68
|
eventType: string | string[],
|
|
69
69
|
callback: (this: HTMLElement, event: T) => void,
|
|
@@ -93,7 +93,7 @@ class PopsDOMUtilsEvent {
|
|
|
93
93
|
* console.log("事件触发", event, selectorTarget)
|
|
94
94
|
* })
|
|
95
95
|
*/
|
|
96
|
-
on<T extends PopsDOMUtils_EventType>(
|
|
96
|
+
on<T extends PopsDOMUtils_EventType = PopsDOMUtils_EventType>(
|
|
97
97
|
element: PopsDOMUtilsElementEventType,
|
|
98
98
|
eventType: T | T[],
|
|
99
99
|
selector: string | string[] | undefined | null,
|
|
@@ -124,24 +124,24 @@ class PopsDOMUtilsEvent {
|
|
|
124
124
|
* console.log("事件触发", event, selectorTarget)
|
|
125
125
|
* })
|
|
126
126
|
*/
|
|
127
|
-
on<T extends Event>(
|
|
127
|
+
on<T extends Event = Event>(
|
|
128
128
|
element: PopsDOMUtilsElementEventType,
|
|
129
129
|
eventType: string | string[],
|
|
130
130
|
selector: string | string[] | undefined | null,
|
|
131
131
|
callback: (this: HTMLElement, event: T, selectorTarget: HTMLElement) => void,
|
|
132
132
|
option?: PopsDOMUtilsEventListenerOption | boolean
|
|
133
133
|
): PopsDOMUtilsAddEventListenerResult;
|
|
134
|
-
on<T extends Event>(
|
|
134
|
+
on<T extends Event = Event>(
|
|
135
135
|
element: HTMLElement | string | NodeList | HTMLElement[] | Window | Document | Element | null | typeof globalThis,
|
|
136
136
|
eventType: PopsDOMUtils_EventType | PopsDOMUtils_EventType[] | string | string[],
|
|
137
137
|
selector:
|
|
138
138
|
| string
|
|
139
139
|
| string[]
|
|
140
140
|
| undefined
|
|
141
|
-
| ((this:
|
|
141
|
+
| (<E extends HTMLElement = HTMLElement>(this: E, event: T, $selector: E) => void)
|
|
142
142
|
| null,
|
|
143
143
|
callback?:
|
|
144
|
-
| ((this:
|
|
144
|
+
| (<E extends HTMLElement = HTMLElement>(this: E, event: T, $selector: E) => void)
|
|
145
145
|
| PopsDOMUtilsEventListenerOption
|
|
146
146
|
| boolean,
|
|
147
147
|
option?: PopsDOMUtilsEventListenerOption | boolean
|
|
@@ -152,7 +152,7 @@ class PopsDOMUtilsEvent {
|
|
|
152
152
|
* @param startIndex
|
|
153
153
|
* @param option
|
|
154
154
|
*/
|
|
155
|
-
function
|
|
155
|
+
const getOption = function (args: IArguments, startIndex: number, option: PopsDOMUtilsEventListenerOption) {
|
|
156
156
|
const currentParam = args[startIndex];
|
|
157
157
|
if (typeof currentParam === "boolean") {
|
|
158
158
|
option.capture = currentParam;
|
|
@@ -175,7 +175,7 @@ class PopsDOMUtilsEvent {
|
|
|
175
175
|
option.isComposedPath = currentParam.isComposedPath;
|
|
176
176
|
}
|
|
177
177
|
return option;
|
|
178
|
-
}
|
|
178
|
+
};
|
|
179
179
|
|
|
180
180
|
const that = this;
|
|
181
181
|
// eslint-disable-next-line prefer-rest-params
|
|
@@ -189,33 +189,32 @@ class PopsDOMUtilsEvent {
|
|
|
189
189
|
emit() {},
|
|
190
190
|
};
|
|
191
191
|
}
|
|
192
|
-
let $elList:
|
|
192
|
+
let $elList: (Element | Document | Window)[] = [];
|
|
193
193
|
if (element instanceof NodeList || Array.isArray(element)) {
|
|
194
|
-
|
|
195
|
-
$elList = [...element];
|
|
194
|
+
$elList = $elList.concat(Array.from(element as Element[]));
|
|
196
195
|
} else {
|
|
197
|
-
$elList.push(element as
|
|
196
|
+
$elList.push(element as Element);
|
|
198
197
|
}
|
|
199
198
|
// 事件名
|
|
200
199
|
let eventTypeList: string[] = [];
|
|
201
200
|
if (Array.isArray(eventType)) {
|
|
202
|
-
eventTypeList = eventTypeList.concat(
|
|
203
|
-
eventType.filter((eventTypeItem) => typeof eventTypeItem === "string" && eventTypeItem.toString() !== "")
|
|
204
|
-
);
|
|
201
|
+
eventTypeList = eventTypeList.concat(eventType.filter((it) => typeof it === "string" && it.toString() !== ""));
|
|
205
202
|
} else if (typeof eventType === "string") {
|
|
206
|
-
eventTypeList = eventTypeList.concat(eventType.split(" ").filter((
|
|
203
|
+
eventTypeList = eventTypeList.concat(eventType.split(" ").filter((it) => it !== ""));
|
|
207
204
|
}
|
|
208
205
|
// 子元素选择器
|
|
209
206
|
let selectorList: string[] = [];
|
|
210
207
|
if (Array.isArray(selector)) {
|
|
211
|
-
selectorList = selectorList.concat(
|
|
212
|
-
selector.filter((selectorItem) => typeof selectorItem === "string" && selectorItem.toString() !== "")
|
|
213
|
-
);
|
|
208
|
+
selectorList = selectorList.concat(selector.filter((it) => typeof it === "string" && it.toString() !== ""));
|
|
214
209
|
} else if (typeof selector === "string") {
|
|
215
210
|
selectorList.push(selector);
|
|
216
211
|
}
|
|
217
212
|
// 事件回调
|
|
218
|
-
let listenerCallBack: (this:
|
|
213
|
+
let listenerCallBack: (this: Element, event: Event, $selector?: HTMLElement) => void | boolean = callback as (
|
|
214
|
+
this: Element,
|
|
215
|
+
event: Event,
|
|
216
|
+
$selector?: HTMLElement
|
|
217
|
+
) => void | boolean;
|
|
219
218
|
// 事件配置
|
|
220
219
|
let listenerOption: PopsDOMUtilsEventListenerOption = {
|
|
221
220
|
capture: false,
|
|
@@ -232,84 +231,104 @@ class PopsDOMUtilsEvent {
|
|
|
232
231
|
// 这是存在selector的情况
|
|
233
232
|
listenerOption = getOption(args, 4, listenerOption);
|
|
234
233
|
}
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
/**
|
|
245
|
-
* 事件回调
|
|
246
|
-
* @param event
|
|
247
|
-
*/
|
|
248
|
-
function domUtilsEventCallBack(event: Event) {
|
|
249
|
-
if (selectorList.length) {
|
|
250
|
-
// 存在子元素选择器
|
|
251
|
-
// 这时候的this和target都是子元素选择器的元素
|
|
252
|
-
let eventTarget = listenerOption.isComposedPath
|
|
253
|
-
? (event.composedPath()[0] as HTMLElement)
|
|
254
|
-
: (event.target as HTMLElement);
|
|
255
|
-
let totalParent = elementItem;
|
|
256
|
-
if (popsUtils.isWin(totalParent)) {
|
|
257
|
-
if (totalParent === (PopsCore.document as any as HTMLElement)) {
|
|
258
|
-
totalParent = PopsCore.document.documentElement;
|
|
259
|
-
}
|
|
234
|
+
$elList.forEach(($elItem) => {
|
|
235
|
+
// 遍历事件名设置元素事件
|
|
236
|
+
eventTypeList.forEach((eventName) => {
|
|
237
|
+
/**
|
|
238
|
+
* 如果是option.once,那么删除该监听和元素上的事件和监听
|
|
239
|
+
*/
|
|
240
|
+
const checkOptionOnceToRemoveEventListener = () => {
|
|
241
|
+
if (listenerOption.once) {
|
|
242
|
+
this.off($elItem, eventName, selector as any, callback as any, option);
|
|
260
243
|
}
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
244
|
+
};
|
|
245
|
+
/**
|
|
246
|
+
* 事件回调
|
|
247
|
+
* @param event
|
|
248
|
+
*/
|
|
249
|
+
const handlerCallBack = function (event: Event) {
|
|
250
|
+
let call_this: Element | undefined = void 0;
|
|
251
|
+
let call_event: Event | undefined = void 0;
|
|
252
|
+
let call_$selector: HTMLElement | undefined = void 0;
|
|
253
|
+
let execCallback = false;
|
|
254
|
+
if (selectorList.length) {
|
|
255
|
+
// 存在子元素选择器
|
|
256
|
+
// 这时候的this和target都是子元素选择器的元素
|
|
257
|
+
let $target: HTMLElement;
|
|
258
|
+
if (listenerOption.isComposedPath) {
|
|
259
|
+
// 可能为空
|
|
260
|
+
const composedPath = event.composedPath();
|
|
261
|
+
if (!composedPath.length && event.target) {
|
|
262
|
+
composedPath.push(event.target);
|
|
263
|
+
}
|
|
264
|
+
$target = composedPath[0] as HTMLElement;
|
|
265
|
+
} else {
|
|
266
|
+
$target = event.target as HTMLElement;
|
|
266
267
|
}
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
268
|
+
let $parent = $elItem;
|
|
269
|
+
if (popsUtils.isWin($parent)) {
|
|
270
|
+
// window和document共用一个对象
|
|
271
|
+
// 这样就能处理子元素选择器无法匹配的问题
|
|
272
|
+
$parent = PopsCore.document.documentElement;
|
|
272
273
|
}
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
274
|
+
const findValue = selectorList.find((selectors) => {
|
|
275
|
+
// 判断目标元素是否匹配选择器
|
|
276
|
+
if (that.matches($target, selectors)) {
|
|
277
|
+
// 当前目标可以被selector所匹配到
|
|
278
|
+
return true;
|
|
279
|
+
}
|
|
280
|
+
// 在上层与主元素之间寻找可以被selector所匹配到的
|
|
281
|
+
const $closestMatches = that.closest<HTMLElement>($target, selectors);
|
|
282
|
+
if ($closestMatches && (<HTMLElement>$parent)?.contains?.($closestMatches)) {
|
|
283
|
+
$target = $closestMatches;
|
|
284
|
+
return true;
|
|
285
|
+
}
|
|
286
|
+
return false;
|
|
287
|
+
});
|
|
288
|
+
if (findValue) {
|
|
289
|
+
// 这里尝试使用defineProperty修改event的target值
|
|
290
|
+
try {
|
|
291
|
+
OriginPrototype.Object.defineProperty(event, "target", {
|
|
292
|
+
get() {
|
|
293
|
+
return $target;
|
|
294
|
+
},
|
|
295
|
+
});
|
|
296
|
+
// oxlint-disable-next-line no-empty
|
|
297
|
+
} catch {}
|
|
298
|
+
execCallback = true;
|
|
299
|
+
call_this = $target;
|
|
300
|
+
call_event = event;
|
|
301
|
+
call_$selector = $target;
|
|
285
302
|
}
|
|
286
|
-
|
|
303
|
+
} else {
|
|
304
|
+
execCallback = true;
|
|
305
|
+
call_this = $elItem as Element;
|
|
306
|
+
call_event = event;
|
|
307
|
+
}
|
|
308
|
+
if (execCallback) {
|
|
309
|
+
const result = listenerCallBack.call(call_this!, call_event!, call_$selector!);
|
|
287
310
|
checkOptionOnceToRemoveEventListener();
|
|
311
|
+
if (typeof result === "boolean" && !result) {
|
|
312
|
+
return false;
|
|
313
|
+
}
|
|
288
314
|
}
|
|
289
|
-
}
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
checkOptionOnceToRemoveEventListener();
|
|
293
|
-
}
|
|
294
|
-
}
|
|
295
|
-
|
|
296
|
-
// 遍历事件名设置元素事件
|
|
297
|
-
eventTypeList.forEach((eventName) => {
|
|
298
|
-
elementItem.addEventListener(eventName, domUtilsEventCallBack, listenerOption);
|
|
315
|
+
};
|
|
316
|
+
// add listener
|
|
317
|
+
$elItem.addEventListener(eventName, handlerCallBack, listenerOption);
|
|
299
318
|
// 获取对象上的事件
|
|
300
319
|
const elementEvents: {
|
|
301
320
|
[k: string]: PopsDOMUtilsEventListenerOptionsAttribute[];
|
|
302
|
-
} = Reflect.get(
|
|
321
|
+
} = Reflect.get($elItem, SymbolEvents) || {};
|
|
303
322
|
// 初始化对象上的xx事件
|
|
304
323
|
elementEvents[eventName] = elementEvents[eventName] || [];
|
|
305
324
|
elementEvents[eventName].push({
|
|
306
325
|
selector: selectorList,
|
|
307
326
|
option: listenerOption,
|
|
308
|
-
|
|
309
|
-
|
|
327
|
+
handlerCallBack: handlerCallBack,
|
|
328
|
+
callback: listenerCallBack,
|
|
310
329
|
});
|
|
311
330
|
// 覆盖事件
|
|
312
|
-
Reflect.set(
|
|
331
|
+
Reflect.set($elItem, SymbolEvents, elementEvents);
|
|
313
332
|
});
|
|
314
333
|
});
|
|
315
334
|
|
|
@@ -329,11 +348,11 @@ class PopsDOMUtilsEvent {
|
|
|
329
348
|
},
|
|
330
349
|
/**
|
|
331
350
|
* 主动触发事件
|
|
332
|
-
* @param
|
|
333
|
-
* @param
|
|
351
|
+
* @param extraDetails 赋予触发的Event的额外属性,如果是Event类型,那么将自动代替默认new的Event对象
|
|
352
|
+
* @param useDispatchToTriggerEvent 是否使用dispatchEvent来触发事件,默认true,如果为false,则直接调用callback,但是这种会让使用了`$selector`的没有值
|
|
334
353
|
*/
|
|
335
|
-
emit: (
|
|
336
|
-
that.emit($elList, eventTypeList,
|
|
354
|
+
emit: (extraDetails?: object, useDispatchToTriggerEvent?: boolean) => {
|
|
355
|
+
that.emit($elList, eventTypeList, extraDetails, useDispatchToTriggerEvent);
|
|
337
356
|
},
|
|
338
357
|
};
|
|
339
358
|
}
|
|
@@ -350,10 +369,10 @@ class PopsDOMUtilsEvent {
|
|
|
350
369
|
* DOMUtils.off(document.querySelector("a.xx"),"click")
|
|
351
370
|
* DOMUtils.off("a.xx","click")
|
|
352
371
|
*/
|
|
353
|
-
off<T extends PopsDOMUtils_EventType>(
|
|
372
|
+
off<T extends PopsDOMUtils_EventType = PopsDOMUtils_EventType>(
|
|
354
373
|
element: PopsDOMUtilsElementEventType,
|
|
355
374
|
eventType: T | T[],
|
|
356
|
-
callback?: (this:
|
|
375
|
+
callback?: <E extends HTMLElement = HTMLElement>(this: E, event: PopsDOMUtils_Event[T]) => void,
|
|
357
376
|
option?: EventListenerOptions | boolean,
|
|
358
377
|
filter?: (
|
|
359
378
|
value: PopsDOMUtilsEventListenerOptionsAttribute,
|
|
@@ -374,10 +393,10 @@ class PopsDOMUtilsEvent {
|
|
|
374
393
|
* DOMUtils.off(document.querySelector("a.xx"),"click")
|
|
375
394
|
* DOMUtils.off("a.xx","click")
|
|
376
395
|
*/
|
|
377
|
-
off<T extends Event>(
|
|
396
|
+
off<T extends Event = Event>(
|
|
378
397
|
element: PopsDOMUtilsElementEventType,
|
|
379
398
|
eventType: string | string[],
|
|
380
|
-
callback?: (this:
|
|
399
|
+
callback?: <E extends HTMLElement = HTMLElement>(this: E, event: T) => void,
|
|
381
400
|
option?: EventListenerOptions | boolean,
|
|
382
401
|
filter?: (
|
|
383
402
|
value: PopsDOMUtilsEventListenerOptionsAttribute,
|
|
@@ -399,11 +418,11 @@ class PopsDOMUtilsEvent {
|
|
|
399
418
|
* DOMUtils.off(document.querySelector("a.xx"),"click tap hover")
|
|
400
419
|
* DOMUtils.off("a.xx",["click","tap","hover"])
|
|
401
420
|
*/
|
|
402
|
-
off<T extends PopsDOMUtils_EventType>(
|
|
421
|
+
off<T extends PopsDOMUtils_EventType = PopsDOMUtils_EventType>(
|
|
403
422
|
element: PopsDOMUtilsElementEventType,
|
|
404
423
|
eventType: T | T[],
|
|
405
424
|
selector?: string | string[] | undefined | null,
|
|
406
|
-
callback?: (this:
|
|
425
|
+
callback?: <E extends HTMLElement = HTMLElement>(this: E, event: PopsDOMUtils_Event[T], $selector: E) => void,
|
|
407
426
|
option?: EventListenerOptions | boolean,
|
|
408
427
|
filter?: (
|
|
409
428
|
value: PopsDOMUtilsEventListenerOptionsAttribute,
|
|
@@ -425,11 +444,11 @@ class PopsDOMUtilsEvent {
|
|
|
425
444
|
* DOMUtils.off(document.querySelector("a.xx"),"click tap hover")
|
|
426
445
|
* DOMUtils.off("a.xx",["click","tap","hover"])
|
|
427
446
|
*/
|
|
428
|
-
off<T extends Event>(
|
|
447
|
+
off<T extends Event = Event>(
|
|
429
448
|
element: PopsDOMUtilsElementEventType,
|
|
430
449
|
eventType: string | string[],
|
|
431
450
|
selector?: string | string[] | undefined | null,
|
|
432
|
-
callback?: (this:
|
|
451
|
+
callback?: <E extends HTMLElement = HTMLElement>(this: E, event: T, $selector: E) => void,
|
|
433
452
|
option?: EventListenerOptions | boolean,
|
|
434
453
|
filter?: (
|
|
435
454
|
value: PopsDOMUtilsEventListenerOptionsAttribute,
|
|
@@ -444,9 +463,12 @@ class PopsDOMUtilsEvent {
|
|
|
444
463
|
| string
|
|
445
464
|
| string[]
|
|
446
465
|
| undefined
|
|
447
|
-
| ((this:
|
|
466
|
+
| (<E extends HTMLElement = HTMLElement>(this: E, event: T, $selector: E) => void)
|
|
448
467
|
| null,
|
|
449
|
-
callback?:
|
|
468
|
+
callback?:
|
|
469
|
+
| (<E extends HTMLElement = HTMLElement>(this: E, event: T, $selector: E) => void)
|
|
470
|
+
| EventListenerOptions
|
|
471
|
+
| boolean,
|
|
450
472
|
option?:
|
|
451
473
|
| EventListenerOptions
|
|
452
474
|
| boolean
|
|
@@ -467,7 +489,7 @@ class PopsDOMUtilsEvent {
|
|
|
467
489
|
* @param startIndex
|
|
468
490
|
* @param option
|
|
469
491
|
*/
|
|
470
|
-
function
|
|
492
|
+
const getOption = function (args1: IArguments, startIndex: number, option: EventListenerOptions) {
|
|
471
493
|
const currentParam: EventListenerOptions | boolean = args1[startIndex];
|
|
472
494
|
if (typeof currentParam === "boolean") {
|
|
473
495
|
option.capture = currentParam;
|
|
@@ -475,12 +497,12 @@ class PopsDOMUtilsEvent {
|
|
|
475
497
|
option.capture = currentParam.capture;
|
|
476
498
|
}
|
|
477
499
|
return option;
|
|
478
|
-
}
|
|
479
|
-
const
|
|
500
|
+
};
|
|
501
|
+
const that = this;
|
|
480
502
|
// eslint-disable-next-line prefer-rest-params
|
|
481
503
|
const args = arguments;
|
|
482
504
|
if (typeof element === "string") {
|
|
483
|
-
element =
|
|
505
|
+
element = that.selectorAll(element);
|
|
484
506
|
}
|
|
485
507
|
if (element == null) {
|
|
486
508
|
return;
|
|
@@ -488,31 +510,27 @@ class PopsDOMUtilsEvent {
|
|
|
488
510
|
let $elList: HTMLElement[] = [];
|
|
489
511
|
if (element instanceof NodeList || Array.isArray(element)) {
|
|
490
512
|
element = element as HTMLElement[];
|
|
491
|
-
$elList = $elList.concat(element);
|
|
513
|
+
$elList = $elList.concat(Array.from(element));
|
|
492
514
|
} else {
|
|
493
515
|
$elList.push(element as HTMLElement);
|
|
494
516
|
}
|
|
495
517
|
let eventTypeList: string[] = [];
|
|
496
518
|
if (Array.isArray(eventType)) {
|
|
497
|
-
eventTypeList = eventTypeList.concat(
|
|
498
|
-
eventType.filter((eventTypeItem) => typeof eventTypeItem === "string" && eventTypeItem.toString() !== "")
|
|
499
|
-
);
|
|
519
|
+
eventTypeList = eventTypeList.concat(eventType.filter((it) => typeof it === "string" && it.toString() !== ""));
|
|
500
520
|
} else if (typeof eventType === "string") {
|
|
501
|
-
eventTypeList = eventTypeList.concat(eventType.split(" ").filter((
|
|
521
|
+
eventTypeList = eventTypeList.concat(eventType.split(" ").filter((it) => it !== ""));
|
|
502
522
|
}
|
|
503
523
|
// 子元素选择器
|
|
504
524
|
let selectorList: string[] = [];
|
|
505
525
|
if (Array.isArray(selector)) {
|
|
506
|
-
selectorList = selectorList.concat(
|
|
507
|
-
selector.filter((selectorItem) => typeof selectorItem === "string" && selectorItem.toString() !== "")
|
|
508
|
-
);
|
|
526
|
+
selectorList = selectorList.concat(selector.filter((it) => typeof it === "string" && it.toString() !== ""));
|
|
509
527
|
} else if (typeof selector === "string") {
|
|
510
528
|
selectorList.push(selector);
|
|
511
529
|
}
|
|
512
530
|
/**
|
|
513
531
|
* 事件的回调函数
|
|
514
532
|
*/
|
|
515
|
-
let listenerCallBack: (this: HTMLElement, event: T,
|
|
533
|
+
let listenerCallBack: (this: HTMLElement, event: T, $selector: HTMLElement) => void = callback as any;
|
|
516
534
|
|
|
517
535
|
/**
|
|
518
536
|
* 事件的配置
|
|
@@ -537,24 +555,27 @@ class PopsDOMUtilsEvent {
|
|
|
537
555
|
array: PopsDOMUtilsEventListenerOptionsAttribute[]
|
|
538
556
|
) => boolean;
|
|
539
557
|
}
|
|
540
|
-
$elList.forEach((
|
|
558
|
+
$elList.forEach(($elItem) => {
|
|
541
559
|
// 获取对象上的事件
|
|
542
560
|
const elementEvents: {
|
|
543
561
|
[key: string]: PopsDOMUtilsEventListenerOptionsAttribute[];
|
|
544
|
-
} = Reflect.get(
|
|
562
|
+
} = Reflect.get($elItem, SymbolEvents) || {};
|
|
545
563
|
eventTypeList.forEach((eventName) => {
|
|
546
564
|
const handlers = elementEvents[eventName] || [];
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
565
|
+
// 过滤出需要删除的事件
|
|
566
|
+
const handlersFiltered = typeof filter === "function" ? handlers.filter(filter) : handlers;
|
|
567
|
+
for (let index = 0; index < handlersFiltered.length; index++) {
|
|
568
|
+
const handler = handlersFiltered[index];
|
|
569
|
+
// 过滤出的事件再根据下面的条件进行判断处理移除
|
|
570
|
+
// 1. callback内存地址必须相同
|
|
571
|
+
// 2. selector必须相同
|
|
572
|
+
// 3. option.capture必须相同
|
|
550
573
|
let flag = true;
|
|
551
|
-
if (flag && listenerCallBack && handler.
|
|
552
|
-
// callback不同
|
|
574
|
+
if (flag && listenerCallBack && handler.callback !== listenerCallBack) {
|
|
553
575
|
flag = false;
|
|
554
576
|
}
|
|
555
577
|
if (flag && selectorList.length && Array.isArray(handler.selector)) {
|
|
556
578
|
if (JSON.stringify(handler.selector) !== JSON.stringify(selectorList)) {
|
|
557
|
-
// 子元素选择器不同
|
|
558
579
|
flag = false;
|
|
559
580
|
}
|
|
560
581
|
}
|
|
@@ -563,14 +584,14 @@ class PopsDOMUtilsEvent {
|
|
|
563
584
|
typeof handler.option.capture === "boolean" &&
|
|
564
585
|
listenerOption.capture !== handler.option.capture
|
|
565
586
|
) {
|
|
566
|
-
// 事件的配置项不同
|
|
567
587
|
flag = false;
|
|
568
588
|
}
|
|
569
589
|
if (flag) {
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
590
|
+
$elItem.removeEventListener(eventName, handler.handlerCallBack, handler.option);
|
|
591
|
+
for (let i = handlers.length - 1; i >= 0; i--) {
|
|
592
|
+
if (handlers[i] === handler) {
|
|
593
|
+
handlers.splice(i, 1);
|
|
594
|
+
}
|
|
574
595
|
}
|
|
575
596
|
}
|
|
576
597
|
}
|
|
@@ -579,7 +600,7 @@ class PopsDOMUtilsEvent {
|
|
|
579
600
|
popsUtils.delete(elementEvents, eventType);
|
|
580
601
|
}
|
|
581
602
|
});
|
|
582
|
-
Reflect.set(
|
|
603
|
+
Reflect.set($elItem, SymbolEvents, elementEvents);
|
|
583
604
|
});
|
|
584
605
|
}
|
|
585
606
|
/**
|
|
@@ -1080,7 +1101,7 @@ class PopsDOMUtilsEvent {
|
|
|
1080
1101
|
* })
|
|
1081
1102
|
*/
|
|
1082
1103
|
preventEvent(
|
|
1083
|
-
$el:
|
|
1104
|
+
$el: Element | Document | ShadowRoot,
|
|
1084
1105
|
eventNameList: string | string[],
|
|
1085
1106
|
option?: {
|
|
1086
1107
|
/** (可选)是否捕获,默认false */
|
|
@@ -1111,7 +1132,7 @@ class PopsDOMUtilsEvent {
|
|
|
1111
1132
|
* })
|
|
1112
1133
|
*/
|
|
1113
1134
|
preventEvent(
|
|
1114
|
-
$el:
|
|
1135
|
+
$el: Element | Document | ShadowRoot,
|
|
1115
1136
|
eventNameList: string | string[],
|
|
1116
1137
|
selector: string | string[] | null | undefined,
|
|
1117
1138
|
option?: {
|
|
@@ -1129,11 +1150,11 @@ class PopsDOMUtilsEvent {
|
|
|
1129
1150
|
* 阻止事件的默认行为发生,并阻止事件传播
|
|
1130
1151
|
*/
|
|
1131
1152
|
const stopEvent = (event: Event, onlyStopPropagation?: boolean) => {
|
|
1153
|
+
// 停止事件的传播,阻止它继续向更上层的元素冒泡,事件将不会再传播给其他的元素
|
|
1154
|
+
event?.stopPropagation();
|
|
1155
|
+
// 阻止事件传播,并且还能阻止元素上的其他事件处理程序被触发
|
|
1156
|
+
event?.stopImmediatePropagation();
|
|
1132
1157
|
if (typeof onlyStopPropagation === "boolean" && onlyStopPropagation) {
|
|
1133
|
-
// 停止事件的传播,阻止它继续向更上层的元素冒泡,事件将不会再传播给其他的元素
|
|
1134
|
-
event?.stopPropagation();
|
|
1135
|
-
// 阻止事件传播,并且还能阻止元素上的其他事件处理程序被触发
|
|
1136
|
-
event?.stopImmediatePropagation();
|
|
1137
1158
|
return;
|
|
1138
1159
|
}
|
|
1139
1160
|
// 阻止事件的默认行为发生。例如,当点击一个链接时,浏览器会默认打开链接的URL,或者在输入框内输入文字
|