@whitesev/pops 4.1.0 → 4.2.1
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 +250 -227
- 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 +250 -227
- 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 +250 -227
- 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 +250 -227
- 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 +250 -227
- 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 +250 -227
- 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 +17 -16
- package/dist/types/src/types/PopsDOMUtilsEventType.d.ts +3 -3
- package/dist/types/src/types/mask.d.ts +6 -6
- package/dist/types/src/utils/PopsDOMUtils.d.ts +6 -18
- package/dist/types/src/utils/PopsInstanceUtils.d.ts +22 -0
- package/dist/types/src/utils/PopsUtils.d.ts +1 -1
- package/package.json +1 -1
- package/src/Pops.ts +9 -12
- package/src/components/panel/handlerComponents.ts +4 -4
- package/src/handler/PopsHandler.ts +9 -21
- package/src/handler/PopsInstHandler.ts +3 -2
- package/src/types/PopsDOMUtilsEventType.d.ts +3 -3
- package/src/types/mask.d.ts +6 -6
- package/src/utils/PopsDOMUtils.ts +105 -113
- package/src/utils/PopsInstanceUtils.ts +50 -0
- package/src/utils/PopsUtils.ts +2 -2
- package/dist/types/src/utils/PopsDOMUtilsEventsConfig.d.ts +0 -4
- package/src/utils/PopsDOMUtilsEventsConfig.ts +0 -4
|
@@ -11,11 +11,14 @@ import type {
|
|
|
11
11
|
PopsDOMUtilsCSSPropertyType,
|
|
12
12
|
PopsDOMUtilsTargetElementType,
|
|
13
13
|
} from "../types/PopsDOMUtilsEventType";
|
|
14
|
-
import { SymbolEvents } from "./PopsDOMUtilsEventsConfig";
|
|
15
14
|
import { OriginPrototype, PopsCore } from "../PopsCore";
|
|
16
15
|
import { popsUtils } from "./PopsUtils";
|
|
17
16
|
import { PopsSafeUtils } from "./PopsSafeUtils";
|
|
18
17
|
import { PopsCommonCSSClassName } from "../config/CommonCSSClassName";
|
|
18
|
+
/**
|
|
19
|
+
* 存储在元素属性上的事件名
|
|
20
|
+
*/
|
|
21
|
+
const SymbolEvents = Symbol("events_" + (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1));
|
|
19
22
|
|
|
20
23
|
class PopsDOMUtilsEvent {
|
|
21
24
|
/**
|
|
@@ -135,10 +138,10 @@ class PopsDOMUtilsEvent {
|
|
|
135
138
|
| string
|
|
136
139
|
| string[]
|
|
137
140
|
| undefined
|
|
138
|
-
| ((this:
|
|
141
|
+
| (<E extends HTMLElement = HTMLElement>(this: E, event: T, $selector: E) => void)
|
|
139
142
|
| null,
|
|
140
143
|
callback?:
|
|
141
|
-
| ((this:
|
|
144
|
+
| (<E extends HTMLElement = HTMLElement>(this: E, event: T, $selector: E) => void)
|
|
142
145
|
| PopsDOMUtilsEventListenerOption
|
|
143
146
|
| boolean,
|
|
144
147
|
option?: PopsDOMUtilsEventListenerOption | boolean
|
|
@@ -149,7 +152,7 @@ class PopsDOMUtilsEvent {
|
|
|
149
152
|
* @param startIndex
|
|
150
153
|
* @param option
|
|
151
154
|
*/
|
|
152
|
-
function
|
|
155
|
+
const getOption = function (args: IArguments, startIndex: number, option: PopsDOMUtilsEventListenerOption) {
|
|
153
156
|
const currentParam = args[startIndex];
|
|
154
157
|
if (typeof currentParam === "boolean") {
|
|
155
158
|
option.capture = currentParam;
|
|
@@ -172,7 +175,7 @@ class PopsDOMUtilsEvent {
|
|
|
172
175
|
option.isComposedPath = currentParam.isComposedPath;
|
|
173
176
|
}
|
|
174
177
|
return option;
|
|
175
|
-
}
|
|
178
|
+
};
|
|
176
179
|
|
|
177
180
|
const that = this;
|
|
178
181
|
// eslint-disable-next-line prefer-rest-params
|
|
@@ -186,33 +189,32 @@ class PopsDOMUtilsEvent {
|
|
|
186
189
|
emit() {},
|
|
187
190
|
};
|
|
188
191
|
}
|
|
189
|
-
let $elList:
|
|
192
|
+
let $elList: (Element | Document | Window)[] = [];
|
|
190
193
|
if (element instanceof NodeList || Array.isArray(element)) {
|
|
191
|
-
|
|
192
|
-
$elList = [...element];
|
|
194
|
+
$elList = $elList.concat(Array.from(element as Element[]));
|
|
193
195
|
} else {
|
|
194
|
-
$elList.push(element as
|
|
196
|
+
$elList.push(element as Element);
|
|
195
197
|
}
|
|
196
198
|
// 事件名
|
|
197
199
|
let eventTypeList: string[] = [];
|
|
198
200
|
if (Array.isArray(eventType)) {
|
|
199
|
-
eventTypeList = eventTypeList.concat(
|
|
200
|
-
eventType.filter((eventTypeItem) => typeof eventTypeItem === "string" && eventTypeItem.toString() !== "")
|
|
201
|
-
);
|
|
201
|
+
eventTypeList = eventTypeList.concat(eventType.filter((it) => typeof it === "string" && it.toString() !== ""));
|
|
202
202
|
} else if (typeof eventType === "string") {
|
|
203
|
-
eventTypeList = eventTypeList.concat(eventType.split(" ").filter((
|
|
203
|
+
eventTypeList = eventTypeList.concat(eventType.split(" ").filter((it) => it !== ""));
|
|
204
204
|
}
|
|
205
205
|
// 子元素选择器
|
|
206
206
|
let selectorList: string[] = [];
|
|
207
207
|
if (Array.isArray(selector)) {
|
|
208
|
-
selectorList = selectorList.concat(
|
|
209
|
-
selector.filter((selectorItem) => typeof selectorItem === "string" && selectorItem.toString() !== "")
|
|
210
|
-
);
|
|
208
|
+
selectorList = selectorList.concat(selector.filter((it) => typeof it === "string" && it.toString() !== ""));
|
|
211
209
|
} else if (typeof selector === "string") {
|
|
212
210
|
selectorList.push(selector);
|
|
213
211
|
}
|
|
214
212
|
// 事件回调
|
|
215
|
-
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;
|
|
216
218
|
// 事件配置
|
|
217
219
|
let listenerOption: PopsDOMUtilsEventListenerOption = {
|
|
218
220
|
capture: false,
|
|
@@ -232,39 +234,51 @@ class PopsDOMUtilsEvent {
|
|
|
232
234
|
/**
|
|
233
235
|
* 如果是once,那么删除该监听和元素上的事件和监听
|
|
234
236
|
*/
|
|
235
|
-
|
|
237
|
+
const checkOptionOnceToRemoveEventListener = ($el: PopsDOMUtilsElementEventType) => {
|
|
236
238
|
if (listenerOption.once) {
|
|
237
|
-
|
|
239
|
+
this.off($el, eventTypeList, selector as any, callback as any, option);
|
|
238
240
|
}
|
|
239
|
-
}
|
|
240
|
-
$elList.forEach((
|
|
241
|
+
};
|
|
242
|
+
$elList.forEach(($elItem) => {
|
|
241
243
|
/**
|
|
242
244
|
* 事件回调
|
|
243
245
|
* @param event
|
|
244
246
|
*/
|
|
245
|
-
function
|
|
247
|
+
const handlerCallBack = function (event: Event) {
|
|
248
|
+
let call_this: Element | undefined = void 0;
|
|
249
|
+
let call_event: Event | undefined = void 0;
|
|
250
|
+
let call_$selector: HTMLElement | undefined = void 0;
|
|
251
|
+
let execCallback = false;
|
|
246
252
|
if (selectorList.length) {
|
|
247
253
|
// 存在子元素选择器
|
|
248
254
|
// 这时候的this和target都是子元素选择器的元素
|
|
249
|
-
let
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
totalParent = PopsCore.document.documentElement;
|
|
255
|
+
let $target: HTMLElement;
|
|
256
|
+
if (listenerOption.isComposedPath) {
|
|
257
|
+
// 可能为空
|
|
258
|
+
const composedPath = event.composedPath();
|
|
259
|
+
if (!composedPath.length && event.target) {
|
|
260
|
+
composedPath.push(event.target);
|
|
256
261
|
}
|
|
262
|
+
$target = composedPath[0] as HTMLElement;
|
|
263
|
+
} else {
|
|
264
|
+
$target = event.target as HTMLElement;
|
|
257
265
|
}
|
|
258
|
-
|
|
266
|
+
let $parent = $elItem;
|
|
267
|
+
if (popsUtils.isWin($parent)) {
|
|
268
|
+
// window和document共用一个对象
|
|
269
|
+
// 这样就能处理子元素选择器无法匹配的问题
|
|
270
|
+
$parent = PopsCore.document.documentElement;
|
|
271
|
+
}
|
|
272
|
+
const findValue = selectorList.find((selectors) => {
|
|
259
273
|
// 判断目标元素是否匹配选择器
|
|
260
|
-
if (that.matches(
|
|
274
|
+
if (that.matches($target, selectors)) {
|
|
261
275
|
// 当前目标可以被selector所匹配到
|
|
262
276
|
return true;
|
|
263
277
|
}
|
|
264
278
|
// 在上层与主元素之间寻找可以被selector所匹配到的
|
|
265
|
-
const $closestMatches = that.closest<HTMLElement>(
|
|
266
|
-
if ($closestMatches &&
|
|
267
|
-
|
|
279
|
+
const $closestMatches = that.closest<HTMLElement>($target, selectors);
|
|
280
|
+
if ($closestMatches && (<HTMLElement>$parent)?.contains?.($closestMatches)) {
|
|
281
|
+
$target = $closestMatches;
|
|
268
282
|
return true;
|
|
269
283
|
}
|
|
270
284
|
return false;
|
|
@@ -274,39 +288,48 @@ class PopsDOMUtilsEvent {
|
|
|
274
288
|
try {
|
|
275
289
|
OriginPrototype.Object.defineProperty(event, "target", {
|
|
276
290
|
get() {
|
|
277
|
-
return
|
|
291
|
+
return $target;
|
|
278
292
|
},
|
|
279
293
|
});
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
294
|
+
// oxlint-disable-next-line no-empty
|
|
295
|
+
} catch {}
|
|
296
|
+
execCallback = true;
|
|
297
|
+
call_this = $target;
|
|
298
|
+
call_event = event;
|
|
299
|
+
call_$selector = $target;
|
|
285
300
|
}
|
|
286
301
|
} else {
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
302
|
+
execCallback = true;
|
|
303
|
+
call_this = $elItem as Element;
|
|
304
|
+
call_event = event;
|
|
290
305
|
}
|
|
291
|
-
|
|
306
|
+
if (execCallback) {
|
|
307
|
+
const result = listenerCallBack.call(call_this!, call_event!, call_$selector!);
|
|
308
|
+
checkOptionOnceToRemoveEventListener($elItem);
|
|
309
|
+
if (typeof result === "boolean" && !result) {
|
|
310
|
+
return false;
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
};
|
|
292
314
|
|
|
293
315
|
// 遍历事件名设置元素事件
|
|
294
316
|
eventTypeList.forEach((eventName) => {
|
|
295
|
-
|
|
317
|
+
// add listener
|
|
318
|
+
$elItem.addEventListener(eventName, handlerCallBack, listenerOption);
|
|
296
319
|
// 获取对象上的事件
|
|
297
320
|
const elementEvents: {
|
|
298
321
|
[k: string]: PopsDOMUtilsEventListenerOptionsAttribute[];
|
|
299
|
-
} = Reflect.get(
|
|
322
|
+
} = Reflect.get($elItem, SymbolEvents) || {};
|
|
300
323
|
// 初始化对象上的xx事件
|
|
301
324
|
elementEvents[eventName] = elementEvents[eventName] || [];
|
|
302
325
|
elementEvents[eventName].push({
|
|
303
326
|
selector: selectorList,
|
|
304
327
|
option: listenerOption,
|
|
305
|
-
|
|
306
|
-
|
|
328
|
+
handlerCallBack: handlerCallBack,
|
|
329
|
+
callback: listenerCallBack,
|
|
307
330
|
});
|
|
308
331
|
// 覆盖事件
|
|
309
|
-
Reflect.set(
|
|
332
|
+
Reflect.set($elItem, SymbolEvents, elementEvents);
|
|
310
333
|
});
|
|
311
334
|
});
|
|
312
335
|
|
|
@@ -326,11 +349,11 @@ class PopsDOMUtilsEvent {
|
|
|
326
349
|
},
|
|
327
350
|
/**
|
|
328
351
|
* 主动触发事件
|
|
329
|
-
* @param
|
|
330
|
-
* @param
|
|
352
|
+
* @param extraDetails 赋予触发的Event的额外属性,如果是Event类型,那么将自动代替默认new的Event对象
|
|
353
|
+
* @param useDispatchToTriggerEvent 是否使用dispatchEvent来触发事件,默认true,如果为false,则直接调用callback,但是这种会让使用了`$selector`的没有值
|
|
331
354
|
*/
|
|
332
|
-
emit: (
|
|
333
|
-
that.emit($elList, eventTypeList,
|
|
355
|
+
emit: (extraDetails?: object, useDispatchToTriggerEvent?: boolean) => {
|
|
356
|
+
that.emit($elList, eventTypeList, extraDetails, useDispatchToTriggerEvent);
|
|
334
357
|
},
|
|
335
358
|
};
|
|
336
359
|
}
|
|
@@ -350,7 +373,7 @@ class PopsDOMUtilsEvent {
|
|
|
350
373
|
off<T extends PopsDOMUtils_EventType>(
|
|
351
374
|
element: PopsDOMUtilsElementEventType,
|
|
352
375
|
eventType: T | T[],
|
|
353
|
-
callback?: (this:
|
|
376
|
+
callback?: <E extends HTMLElement = HTMLElement>(this: E, event: PopsDOMUtils_Event[T]) => void,
|
|
354
377
|
option?: EventListenerOptions | boolean,
|
|
355
378
|
filter?: (
|
|
356
379
|
value: PopsDOMUtilsEventListenerOptionsAttribute,
|
|
@@ -374,7 +397,7 @@ class PopsDOMUtilsEvent {
|
|
|
374
397
|
off<T extends Event>(
|
|
375
398
|
element: PopsDOMUtilsElementEventType,
|
|
376
399
|
eventType: string | string[],
|
|
377
|
-
callback?: (this:
|
|
400
|
+
callback?: <E extends HTMLElement = HTMLElement>(this: E, event: T) => void,
|
|
378
401
|
option?: EventListenerOptions | boolean,
|
|
379
402
|
filter?: (
|
|
380
403
|
value: PopsDOMUtilsEventListenerOptionsAttribute,
|
|
@@ -400,7 +423,7 @@ class PopsDOMUtilsEvent {
|
|
|
400
423
|
element: PopsDOMUtilsElementEventType,
|
|
401
424
|
eventType: T | T[],
|
|
402
425
|
selector?: string | string[] | undefined | null,
|
|
403
|
-
callback?: (this:
|
|
426
|
+
callback?: <E extends HTMLElement = HTMLElement>(this: E, event: PopsDOMUtils_Event[T], $selector: E) => void,
|
|
404
427
|
option?: EventListenerOptions | boolean,
|
|
405
428
|
filter?: (
|
|
406
429
|
value: PopsDOMUtilsEventListenerOptionsAttribute,
|
|
@@ -426,7 +449,7 @@ class PopsDOMUtilsEvent {
|
|
|
426
449
|
element: PopsDOMUtilsElementEventType,
|
|
427
450
|
eventType: string | string[],
|
|
428
451
|
selector?: string | string[] | undefined | null,
|
|
429
|
-
callback?: (this:
|
|
452
|
+
callback?: <E extends HTMLElement = HTMLElement>(this: E, event: T, $selector: E) => void,
|
|
430
453
|
option?: EventListenerOptions | boolean,
|
|
431
454
|
filter?: (
|
|
432
455
|
value: PopsDOMUtilsEventListenerOptionsAttribute,
|
|
@@ -441,9 +464,12 @@ class PopsDOMUtilsEvent {
|
|
|
441
464
|
| string
|
|
442
465
|
| string[]
|
|
443
466
|
| undefined
|
|
444
|
-
| ((this:
|
|
467
|
+
| (<E extends HTMLElement = HTMLElement>(this: E, event: T, $selector: E) => void)
|
|
445
468
|
| null,
|
|
446
|
-
callback?:
|
|
469
|
+
callback?:
|
|
470
|
+
| (<E extends HTMLElement = HTMLElement>(this: E, event: T, $selector: E) => void)
|
|
471
|
+
| EventListenerOptions
|
|
472
|
+
| boolean,
|
|
447
473
|
option?:
|
|
448
474
|
| EventListenerOptions
|
|
449
475
|
| boolean
|
|
@@ -464,7 +490,7 @@ class PopsDOMUtilsEvent {
|
|
|
464
490
|
* @param startIndex
|
|
465
491
|
* @param option
|
|
466
492
|
*/
|
|
467
|
-
function
|
|
493
|
+
const getOption = function (args1: IArguments, startIndex: number, option: EventListenerOptions) {
|
|
468
494
|
const currentParam: EventListenerOptions | boolean = args1[startIndex];
|
|
469
495
|
if (typeof currentParam === "boolean") {
|
|
470
496
|
option.capture = currentParam;
|
|
@@ -472,12 +498,12 @@ class PopsDOMUtilsEvent {
|
|
|
472
498
|
option.capture = currentParam.capture;
|
|
473
499
|
}
|
|
474
500
|
return option;
|
|
475
|
-
}
|
|
476
|
-
const
|
|
501
|
+
};
|
|
502
|
+
const that = this;
|
|
477
503
|
// eslint-disable-next-line prefer-rest-params
|
|
478
504
|
const args = arguments;
|
|
479
505
|
if (typeof element === "string") {
|
|
480
|
-
element =
|
|
506
|
+
element = that.selectorAll(element);
|
|
481
507
|
}
|
|
482
508
|
if (element == null) {
|
|
483
509
|
return;
|
|
@@ -485,31 +511,27 @@ class PopsDOMUtilsEvent {
|
|
|
485
511
|
let $elList: HTMLElement[] = [];
|
|
486
512
|
if (element instanceof NodeList || Array.isArray(element)) {
|
|
487
513
|
element = element as HTMLElement[];
|
|
488
|
-
$elList = $elList.concat(element);
|
|
514
|
+
$elList = $elList.concat(Array.from(element));
|
|
489
515
|
} else {
|
|
490
516
|
$elList.push(element as HTMLElement);
|
|
491
517
|
}
|
|
492
518
|
let eventTypeList: string[] = [];
|
|
493
519
|
if (Array.isArray(eventType)) {
|
|
494
|
-
eventTypeList = eventTypeList.concat(
|
|
495
|
-
eventType.filter((eventTypeItem) => typeof eventTypeItem === "string" && eventTypeItem.toString() !== "")
|
|
496
|
-
);
|
|
520
|
+
eventTypeList = eventTypeList.concat(eventType.filter((it) => typeof it === "string" && it.toString() !== ""));
|
|
497
521
|
} else if (typeof eventType === "string") {
|
|
498
|
-
eventTypeList = eventTypeList.concat(eventType.split(" ").filter((
|
|
522
|
+
eventTypeList = eventTypeList.concat(eventType.split(" ").filter((it) => it !== ""));
|
|
499
523
|
}
|
|
500
524
|
// 子元素选择器
|
|
501
525
|
let selectorList: string[] = [];
|
|
502
526
|
if (Array.isArray(selector)) {
|
|
503
|
-
selectorList = selectorList.concat(
|
|
504
|
-
selector.filter((selectorItem) => typeof selectorItem === "string" && selectorItem.toString() !== "")
|
|
505
|
-
);
|
|
527
|
+
selectorList = selectorList.concat(selector.filter((it) => typeof it === "string" && it.toString() !== ""));
|
|
506
528
|
} else if (typeof selector === "string") {
|
|
507
529
|
selectorList.push(selector);
|
|
508
530
|
}
|
|
509
531
|
/**
|
|
510
532
|
* 事件的回调函数
|
|
511
533
|
*/
|
|
512
|
-
let listenerCallBack: (this: HTMLElement, event: T,
|
|
534
|
+
let listenerCallBack: (this: HTMLElement, event: T, $selector: HTMLElement) => void = callback as any;
|
|
513
535
|
|
|
514
536
|
/**
|
|
515
537
|
* 事件的配置
|
|
@@ -534,18 +556,18 @@ class PopsDOMUtilsEvent {
|
|
|
534
556
|
array: PopsDOMUtilsEventListenerOptionsAttribute[]
|
|
535
557
|
) => boolean;
|
|
536
558
|
}
|
|
537
|
-
$elList.forEach((
|
|
559
|
+
$elList.forEach(($elItem) => {
|
|
538
560
|
// 获取对象上的事件
|
|
539
561
|
const elementEvents: {
|
|
540
562
|
[key: string]: PopsDOMUtilsEventListenerOptionsAttribute[];
|
|
541
|
-
} = Reflect.get(
|
|
563
|
+
} = Reflect.get($elItem, SymbolEvents) || {};
|
|
542
564
|
eventTypeList.forEach((eventName) => {
|
|
543
565
|
const handlers = elementEvents[eventName] || [];
|
|
544
566
|
const filterHandler = typeof filter === "function" ? handlers.filter(filter) : handlers;
|
|
545
567
|
for (let index = 0; index < filterHandler.length; index++) {
|
|
546
568
|
const handler = filterHandler[index];
|
|
547
569
|
let flag = true;
|
|
548
|
-
if (flag && listenerCallBack && handler.
|
|
570
|
+
if (flag && listenerCallBack && handler.callback !== listenerCallBack) {
|
|
549
571
|
// callback不同
|
|
550
572
|
flag = false;
|
|
551
573
|
}
|
|
@@ -564,7 +586,7 @@ class PopsDOMUtilsEvent {
|
|
|
564
586
|
flag = false;
|
|
565
587
|
}
|
|
566
588
|
if (flag) {
|
|
567
|
-
|
|
589
|
+
$elItem.removeEventListener(eventName, handler.handlerCallBack, handler.option);
|
|
568
590
|
const findIndex = handlers.findIndex((item) => item === handler);
|
|
569
591
|
if (findIndex !== -1) {
|
|
570
592
|
handlers.splice(findIndex, 1);
|
|
@@ -576,7 +598,7 @@ class PopsDOMUtilsEvent {
|
|
|
576
598
|
popsUtils.delete(elementEvents, eventType);
|
|
577
599
|
}
|
|
578
600
|
});
|
|
579
|
-
Reflect.set(
|
|
601
|
+
Reflect.set($elItem, SymbolEvents, elementEvents);
|
|
580
602
|
});
|
|
581
603
|
}
|
|
582
604
|
/**
|
|
@@ -1077,7 +1099,7 @@ class PopsDOMUtilsEvent {
|
|
|
1077
1099
|
* })
|
|
1078
1100
|
*/
|
|
1079
1101
|
preventEvent(
|
|
1080
|
-
$el:
|
|
1102
|
+
$el: Element | Document | ShadowRoot,
|
|
1081
1103
|
eventNameList: string | string[],
|
|
1082
1104
|
option?: {
|
|
1083
1105
|
/** (可选)是否捕获,默认false */
|
|
@@ -1108,7 +1130,7 @@ class PopsDOMUtilsEvent {
|
|
|
1108
1130
|
* })
|
|
1109
1131
|
*/
|
|
1110
1132
|
preventEvent(
|
|
1111
|
-
$el:
|
|
1133
|
+
$el: Element | Document | ShadowRoot,
|
|
1112
1134
|
eventNameList: string | string[],
|
|
1113
1135
|
selector: string | string[] | null | undefined,
|
|
1114
1136
|
option?: {
|
|
@@ -1126,11 +1148,11 @@ class PopsDOMUtilsEvent {
|
|
|
1126
1148
|
* 阻止事件的默认行为发生,并阻止事件传播
|
|
1127
1149
|
*/
|
|
1128
1150
|
const stopEvent = (event: Event, onlyStopPropagation?: boolean) => {
|
|
1151
|
+
// 停止事件的传播,阻止它继续向更上层的元素冒泡,事件将不会再传播给其他的元素
|
|
1152
|
+
event?.stopPropagation();
|
|
1153
|
+
// 阻止事件传播,并且还能阻止元素上的其他事件处理程序被触发
|
|
1154
|
+
event?.stopImmediatePropagation();
|
|
1129
1155
|
if (typeof onlyStopPropagation === "boolean" && onlyStopPropagation) {
|
|
1130
|
-
// 停止事件的传播,阻止它继续向更上层的元素冒泡,事件将不会再传播给其他的元素
|
|
1131
|
-
event?.stopPropagation();
|
|
1132
|
-
// 阻止事件传播,并且还能阻止元素上的其他事件处理程序被触发
|
|
1133
|
-
event?.stopImmediatePropagation();
|
|
1134
1156
|
return;
|
|
1135
1157
|
}
|
|
1136
1158
|
// 阻止事件的默认行为发生。例如,当点击一个链接时,浏览器会默认打开链接的URL,或者在输入框内输入文字
|
|
@@ -1417,36 +1439,6 @@ class PopsDOMUtils extends PopsDOMUtilsEvent {
|
|
|
1417
1439
|
getTransitionEndNameList() {
|
|
1418
1440
|
return ["webkitTransitionEnd", "mozTransitionEnd", "MSTransitionEnd", "otransitionend", "transitionend"];
|
|
1419
1441
|
}
|
|
1420
|
-
/**
|
|
1421
|
-
* 是否是隐藏状态
|
|
1422
|
-
*
|
|
1423
|
-
* 检测以下项:
|
|
1424
|
-
*
|
|
1425
|
-
* + `display`: none
|
|
1426
|
-
* + `visibility`: hidden
|
|
1427
|
-
* + `opacity`: 0
|
|
1428
|
-
* + `使用了pops的自定义的隐藏class类`
|
|
1429
|
-
* @param $el 需要检测的元素
|
|
1430
|
-
*/
|
|
1431
|
-
isHide($el: Element) {
|
|
1432
|
-
let flag = false;
|
|
1433
|
-
if (
|
|
1434
|
-
this.containsClassName($el, PopsCommonCSSClassName.hide) ||
|
|
1435
|
-
this.containsClassName($el, PopsCommonCSSClassName.hideImportant)
|
|
1436
|
-
) {
|
|
1437
|
-
flag = true;
|
|
1438
|
-
} else {
|
|
1439
|
-
if ($el instanceof HTMLElement) {
|
|
1440
|
-
const style = $el.style;
|
|
1441
|
-
flag = style.display.includes("none") || style.visibility.includes("hidden") || style.opacity !== "0";
|
|
1442
|
-
}
|
|
1443
|
-
if (!flag) {
|
|
1444
|
-
const style = globalThis.getComputedStyle($el);
|
|
1445
|
-
flag = style.display.includes("none") || style.visibility.includes("hidden") || style.opacity !== "0";
|
|
1446
|
-
}
|
|
1447
|
-
}
|
|
1448
|
-
return flag;
|
|
1449
|
-
}
|
|
1450
1442
|
/**
|
|
1451
1443
|
* 实现jQuery中的$().offset();
|
|
1452
1444
|
* @param element
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { PopsCommonCSSClassName } from "../config/CommonCSSClassName";
|
|
1
2
|
import { PopsInstData } from "../PopsInst";
|
|
2
3
|
import type { PopsInstStoreType } from "../types/main";
|
|
3
4
|
import { popsUtils } from "./PopsUtils";
|
|
@@ -82,4 +83,53 @@ export const PopsInstanceUtils = {
|
|
|
82
83
|
}
|
|
83
84
|
};
|
|
84
85
|
},
|
|
86
|
+
/**
|
|
87
|
+
* 是否是隐藏状态
|
|
88
|
+
*
|
|
89
|
+
* 检测以下项:
|
|
90
|
+
*
|
|
91
|
+
* + `display`: none
|
|
92
|
+
* + `visibility`: hidden
|
|
93
|
+
* + `opacity`: 0
|
|
94
|
+
* + `使用了pops的自定义的隐藏class类`
|
|
95
|
+
* @param $el 需要检测的元素
|
|
96
|
+
*/
|
|
97
|
+
isHide($el: Element) {
|
|
98
|
+
let flag = false;
|
|
99
|
+
if (
|
|
100
|
+
$el?.classList?.contains(PopsCommonCSSClassName.hide) ||
|
|
101
|
+
$el?.classList?.contains(PopsCommonCSSClassName.hideImportant)
|
|
102
|
+
) {
|
|
103
|
+
flag = true;
|
|
104
|
+
} else {
|
|
105
|
+
if ($el instanceof HTMLElement) {
|
|
106
|
+
const style = $el.style;
|
|
107
|
+
flag = style.display.includes("none") || style.visibility.includes("hidden") || style.opacity !== "0";
|
|
108
|
+
}
|
|
109
|
+
if (!flag) {
|
|
110
|
+
const style = globalThis.getComputedStyle($el);
|
|
111
|
+
flag = style.display.includes("none") || style.visibility.includes("hidden") || style.opacity !== "0";
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return flag;
|
|
115
|
+
},
|
|
116
|
+
/**
|
|
117
|
+
* 判断元素是否是在`.pops`内
|
|
118
|
+
* @param $el 目标元素
|
|
119
|
+
*/
|
|
120
|
+
isNodeInPopsNode($el: Element) {
|
|
121
|
+
return !!($el.closest(".pops") || $el.matches(".pops"));
|
|
122
|
+
},
|
|
123
|
+
/**
|
|
124
|
+
* 判断是否是`.pops-anim`元素
|
|
125
|
+
* @param $el 目标元素
|
|
126
|
+
*/
|
|
127
|
+
isAnimNode($el: Element) {
|
|
128
|
+
return !!(
|
|
129
|
+
$el?.localName?.toLowerCase() === "div" &&
|
|
130
|
+
$el.className &&
|
|
131
|
+
$el.className === "pops-anim" &&
|
|
132
|
+
$el.hasAttribute("anim")
|
|
133
|
+
);
|
|
134
|
+
},
|
|
85
135
|
};
|
package/src/utils/PopsUtils.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import AnyTouch from "any-touch";
|
|
2
1
|
import doubletap from "@any-touch/doubletap";
|
|
2
|
+
import AnyTouch from "any-touch";
|
|
3
|
+
import { EventEmiter } from "../event/EventEmiter";
|
|
3
4
|
import { PopsCore } from "../PopsCore";
|
|
4
5
|
import type { PopsUtilsOwnObject } from "../types/main";
|
|
5
|
-
import { EventEmiter } from "../event/EventEmiter";
|
|
6
6
|
|
|
7
7
|
class PopsUtils {
|
|
8
8
|
/**
|