@whitesev/pops 4.2.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 +82 -61
- 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 +82 -61
- 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 +82 -61
- 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 +82 -61
- 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 +82 -61
- 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 +82 -61
- 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 +6 -6
- package/dist/types/src/types/PopsDOMUtilsEventType.d.ts +3 -3
- package/dist/types/src/utils/PopsDOMUtils.d.ts +6 -6
- package/package.json +1 -1
- package/src/types/PopsDOMUtilsEventType.d.ts +3 -3
- package/src/utils/PopsDOMUtils.ts +101 -82
package/dist/types/src/Pops.d.ts
CHANGED
|
@@ -185,10 +185,10 @@ declare class Pops {
|
|
|
185
185
|
on<T extends Event>(element: import("./types/PopsDOMUtilsEventType").PopsDOMUtilsElementEventType, eventType: string | string[], callback: (this: HTMLElement, event: T) => void, option?: import("./types/PopsDOMUtilsEventType").PopsDOMUtilsEventListenerOption | boolean): import("./types/PopsDOMUtilsEventType").PopsDOMUtilsAddEventListenerResult;
|
|
186
186
|
on<T extends import("./types/PopsDOMUtilsEventType").PopsDOMUtils_EventType>(element: import("./types/PopsDOMUtilsEventType").PopsDOMUtilsElementEventType, eventType: T | T[], selector: string | string[] | undefined | null, callback: (this: HTMLElement, event: import("./types/PopsDOMUtilsEventType").PopsDOMUtils_Event[T], selectorTarget: HTMLElement) => void, option?: import("./types/PopsDOMUtilsEventType").PopsDOMUtilsEventListenerOption | boolean): import("./types/PopsDOMUtilsEventType").PopsDOMUtilsAddEventListenerResult;
|
|
187
187
|
on<T extends Event>(element: import("./types/PopsDOMUtilsEventType").PopsDOMUtilsElementEventType, eventType: string | string[], selector: string | string[] | undefined | null, callback: (this: HTMLElement, event: T, selectorTarget: HTMLElement) => void, option?: import("./types/PopsDOMUtilsEventType").PopsDOMUtilsEventListenerOption | boolean): import("./types/PopsDOMUtilsEventType").PopsDOMUtilsAddEventListenerResult;
|
|
188
|
-
off<T extends import("./types/PopsDOMUtilsEventType").PopsDOMUtils_EventType>(element: import("./types/PopsDOMUtilsEventType").PopsDOMUtilsElementEventType, eventType: T | T[], callback?: ((this:
|
|
189
|
-
off<T extends Event>(element: import("./types/PopsDOMUtilsEventType").PopsDOMUtilsElementEventType, eventType: string | string[], callback?: ((this:
|
|
190
|
-
off<T extends import("./types/PopsDOMUtilsEventType").PopsDOMUtils_EventType>(element: import("./types/PopsDOMUtilsEventType").PopsDOMUtilsElementEventType, eventType: T | T[], selector?: string | string[] | undefined | null, callback?: ((this:
|
|
191
|
-
off<T extends Event>(element: import("./types/PopsDOMUtilsEventType").PopsDOMUtilsElementEventType, eventType: string | string[], selector?: string | string[] | undefined | null, callback?: ((this:
|
|
188
|
+
off<T extends import("./types/PopsDOMUtilsEventType").PopsDOMUtils_EventType>(element: import("./types/PopsDOMUtilsEventType").PopsDOMUtilsElementEventType, eventType: T | T[], callback?: (<E extends HTMLElement = HTMLElement>(this: E, event: import("./types/PopsDOMUtilsEventType").PopsDOMUtils_Event[T]) => void) | undefined, option?: EventListenerOptions | boolean, filter?: (value: import("./types/PopsDOMUtilsEventType").PopsDOMUtilsEventListenerOptionsAttribute, index: number, array: import("./types/PopsDOMUtilsEventType").PopsDOMUtilsEventListenerOptionsAttribute[]) => boolean): void;
|
|
189
|
+
off<T extends Event>(element: import("./types/PopsDOMUtilsEventType").PopsDOMUtilsElementEventType, eventType: string | string[], callback?: (<E extends HTMLElement = HTMLElement>(this: E, event: T) => void) | undefined, option?: EventListenerOptions | boolean, filter?: (value: import("./types/PopsDOMUtilsEventType").PopsDOMUtilsEventListenerOptionsAttribute, index: number, array: import("./types/PopsDOMUtilsEventType").PopsDOMUtilsEventListenerOptionsAttribute[]) => boolean): void;
|
|
190
|
+
off<T extends import("./types/PopsDOMUtilsEventType").PopsDOMUtils_EventType>(element: import("./types/PopsDOMUtilsEventType").PopsDOMUtilsElementEventType, eventType: T | T[], selector?: string | string[] | undefined | null, callback?: (<E extends HTMLElement = HTMLElement>(this: E, event: import("./types/PopsDOMUtilsEventType").PopsDOMUtils_Event[T], $selector: E) => void) | undefined, option?: EventListenerOptions | boolean, filter?: (value: import("./types/PopsDOMUtilsEventType").PopsDOMUtilsEventListenerOptionsAttribute, index: number, array: import("./types/PopsDOMUtilsEventType").PopsDOMUtilsEventListenerOptionsAttribute[]) => boolean): void;
|
|
191
|
+
off<T extends Event>(element: import("./types/PopsDOMUtilsEventType").PopsDOMUtilsElementEventType, eventType: string | string[], selector?: string | string[] | undefined | null, callback?: (<E extends HTMLElement = HTMLElement>(this: E, event: T, $selector: E) => void) | undefined, option?: EventListenerOptions | boolean, filter?: (value: import("./types/PopsDOMUtilsEventType").PopsDOMUtilsEventListenerOptionsAttribute, index: number, array: import("./types/PopsDOMUtilsEventType").PopsDOMUtilsEventListenerOptionsAttribute[]) => boolean): void;
|
|
192
192
|
offAll(element: import("./types/PopsDOMUtilsEventType").PopsDOMUtilsElementEventType, eventType?: string): void;
|
|
193
193
|
offAll(element: import("./types/PopsDOMUtilsEventType").PopsDOMUtilsElementEventType, eventType?: import("./types/PopsDOMUtilsEventType").PopsDOMUtils_EventType | import("./types/PopsDOMUtilsEventType").PopsDOMUtils_EventType[]): void;
|
|
194
194
|
onReady<T extends (...args: any[]) => any>(callback: T): void;
|
|
@@ -202,13 +202,13 @@ declare class Pops {
|
|
|
202
202
|
onKeydown(target: HTMLElement | Window | typeof globalThis | string, handler: (event: import("./types/PopsDOMUtilsEventType").PopsDOMUtils_Event["keydown"]) => void, option?: boolean | AddEventListenerOptions): import("./types/PopsDOMUtilsEventType").PopsDOMUtilsAddEventListenerResult | undefined;
|
|
203
203
|
preventEvent(event: Event): false;
|
|
204
204
|
preventEvent<T extends boolean>(event: Event, onlyStopPropagation: T): T extends true ? void : false;
|
|
205
|
-
preventEvent($el:
|
|
205
|
+
preventEvent($el: Element | Document | ShadowRoot, eventNameList: string | string[], option?: {
|
|
206
206
|
capture?: boolean;
|
|
207
207
|
onlyStopPropagation?: boolean;
|
|
208
208
|
}): {
|
|
209
209
|
off(): void;
|
|
210
210
|
};
|
|
211
|
-
preventEvent($el:
|
|
211
|
+
preventEvent($el: Element | Document | ShadowRoot, eventNameList: string | string[], selector: string | string[] | null | undefined, option?: {
|
|
212
212
|
capture?: boolean;
|
|
213
213
|
onlyStopPropagation?: boolean;
|
|
214
214
|
}): {
|
|
@@ -209,9 +209,9 @@ export type PopsDOMUtils_EventType = keyof PopsDOMUtils_Event;
|
|
|
209
209
|
*/
|
|
210
210
|
export declare interface PopsDOMUtilsEventListenerOptionsAttribute {
|
|
211
211
|
/**
|
|
212
|
-
* DOMUtils的
|
|
212
|
+
* DOMUtils的handlerCallBack,元素上的监听事件就是它,移除事件时也需要传入这个函数
|
|
213
213
|
*/
|
|
214
|
-
|
|
214
|
+
handlerCallBack: (event: Event, $selector?: HTMLElement) => void;
|
|
215
215
|
/**
|
|
216
216
|
* 属性配置
|
|
217
217
|
*/
|
|
@@ -219,7 +219,7 @@ export declare interface PopsDOMUtilsEventListenerOptionsAttribute {
|
|
|
219
219
|
/**
|
|
220
220
|
* 用户添加的事件
|
|
221
221
|
*/
|
|
222
|
-
|
|
222
|
+
callback: (event: Event, $selector?: HTMLElement) => void;
|
|
223
223
|
/**
|
|
224
224
|
* 子元素选择器
|
|
225
225
|
*/
|
|
@@ -101,7 +101,7 @@ declare class PopsDOMUtilsEvent {
|
|
|
101
101
|
* DOMUtils.off(document.querySelector("a.xx"),"click")
|
|
102
102
|
* DOMUtils.off("a.xx","click")
|
|
103
103
|
*/
|
|
104
|
-
off<T extends PopsDOMUtils_EventType>(element: PopsDOMUtilsElementEventType, eventType: T | T[], callback?: (this:
|
|
104
|
+
off<T extends PopsDOMUtils_EventType>(element: PopsDOMUtilsElementEventType, eventType: T | T[], callback?: <E extends HTMLElement = HTMLElement>(this: E, event: PopsDOMUtils_Event[T]) => void, option?: EventListenerOptions | boolean, filter?: (value: PopsDOMUtilsEventListenerOptionsAttribute, index: number, array: PopsDOMUtilsEventListenerOptionsAttribute[]) => boolean): void;
|
|
105
105
|
/**
|
|
106
106
|
* 取消绑定事件
|
|
107
107
|
* @param element 需要取消绑定的元素|元素数组
|
|
@@ -115,7 +115,7 @@ declare class PopsDOMUtilsEvent {
|
|
|
115
115
|
* DOMUtils.off(document.querySelector("a.xx"),"click")
|
|
116
116
|
* DOMUtils.off("a.xx","click")
|
|
117
117
|
*/
|
|
118
|
-
off<T extends Event>(element: PopsDOMUtilsElementEventType, eventType: string | string[], callback?: (this:
|
|
118
|
+
off<T extends Event>(element: PopsDOMUtilsElementEventType, eventType: string | string[], callback?: <E extends HTMLElement = HTMLElement>(this: E, event: T) => void, option?: EventListenerOptions | boolean, filter?: (value: PopsDOMUtilsEventListenerOptionsAttribute, index: number, array: PopsDOMUtilsEventListenerOptionsAttribute[]) => boolean): void;
|
|
119
119
|
/**
|
|
120
120
|
* 取消绑定事件
|
|
121
121
|
* @param element 需要取消绑定的元素|元素数组
|
|
@@ -130,7 +130,7 @@ declare class PopsDOMUtilsEvent {
|
|
|
130
130
|
* DOMUtils.off(document.querySelector("a.xx"),"click tap hover")
|
|
131
131
|
* DOMUtils.off("a.xx",["click","tap","hover"])
|
|
132
132
|
*/
|
|
133
|
-
off<T extends PopsDOMUtils_EventType>(element: PopsDOMUtilsElementEventType, eventType: T | T[], selector?: string | string[] | undefined | null, callback?: (this:
|
|
133
|
+
off<T extends PopsDOMUtils_EventType>(element: PopsDOMUtilsElementEventType, eventType: T | T[], selector?: string | string[] | undefined | null, callback?: <E extends HTMLElement = HTMLElement>(this: E, event: PopsDOMUtils_Event[T], $selector: E) => void, option?: EventListenerOptions | boolean, filter?: (value: PopsDOMUtilsEventListenerOptionsAttribute, index: number, array: PopsDOMUtilsEventListenerOptionsAttribute[]) => boolean): void;
|
|
134
134
|
/**
|
|
135
135
|
* 取消绑定事件
|
|
136
136
|
* @param element 需要取消绑定的元素|元素数组
|
|
@@ -145,7 +145,7 @@ declare class PopsDOMUtilsEvent {
|
|
|
145
145
|
* DOMUtils.off(document.querySelector("a.xx"),"click tap hover")
|
|
146
146
|
* DOMUtils.off("a.xx",["click","tap","hover"])
|
|
147
147
|
*/
|
|
148
|
-
off<T extends Event>(element: PopsDOMUtilsElementEventType, eventType: string | string[], selector?: string | string[] | undefined | null, callback?: (this:
|
|
148
|
+
off<T extends Event>(element: PopsDOMUtilsElementEventType, eventType: string | string[], selector?: string | string[] | undefined | null, callback?: <E extends HTMLElement = HTMLElement>(this: E, event: T, $selector: E) => void, option?: EventListenerOptions | boolean, filter?: (value: PopsDOMUtilsEventListenerOptionsAttribute, index: number, array: PopsDOMUtilsEventListenerOptionsAttribute[]) => boolean): void;
|
|
149
149
|
/**
|
|
150
150
|
* 取消绑定所有的事件
|
|
151
151
|
* @param element 需要取消绑定的元素|元素数组
|
|
@@ -325,7 +325,7 @@ declare class PopsDOMUtilsEvent {
|
|
|
325
325
|
* onlyStopPropagation: true,
|
|
326
326
|
* })
|
|
327
327
|
*/
|
|
328
|
-
preventEvent($el:
|
|
328
|
+
preventEvent($el: Element | Document | ShadowRoot, eventNameList: string | string[], option?: {
|
|
329
329
|
/** (可选)是否捕获,默认false */
|
|
330
330
|
capture?: boolean;
|
|
331
331
|
/** (可选)是否仅阻止事件的传播,默认false,不调用`.preventDefault()` */
|
|
@@ -352,7 +352,7 @@ declare class PopsDOMUtilsEvent {
|
|
|
352
352
|
* onlyStopPropagation: true,
|
|
353
353
|
* })
|
|
354
354
|
*/
|
|
355
|
-
preventEvent($el:
|
|
355
|
+
preventEvent($el: Element | Document | ShadowRoot, eventNameList: string | string[], selector: string | string[] | null | undefined, option?: {
|
|
356
356
|
/** (可选)是否捕获,默认false */
|
|
357
357
|
capture?: boolean;
|
|
358
358
|
/** (可选)是否仅阻止事件的传播,默认false,不调用`.preventDefault()` */
|
package/package.json
CHANGED
|
@@ -209,9 +209,9 @@ export type PopsDOMUtils_EventType = keyof PopsDOMUtils_Event;
|
|
|
209
209
|
*/
|
|
210
210
|
export declare interface PopsDOMUtilsEventListenerOptionsAttribute {
|
|
211
211
|
/**
|
|
212
|
-
* DOMUtils的
|
|
212
|
+
* DOMUtils的handlerCallBack,元素上的监听事件就是它,移除事件时也需要传入这个函数
|
|
213
213
|
*/
|
|
214
|
-
|
|
214
|
+
handlerCallBack: (event: Event, $selector?: HTMLElement) => void;
|
|
215
215
|
/**
|
|
216
216
|
* 属性配置
|
|
217
217
|
*/
|
|
@@ -219,7 +219,7 @@ export declare interface PopsDOMUtilsEventListenerOptionsAttribute {
|
|
|
219
219
|
/**
|
|
220
220
|
* 用户添加的事件
|
|
221
221
|
*/
|
|
222
|
-
|
|
222
|
+
callback: (event: Event, $selector?: HTMLElement) => void;
|
|
223
223
|
/**
|
|
224
224
|
* 子元素选择器
|
|
225
225
|
*/
|
|
@@ -138,10 +138,10 @@ class PopsDOMUtilsEvent {
|
|
|
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,
|
|
@@ -235,39 +234,51 @@ class PopsDOMUtilsEvent {
|
|
|
235
234
|
/**
|
|
236
235
|
* 如果是once,那么删除该监听和元素上的事件和监听
|
|
237
236
|
*/
|
|
238
|
-
|
|
237
|
+
const checkOptionOnceToRemoveEventListener = ($el: PopsDOMUtilsElementEventType) => {
|
|
239
238
|
if (listenerOption.once) {
|
|
240
|
-
|
|
239
|
+
this.off($el, eventTypeList, selector as any, callback as any, option);
|
|
241
240
|
}
|
|
242
|
-
}
|
|
243
|
-
$elList.forEach((
|
|
241
|
+
};
|
|
242
|
+
$elList.forEach(($elItem) => {
|
|
244
243
|
/**
|
|
245
244
|
* 事件回调
|
|
246
245
|
* @param event
|
|
247
246
|
*/
|
|
248
|
-
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;
|
|
249
252
|
if (selectorList.length) {
|
|
250
253
|
// 存在子元素选择器
|
|
251
254
|
// 这时候的this和target都是子元素选择器的元素
|
|
252
|
-
let
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
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);
|
|
259
261
|
}
|
|
262
|
+
$target = composedPath[0] as HTMLElement;
|
|
263
|
+
} else {
|
|
264
|
+
$target = event.target as HTMLElement;
|
|
265
|
+
}
|
|
266
|
+
let $parent = $elItem;
|
|
267
|
+
if (popsUtils.isWin($parent)) {
|
|
268
|
+
// window和document共用一个对象
|
|
269
|
+
// 这样就能处理子元素选择器无法匹配的问题
|
|
270
|
+
$parent = PopsCore.document.documentElement;
|
|
260
271
|
}
|
|
261
|
-
const findValue = selectorList.find((
|
|
272
|
+
const findValue = selectorList.find((selectors) => {
|
|
262
273
|
// 判断目标元素是否匹配选择器
|
|
263
|
-
if (that.matches(
|
|
274
|
+
if (that.matches($target, selectors)) {
|
|
264
275
|
// 当前目标可以被selector所匹配到
|
|
265
276
|
return true;
|
|
266
277
|
}
|
|
267
278
|
// 在上层与主元素之间寻找可以被selector所匹配到的
|
|
268
|
-
const $closestMatches = that.closest<HTMLElement>(
|
|
269
|
-
if ($closestMatches &&
|
|
270
|
-
|
|
279
|
+
const $closestMatches = that.closest<HTMLElement>($target, selectors);
|
|
280
|
+
if ($closestMatches && (<HTMLElement>$parent)?.contains?.($closestMatches)) {
|
|
281
|
+
$target = $closestMatches;
|
|
271
282
|
return true;
|
|
272
283
|
}
|
|
273
284
|
return false;
|
|
@@ -277,39 +288,48 @@ class PopsDOMUtilsEvent {
|
|
|
277
288
|
try {
|
|
278
289
|
OriginPrototype.Object.defineProperty(event, "target", {
|
|
279
290
|
get() {
|
|
280
|
-
return
|
|
291
|
+
return $target;
|
|
281
292
|
},
|
|
282
293
|
});
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
294
|
+
// oxlint-disable-next-line no-empty
|
|
295
|
+
} catch {}
|
|
296
|
+
execCallback = true;
|
|
297
|
+
call_this = $target;
|
|
298
|
+
call_event = event;
|
|
299
|
+
call_$selector = $target;
|
|
288
300
|
}
|
|
289
301
|
} else {
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
302
|
+
execCallback = true;
|
|
303
|
+
call_this = $elItem as Element;
|
|
304
|
+
call_event = event;
|
|
293
305
|
}
|
|
294
|
-
|
|
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
|
+
};
|
|
295
314
|
|
|
296
315
|
// 遍历事件名设置元素事件
|
|
297
316
|
eventTypeList.forEach((eventName) => {
|
|
298
|
-
|
|
317
|
+
// add listener
|
|
318
|
+
$elItem.addEventListener(eventName, handlerCallBack, listenerOption);
|
|
299
319
|
// 获取对象上的事件
|
|
300
320
|
const elementEvents: {
|
|
301
321
|
[k: string]: PopsDOMUtilsEventListenerOptionsAttribute[];
|
|
302
|
-
} = Reflect.get(
|
|
322
|
+
} = Reflect.get($elItem, SymbolEvents) || {};
|
|
303
323
|
// 初始化对象上的xx事件
|
|
304
324
|
elementEvents[eventName] = elementEvents[eventName] || [];
|
|
305
325
|
elementEvents[eventName].push({
|
|
306
326
|
selector: selectorList,
|
|
307
327
|
option: listenerOption,
|
|
308
|
-
|
|
309
|
-
|
|
328
|
+
handlerCallBack: handlerCallBack,
|
|
329
|
+
callback: listenerCallBack,
|
|
310
330
|
});
|
|
311
331
|
// 覆盖事件
|
|
312
|
-
Reflect.set(
|
|
332
|
+
Reflect.set($elItem, SymbolEvents, elementEvents);
|
|
313
333
|
});
|
|
314
334
|
});
|
|
315
335
|
|
|
@@ -329,11 +349,11 @@ class PopsDOMUtilsEvent {
|
|
|
329
349
|
},
|
|
330
350
|
/**
|
|
331
351
|
* 主动触发事件
|
|
332
|
-
* @param
|
|
333
|
-
* @param
|
|
352
|
+
* @param extraDetails 赋予触发的Event的额外属性,如果是Event类型,那么将自动代替默认new的Event对象
|
|
353
|
+
* @param useDispatchToTriggerEvent 是否使用dispatchEvent来触发事件,默认true,如果为false,则直接调用callback,但是这种会让使用了`$selector`的没有值
|
|
334
354
|
*/
|
|
335
|
-
emit: (
|
|
336
|
-
that.emit($elList, eventTypeList,
|
|
355
|
+
emit: (extraDetails?: object, useDispatchToTriggerEvent?: boolean) => {
|
|
356
|
+
that.emit($elList, eventTypeList, extraDetails, useDispatchToTriggerEvent);
|
|
337
357
|
},
|
|
338
358
|
};
|
|
339
359
|
}
|
|
@@ -353,7 +373,7 @@ class PopsDOMUtilsEvent {
|
|
|
353
373
|
off<T extends PopsDOMUtils_EventType>(
|
|
354
374
|
element: PopsDOMUtilsElementEventType,
|
|
355
375
|
eventType: T | T[],
|
|
356
|
-
callback?: (this:
|
|
376
|
+
callback?: <E extends HTMLElement = HTMLElement>(this: E, event: PopsDOMUtils_Event[T]) => void,
|
|
357
377
|
option?: EventListenerOptions | boolean,
|
|
358
378
|
filter?: (
|
|
359
379
|
value: PopsDOMUtilsEventListenerOptionsAttribute,
|
|
@@ -377,7 +397,7 @@ class PopsDOMUtilsEvent {
|
|
|
377
397
|
off<T extends Event>(
|
|
378
398
|
element: PopsDOMUtilsElementEventType,
|
|
379
399
|
eventType: string | string[],
|
|
380
|
-
callback?: (this:
|
|
400
|
+
callback?: <E extends HTMLElement = HTMLElement>(this: E, event: T) => void,
|
|
381
401
|
option?: EventListenerOptions | boolean,
|
|
382
402
|
filter?: (
|
|
383
403
|
value: PopsDOMUtilsEventListenerOptionsAttribute,
|
|
@@ -403,7 +423,7 @@ class PopsDOMUtilsEvent {
|
|
|
403
423
|
element: PopsDOMUtilsElementEventType,
|
|
404
424
|
eventType: T | T[],
|
|
405
425
|
selector?: string | string[] | undefined | null,
|
|
406
|
-
callback?: (this:
|
|
426
|
+
callback?: <E extends HTMLElement = HTMLElement>(this: E, event: PopsDOMUtils_Event[T], $selector: E) => void,
|
|
407
427
|
option?: EventListenerOptions | boolean,
|
|
408
428
|
filter?: (
|
|
409
429
|
value: PopsDOMUtilsEventListenerOptionsAttribute,
|
|
@@ -429,7 +449,7 @@ class PopsDOMUtilsEvent {
|
|
|
429
449
|
element: PopsDOMUtilsElementEventType,
|
|
430
450
|
eventType: string | string[],
|
|
431
451
|
selector?: string | string[] | undefined | null,
|
|
432
|
-
callback?: (this:
|
|
452
|
+
callback?: <E extends HTMLElement = HTMLElement>(this: E, event: T, $selector: E) => void,
|
|
433
453
|
option?: EventListenerOptions | boolean,
|
|
434
454
|
filter?: (
|
|
435
455
|
value: PopsDOMUtilsEventListenerOptionsAttribute,
|
|
@@ -444,9 +464,12 @@ class PopsDOMUtilsEvent {
|
|
|
444
464
|
| string
|
|
445
465
|
| string[]
|
|
446
466
|
| undefined
|
|
447
|
-
| ((this:
|
|
467
|
+
| (<E extends HTMLElement = HTMLElement>(this: E, event: T, $selector: E) => void)
|
|
448
468
|
| null,
|
|
449
|
-
callback?:
|
|
469
|
+
callback?:
|
|
470
|
+
| (<E extends HTMLElement = HTMLElement>(this: E, event: T, $selector: E) => void)
|
|
471
|
+
| EventListenerOptions
|
|
472
|
+
| boolean,
|
|
450
473
|
option?:
|
|
451
474
|
| EventListenerOptions
|
|
452
475
|
| boolean
|
|
@@ -467,7 +490,7 @@ class PopsDOMUtilsEvent {
|
|
|
467
490
|
* @param startIndex
|
|
468
491
|
* @param option
|
|
469
492
|
*/
|
|
470
|
-
function
|
|
493
|
+
const getOption = function (args1: IArguments, startIndex: number, option: EventListenerOptions) {
|
|
471
494
|
const currentParam: EventListenerOptions | boolean = args1[startIndex];
|
|
472
495
|
if (typeof currentParam === "boolean") {
|
|
473
496
|
option.capture = currentParam;
|
|
@@ -475,12 +498,12 @@ class PopsDOMUtilsEvent {
|
|
|
475
498
|
option.capture = currentParam.capture;
|
|
476
499
|
}
|
|
477
500
|
return option;
|
|
478
|
-
}
|
|
479
|
-
const
|
|
501
|
+
};
|
|
502
|
+
const that = this;
|
|
480
503
|
// eslint-disable-next-line prefer-rest-params
|
|
481
504
|
const args = arguments;
|
|
482
505
|
if (typeof element === "string") {
|
|
483
|
-
element =
|
|
506
|
+
element = that.selectorAll(element);
|
|
484
507
|
}
|
|
485
508
|
if (element == null) {
|
|
486
509
|
return;
|
|
@@ -488,31 +511,27 @@ class PopsDOMUtilsEvent {
|
|
|
488
511
|
let $elList: HTMLElement[] = [];
|
|
489
512
|
if (element instanceof NodeList || Array.isArray(element)) {
|
|
490
513
|
element = element as HTMLElement[];
|
|
491
|
-
$elList = $elList.concat(element);
|
|
514
|
+
$elList = $elList.concat(Array.from(element));
|
|
492
515
|
} else {
|
|
493
516
|
$elList.push(element as HTMLElement);
|
|
494
517
|
}
|
|
495
518
|
let eventTypeList: string[] = [];
|
|
496
519
|
if (Array.isArray(eventType)) {
|
|
497
|
-
eventTypeList = eventTypeList.concat(
|
|
498
|
-
eventType.filter((eventTypeItem) => typeof eventTypeItem === "string" && eventTypeItem.toString() !== "")
|
|
499
|
-
);
|
|
520
|
+
eventTypeList = eventTypeList.concat(eventType.filter((it) => typeof it === "string" && it.toString() !== ""));
|
|
500
521
|
} else if (typeof eventType === "string") {
|
|
501
|
-
eventTypeList = eventTypeList.concat(eventType.split(" ").filter((
|
|
522
|
+
eventTypeList = eventTypeList.concat(eventType.split(" ").filter((it) => it !== ""));
|
|
502
523
|
}
|
|
503
524
|
// 子元素选择器
|
|
504
525
|
let selectorList: string[] = [];
|
|
505
526
|
if (Array.isArray(selector)) {
|
|
506
|
-
selectorList = selectorList.concat(
|
|
507
|
-
selector.filter((selectorItem) => typeof selectorItem === "string" && selectorItem.toString() !== "")
|
|
508
|
-
);
|
|
527
|
+
selectorList = selectorList.concat(selector.filter((it) => typeof it === "string" && it.toString() !== ""));
|
|
509
528
|
} else if (typeof selector === "string") {
|
|
510
529
|
selectorList.push(selector);
|
|
511
530
|
}
|
|
512
531
|
/**
|
|
513
532
|
* 事件的回调函数
|
|
514
533
|
*/
|
|
515
|
-
let listenerCallBack: (this: HTMLElement, event: T,
|
|
534
|
+
let listenerCallBack: (this: HTMLElement, event: T, $selector: HTMLElement) => void = callback as any;
|
|
516
535
|
|
|
517
536
|
/**
|
|
518
537
|
* 事件的配置
|
|
@@ -537,18 +556,18 @@ class PopsDOMUtilsEvent {
|
|
|
537
556
|
array: PopsDOMUtilsEventListenerOptionsAttribute[]
|
|
538
557
|
) => boolean;
|
|
539
558
|
}
|
|
540
|
-
$elList.forEach((
|
|
559
|
+
$elList.forEach(($elItem) => {
|
|
541
560
|
// 获取对象上的事件
|
|
542
561
|
const elementEvents: {
|
|
543
562
|
[key: string]: PopsDOMUtilsEventListenerOptionsAttribute[];
|
|
544
|
-
} = Reflect.get(
|
|
563
|
+
} = Reflect.get($elItem, SymbolEvents) || {};
|
|
545
564
|
eventTypeList.forEach((eventName) => {
|
|
546
565
|
const handlers = elementEvents[eventName] || [];
|
|
547
566
|
const filterHandler = typeof filter === "function" ? handlers.filter(filter) : handlers;
|
|
548
567
|
for (let index = 0; index < filterHandler.length; index++) {
|
|
549
568
|
const handler = filterHandler[index];
|
|
550
569
|
let flag = true;
|
|
551
|
-
if (flag && listenerCallBack && handler.
|
|
570
|
+
if (flag && listenerCallBack && handler.callback !== listenerCallBack) {
|
|
552
571
|
// callback不同
|
|
553
572
|
flag = false;
|
|
554
573
|
}
|
|
@@ -567,7 +586,7 @@ class PopsDOMUtilsEvent {
|
|
|
567
586
|
flag = false;
|
|
568
587
|
}
|
|
569
588
|
if (flag) {
|
|
570
|
-
|
|
589
|
+
$elItem.removeEventListener(eventName, handler.handlerCallBack, handler.option);
|
|
571
590
|
const findIndex = handlers.findIndex((item) => item === handler);
|
|
572
591
|
if (findIndex !== -1) {
|
|
573
592
|
handlers.splice(findIndex, 1);
|
|
@@ -579,7 +598,7 @@ class PopsDOMUtilsEvent {
|
|
|
579
598
|
popsUtils.delete(elementEvents, eventType);
|
|
580
599
|
}
|
|
581
600
|
});
|
|
582
|
-
Reflect.set(
|
|
601
|
+
Reflect.set($elItem, SymbolEvents, elementEvents);
|
|
583
602
|
});
|
|
584
603
|
}
|
|
585
604
|
/**
|
|
@@ -1080,7 +1099,7 @@ class PopsDOMUtilsEvent {
|
|
|
1080
1099
|
* })
|
|
1081
1100
|
*/
|
|
1082
1101
|
preventEvent(
|
|
1083
|
-
$el:
|
|
1102
|
+
$el: Element | Document | ShadowRoot,
|
|
1084
1103
|
eventNameList: string | string[],
|
|
1085
1104
|
option?: {
|
|
1086
1105
|
/** (可选)是否捕获,默认false */
|
|
@@ -1111,7 +1130,7 @@ class PopsDOMUtilsEvent {
|
|
|
1111
1130
|
* })
|
|
1112
1131
|
*/
|
|
1113
1132
|
preventEvent(
|
|
1114
|
-
$el:
|
|
1133
|
+
$el: Element | Document | ShadowRoot,
|
|
1115
1134
|
eventNameList: string | string[],
|
|
1116
1135
|
selector: string | string[] | null | undefined,
|
|
1117
1136
|
option?: {
|
|
@@ -1129,11 +1148,11 @@ class PopsDOMUtilsEvent {
|
|
|
1129
1148
|
* 阻止事件的默认行为发生,并阻止事件传播
|
|
1130
1149
|
*/
|
|
1131
1150
|
const stopEvent = (event: Event, onlyStopPropagation?: boolean) => {
|
|
1151
|
+
// 停止事件的传播,阻止它继续向更上层的元素冒泡,事件将不会再传播给其他的元素
|
|
1152
|
+
event?.stopPropagation();
|
|
1153
|
+
// 阻止事件传播,并且还能阻止元素上的其他事件处理程序被触发
|
|
1154
|
+
event?.stopImmediatePropagation();
|
|
1132
1155
|
if (typeof onlyStopPropagation === "boolean" && onlyStopPropagation) {
|
|
1133
|
-
// 停止事件的传播,阻止它继续向更上层的元素冒泡,事件将不会再传播给其他的元素
|
|
1134
|
-
event?.stopPropagation();
|
|
1135
|
-
// 阻止事件传播,并且还能阻止元素上的其他事件处理程序被触发
|
|
1136
|
-
event?.stopImmediatePropagation();
|
|
1137
1156
|
return;
|
|
1138
1157
|
}
|
|
1139
1158
|
// 阻止事件的默认行为发生。例如,当点击一个链接时,浏览器会默认打开链接的URL,或者在输入框内输入文字
|