@whitesev/domutils 1.4.7 → 1.5.0
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 +69 -35
- package/dist/index.amd.js.map +1 -1
- package/dist/index.cjs.js +69 -35
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.esm.js +69 -35
- package/dist/index.esm.js.map +1 -1
- package/dist/index.iife.js +69 -35
- package/dist/index.iife.js.map +1 -1
- package/dist/index.system.js +69 -35
- package/dist/index.system.js.map +1 -1
- package/dist/index.umd.js +69 -35
- package/dist/index.umd.js.map +1 -1
- package/dist/types/src/DOMUtilsCommonUtils.d.ts +6 -0
- package/dist/types/src/types/DOMUtilsEvent.d.ts +1 -0
- package/package.json +1 -1
- package/src/DOMUtils.ts +15 -7
- package/src/DOMUtilsCommonUtils.ts +22 -0
- package/src/DOMUtilsEvent.ts +28 -31
- package/src/types/DOMUtilsEvent.d.ts +1 -0
|
@@ -7,6 +7,12 @@ declare const DOMUtilsCommonUtils: {
|
|
|
7
7
|
* @param element
|
|
8
8
|
*/
|
|
9
9
|
isShow(element: HTMLElement): boolean;
|
|
10
|
+
/**
|
|
11
|
+
* 在CSP策略下设置innerHTML
|
|
12
|
+
* @param $el 元素
|
|
13
|
+
* @param text 文本
|
|
14
|
+
*/
|
|
15
|
+
setSafeHTML($el: HTMLElement, text: string): void;
|
|
10
16
|
/**
|
|
11
17
|
* 用于显示元素并获取它的高度宽度等其它属性
|
|
12
18
|
* @param element
|
|
@@ -17,6 +17,7 @@ export type DOMUtilsCreateElementAttributesMap = {
|
|
|
17
17
|
|
|
18
18
|
export interface DOMUtils_MouseEvent {
|
|
19
19
|
click: MouseEvent | PointerEvent;
|
|
20
|
+
auxclick: PointerEvent;
|
|
20
21
|
contextmenu: MouseEvent | PointerEvent;
|
|
21
22
|
dblclick: MouseEvent | PointerEvent;
|
|
22
23
|
mousedown: MouseEvent | PointerEvent;
|
package/package.json
CHANGED
package/src/DOMUtils.ts
CHANGED
|
@@ -20,7 +20,7 @@ class DOMUtils extends DOMUtilsEvent {
|
|
|
20
20
|
super(option);
|
|
21
21
|
}
|
|
22
22
|
/** 版本号 */
|
|
23
|
-
version = "
|
|
23
|
+
version = "2025.3.2";
|
|
24
24
|
/**
|
|
25
25
|
* 获取元素的属性值
|
|
26
26
|
* @param element 目标元素
|
|
@@ -112,7 +112,7 @@ class DOMUtils extends DOMUtilsEvent {
|
|
|
112
112
|
let DOMUtilsContext = this;
|
|
113
113
|
let tempElement = DOMUtilsContext.windowApi.document.createElement(tagName);
|
|
114
114
|
if (typeof property === "string") {
|
|
115
|
-
tempElement
|
|
115
|
+
DOMUtilsContext.html(tempElement, property);
|
|
116
116
|
return tempElement;
|
|
117
117
|
}
|
|
118
118
|
if (property == null) {
|
|
@@ -123,6 +123,10 @@ class DOMUtils extends DOMUtilsEvent {
|
|
|
123
123
|
}
|
|
124
124
|
Object.keys(property).forEach((key) => {
|
|
125
125
|
let value = property[key];
|
|
126
|
+
if (key === "innerHTML") {
|
|
127
|
+
DOMUtilsContext.html(tempElement, value);
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
126
130
|
(tempElement as any)[key] = value;
|
|
127
131
|
});
|
|
128
132
|
Object.keys(attributes).forEach((key) => {
|
|
@@ -424,7 +428,7 @@ class DOMUtils extends DOMUtilsEvent {
|
|
|
424
428
|
html = html.innerHTML;
|
|
425
429
|
}
|
|
426
430
|
if ("innerHTML" in element) {
|
|
427
|
-
element
|
|
431
|
+
DOMUtilsCommonUtils.setSafeHTML(element, html);
|
|
428
432
|
}
|
|
429
433
|
}
|
|
430
434
|
}
|
|
@@ -627,7 +631,11 @@ class DOMUtils extends DOMUtilsEvent {
|
|
|
627
631
|
if (propValue == null) {
|
|
628
632
|
return Reflect.get(element, propName);
|
|
629
633
|
} else {
|
|
630
|
-
|
|
634
|
+
if (element instanceof Element && propName === "innerHTML") {
|
|
635
|
+
DOMUtilsContext.html(element, propValue);
|
|
636
|
+
} else {
|
|
637
|
+
Reflect.set(element, propName, propValue);
|
|
638
|
+
}
|
|
631
639
|
}
|
|
632
640
|
}
|
|
633
641
|
/**
|
|
@@ -1034,7 +1042,7 @@ class DOMUtils extends DOMUtilsEvent {
|
|
|
1034
1042
|
});
|
|
1035
1043
|
return;
|
|
1036
1044
|
}
|
|
1037
|
-
element
|
|
1045
|
+
DOMUtilsContext.html(element, "");
|
|
1038
1046
|
}
|
|
1039
1047
|
/**
|
|
1040
1048
|
* 获取元素相对于文档的偏移坐标(加上文档的滚动条)
|
|
@@ -1476,7 +1484,7 @@ class DOMUtils extends DOMUtilsEvent {
|
|
|
1476
1484
|
element = element as HTMLElement;
|
|
1477
1485
|
// 创建一个新的div元素,并将wrapperHTML作为其innerHTML
|
|
1478
1486
|
let wrapper = DOMUtilsContext.windowApi.document.createElement("div");
|
|
1479
|
-
wrapper
|
|
1487
|
+
DOMUtilsContext.html(wrapper, wrapperHTML);
|
|
1480
1488
|
|
|
1481
1489
|
let wrapperFirstChild = wrapper.firstChild as HTMLElement;
|
|
1482
1490
|
// 将要包裹的元素插入目标元素前面
|
|
@@ -1663,7 +1671,7 @@ class DOMUtils extends DOMUtilsEvent {
|
|
|
1663
1671
|
}
|
|
1664
1672
|
function parseHTMLByCreateDom() {
|
|
1665
1673
|
let tempDIV = DOMUtilsContext.windowApi.document.createElement("div");
|
|
1666
|
-
tempDIV
|
|
1674
|
+
DOMUtilsContext.html(tempDIV, html);
|
|
1667
1675
|
if (isComplete) {
|
|
1668
1676
|
return tempDIV;
|
|
1669
1677
|
} else {
|
|
@@ -14,6 +14,28 @@ const DOMUtilsCommonUtils = {
|
|
|
14
14
|
isShow(element: HTMLElement) {
|
|
15
15
|
return Boolean(element.getClientRects().length);
|
|
16
16
|
},
|
|
17
|
+
/**
|
|
18
|
+
* 在CSP策略下设置innerHTML
|
|
19
|
+
* @param $el 元素
|
|
20
|
+
* @param text 文本
|
|
21
|
+
*/
|
|
22
|
+
setSafeHTML($el: HTMLElement, text: string) {
|
|
23
|
+
// 创建 TrustedHTML 策略(需 CSP 允许)
|
|
24
|
+
try {
|
|
25
|
+
$el.innerHTML = text;
|
|
26
|
+
} catch (error) {
|
|
27
|
+
// @ts-ignore
|
|
28
|
+
if (globalThis.trustedTypes) {
|
|
29
|
+
// @ts-ignore
|
|
30
|
+
const policy = globalThis.trustedTypes.createPolicy("safe-innerHTML", {
|
|
31
|
+
createHTML: (html: string) => html,
|
|
32
|
+
});
|
|
33
|
+
$el.innerHTML = policy.createHTML(text);
|
|
34
|
+
} else {
|
|
35
|
+
throw new Error("trustedTypes is not defined");
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
},
|
|
17
39
|
/**
|
|
18
40
|
* 用于显示元素并获取它的高度宽度等其它属性
|
|
19
41
|
* @param element
|
package/src/DOMUtilsEvent.ts
CHANGED
|
@@ -265,47 +265,44 @@ export class DOMUtilsEvent {
|
|
|
265
265
|
* @param event
|
|
266
266
|
*/
|
|
267
267
|
function domUtilsEventCallBack(event: Event) {
|
|
268
|
-
let eventTarget = listenerOption.isComposedPath
|
|
269
|
-
? (event.composedPath()[0] as HTMLElement)
|
|
270
|
-
: (event.target as HTMLElement);
|
|
271
268
|
if (selectorList.length) {
|
|
272
269
|
/* 存在子元素选择器 */
|
|
270
|
+
// 这时候的this和target都是子元素选择器的元素
|
|
271
|
+
let eventTarget = listenerOption.isComposedPath
|
|
272
|
+
? (event.composedPath()[0] as HTMLElement)
|
|
273
|
+
: (event.target as HTMLElement);
|
|
273
274
|
let totalParent = DOMUtilsCommonUtils.isWin(elementItem)
|
|
274
275
|
? DOMUtilsContext.windowApi.document.documentElement
|
|
275
276
|
: elementItem;
|
|
276
|
-
|
|
277
|
-
|
|
277
|
+
let findValue = selectorList.find((selectorItem) => {
|
|
278
|
+
// 判断目标元素是否匹配选择器
|
|
278
279
|
if (eventTarget.matches(selectorItem)) {
|
|
279
280
|
/* 当前目标可以被selector所匹配到 */
|
|
280
|
-
|
|
281
|
-
checkOptionOnceToRemoveEventListener();
|
|
282
|
-
break;
|
|
283
|
-
} else {
|
|
284
|
-
/* 在上层与主元素之间寻找可以被selector所匹配到的 */
|
|
285
|
-
let $closestMatches = eventTarget.closest(
|
|
286
|
-
selectorItem
|
|
287
|
-
) as HTMLElement | null;
|
|
288
|
-
if ($closestMatches && totalParent.contains($closestMatches)) {
|
|
289
|
-
/* event的target值不能直接修改 */
|
|
290
|
-
// 这里尝试使用defineProperty修改event的target值
|
|
291
|
-
try {
|
|
292
|
-
OriginPrototype.Object.defineProperty(event, "target", {
|
|
293
|
-
get() {
|
|
294
|
-
return $closestMatches;
|
|
295
|
-
},
|
|
296
|
-
});
|
|
297
|
-
} catch (error) {}
|
|
298
|
-
listenerCallBack.call(
|
|
299
|
-
$closestMatches,
|
|
300
|
-
event as any,
|
|
301
|
-
$closestMatches
|
|
302
|
-
);
|
|
303
|
-
checkOptionOnceToRemoveEventListener();
|
|
304
|
-
break;
|
|
305
|
-
}
|
|
281
|
+
return true;
|
|
306
282
|
}
|
|
283
|
+
/* 在上层与主元素之间寻找可以被selector所匹配到的 */
|
|
284
|
+
let $closestMatches =
|
|
285
|
+
eventTarget.closest<HTMLElement>(selectorItem);
|
|
286
|
+
if ($closestMatches && totalParent.contains($closestMatches)) {
|
|
287
|
+
eventTarget = $closestMatches;
|
|
288
|
+
return true;
|
|
289
|
+
}
|
|
290
|
+
return false;
|
|
291
|
+
});
|
|
292
|
+
if (findValue) {
|
|
293
|
+
// 这里尝试使用defineProperty修改event的target值
|
|
294
|
+
try {
|
|
295
|
+
OriginPrototype.Object.defineProperty(event, "target", {
|
|
296
|
+
get() {
|
|
297
|
+
return eventTarget;
|
|
298
|
+
},
|
|
299
|
+
});
|
|
300
|
+
} catch (error) {}
|
|
301
|
+
listenerCallBack.call(eventTarget, event as any, eventTarget);
|
|
302
|
+
checkOptionOnceToRemoveEventListener();
|
|
307
303
|
}
|
|
308
304
|
} else {
|
|
305
|
+
// 这时候的this指向监听的元素
|
|
309
306
|
listenerCallBack.call(elementItem, event as any);
|
|
310
307
|
checkOptionOnceToRemoveEventListener();
|
|
311
308
|
}
|
|
@@ -17,6 +17,7 @@ export type DOMUtilsCreateElementAttributesMap = {
|
|
|
17
17
|
|
|
18
18
|
export interface DOMUtils_MouseEvent {
|
|
19
19
|
click: MouseEvent | PointerEvent;
|
|
20
|
+
auxclick: PointerEvent;
|
|
20
21
|
contextmenu: MouseEvent | PointerEvent;
|
|
21
22
|
dblclick: MouseEvent | PointerEvent;
|
|
22
23
|
mousedown: MouseEvent | PointerEvent;
|