@whitesev/utils 2.0.1 → 2.1.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 +183 -173
- package/dist/index.amd.js.map +1 -1
- package/dist/index.cjs.js +183 -173
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.esm.js +183 -173
- package/dist/index.esm.js.map +1 -1
- package/dist/index.iife.js +183 -173
- package/dist/index.iife.js.map +1 -1
- package/dist/index.system.js +183 -173
- package/dist/index.system.js.map +1 -1
- package/dist/index.umd.js +183 -173
- package/dist/index.umd.js.map +1 -1
- package/dist/types/src/Utils.d.ts +5 -4
- package/dist/types/src/UtilsGMCookie.d.ts +6 -0
- package/dist/types/src/UtilsWindowApi.d.ts +22 -0
- package/dist/types/src/types/global.d.ts +1 -0
- package/package.json +2 -1
- package/src/Httpx.ts +3 -5
- package/src/Log.ts +1 -2
- package/src/Progress.ts +4 -10
- package/src/Utils.ts +139 -111
- package/src/UtilsCommon.ts +2 -4
- package/src/UtilsGMCookie.ts +29 -16
- package/src/UtilsGMMenu.ts +1 -2
- package/src/UtilsWindowApi.ts +44 -0
- package/src/indexedDB.ts +4 -6
- package/src/types/global.d.ts +1 -0
- package/dist/types/src/UtilsCore.d.ts +0 -16
- package/src/UtilsCore.ts +0 -47
package/src/Utils.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { ColorConversion } from "./ColorConversion";
|
|
2
2
|
import { GBKEncoder } from "./GBKEncoder";
|
|
3
|
-
import { UtilsCore } from "./UtilsCore";
|
|
4
3
|
import { UtilsGMCookie } from "./UtilsGMCookie";
|
|
5
4
|
import { AjaxHooker } from "./ajaxHooker/ajaxHooker.js";
|
|
6
5
|
import { GMMenu } from "./UtilsGMMenu";
|
|
@@ -13,10 +12,10 @@ import { Progress } from "./Progress";
|
|
|
13
12
|
import { TryCatch } from "./TryCatch";
|
|
14
13
|
import { UtilsDictionary } from "./Dictionary";
|
|
15
14
|
import type { DOMUtils_EventType } from "./Event";
|
|
16
|
-
import type { UtilsCoreOption } from "./UtilsCore";
|
|
17
15
|
import type { Vue2Object } from "./VueObject";
|
|
18
16
|
import type { UtilsAjaxHookResult } from "./AjaxHookerType";
|
|
19
17
|
import { GenerateUUID } from "./UtilsCommon";
|
|
18
|
+
import { UtilsWindowApi, type UtilsWindowApiOption } from "./UtilsWindowApi";
|
|
20
19
|
|
|
21
20
|
export declare var unsafeWindow: Window & typeof globalThis;
|
|
22
21
|
|
|
@@ -48,8 +47,9 @@ export declare interface AnyObject {
|
|
|
48
47
|
export declare interface Vue2Context extends Vue2Object {}
|
|
49
48
|
|
|
50
49
|
class Utils {
|
|
51
|
-
|
|
52
|
-
|
|
50
|
+
private windowApi: UtilsWindowApi;
|
|
51
|
+
constructor(option?: UtilsWindowApiOption) {
|
|
52
|
+
this.windowApi = new UtilsWindowApi(option);
|
|
53
53
|
}
|
|
54
54
|
/** 版本号 */
|
|
55
55
|
version = "2024.7.20";
|
|
@@ -67,23 +67,25 @@ class Utils {
|
|
|
67
67
|
if (typeof cssText !== "string") {
|
|
68
68
|
throw new Error("Utils.addStyle 参数cssText 必须为String类型");
|
|
69
69
|
}
|
|
70
|
-
let cssNode =
|
|
70
|
+
let cssNode = this.windowApi.document.createElement("style");
|
|
71
71
|
cssNode.setAttribute("type", "text/css");
|
|
72
72
|
cssNode.innerHTML = cssText;
|
|
73
|
-
if (
|
|
73
|
+
if (this.windowApi.document.head) {
|
|
74
74
|
/* 插入head最后 */
|
|
75
|
-
|
|
76
|
-
} else if (
|
|
75
|
+
this.windowApi.document.head.appendChild(cssNode);
|
|
76
|
+
} else if (this.windowApi.document.body) {
|
|
77
77
|
/* 插入body后 */
|
|
78
|
-
|
|
79
|
-
} else if (
|
|
78
|
+
this.windowApi.document.body.appendChild(cssNode);
|
|
79
|
+
} else if (
|
|
80
|
+
this.windowApi.document.documentElement.childNodes.length === 0
|
|
81
|
+
) {
|
|
80
82
|
/* 插入#html第一个元素后 */
|
|
81
|
-
|
|
83
|
+
this.windowApi.document.documentElement.appendChild(cssNode);
|
|
82
84
|
} else {
|
|
83
85
|
/* 插入head前面 */
|
|
84
|
-
|
|
86
|
+
this.windowApi.document.documentElement.insertBefore(
|
|
85
87
|
cssNode,
|
|
86
|
-
|
|
88
|
+
this.windowApi.document.documentElement.childNodes[0]
|
|
87
89
|
);
|
|
88
90
|
}
|
|
89
91
|
return cssNode;
|
|
@@ -306,7 +308,7 @@ class Utils {
|
|
|
306
308
|
let elementPosYBottom = Number(
|
|
307
309
|
(element as HTMLElement).getBoundingClientRect().bottom
|
|
308
310
|
); /* 要检测的元素的相对屏幕的纵坐标最下边 */
|
|
309
|
-
let clickNodeHTML = (
|
|
311
|
+
let clickNodeHTML = (this.windowApi.window.event as any).target
|
|
310
312
|
.innerHTML as string;
|
|
311
313
|
if (
|
|
312
314
|
mouseClickPosX >= elementPosXLeft &&
|
|
@@ -561,21 +563,21 @@ class Utils {
|
|
|
561
563
|
}
|
|
562
564
|
if (isIFrame) {
|
|
563
565
|
/* 使用iframe */
|
|
564
|
-
const iframeElement =
|
|
566
|
+
const iframeElement = this.windowApi.document.createElement("iframe");
|
|
565
567
|
iframeElement.style.display = "none";
|
|
566
568
|
iframeElement.src = base64Data;
|
|
567
|
-
|
|
569
|
+
this.windowApi.document.body.appendChild(iframeElement);
|
|
568
570
|
setTimeout(() => {
|
|
569
571
|
iframeElement!.contentWindow!.document.execCommand(
|
|
570
572
|
"SaveAs",
|
|
571
573
|
true,
|
|
572
574
|
fileName
|
|
573
575
|
);
|
|
574
|
-
|
|
576
|
+
this.windowApi.document.body.removeChild(iframeElement);
|
|
575
577
|
}, 100);
|
|
576
578
|
} else {
|
|
577
579
|
/* 使用A标签 */
|
|
578
|
-
const linkElement =
|
|
580
|
+
const linkElement = this.windowApi.document.createElement("a");
|
|
579
581
|
linkElement.setAttribute("target", "_blank");
|
|
580
582
|
linkElement.download = fileName;
|
|
581
583
|
linkElement.href = base64Data;
|
|
@@ -601,14 +603,14 @@ class Utils {
|
|
|
601
603
|
findWebPageVisibleText(str = "", caseSensitive = false) {
|
|
602
604
|
let TRange = null;
|
|
603
605
|
let strFound;
|
|
604
|
-
if ((
|
|
606
|
+
if ((this.windowApi.globalThis as any).find) {
|
|
605
607
|
/* CODE FOR BROWSERS THAT SUPPORT window.find */
|
|
606
|
-
let windowFind = (
|
|
608
|
+
let windowFind = (this.windowApi.self as any).find;
|
|
607
609
|
strFound = windowFind(str, caseSensitive, true, true, false);
|
|
608
610
|
if (
|
|
609
611
|
strFound &&
|
|
610
|
-
|
|
611
|
-
!
|
|
612
|
+
this.windowApi.self.getSelection &&
|
|
613
|
+
!this.windowApi.self.getSelection()!.anchorNode
|
|
612
614
|
) {
|
|
613
615
|
strFound = windowFind(str, caseSensitive, true, true, false);
|
|
614
616
|
}
|
|
@@ -625,7 +627,7 @@ class Utils {
|
|
|
625
627
|
if (strFound) TRange.select();
|
|
626
628
|
}
|
|
627
629
|
if (TRange == null || strFound == 0) {
|
|
628
|
-
TRange = (
|
|
630
|
+
TRange = (this.windowApi.self.document.body as any).createTextRange();
|
|
629
631
|
strFound = TRange.findText(str);
|
|
630
632
|
if (strFound) TRange.select();
|
|
631
633
|
}
|
|
@@ -1235,8 +1237,8 @@ class Utils {
|
|
|
1235
1237
|
// 当前的最大z-index的元素,调试使用
|
|
1236
1238
|
// @ts-ignore
|
|
1237
1239
|
let maxZIndexNode = null;
|
|
1238
|
-
|
|
1239
|
-
let nodeStyle =
|
|
1240
|
+
this.windowApi.document.querySelectorAll("*").forEach(($ele, index) => {
|
|
1241
|
+
let nodeStyle = this.windowApi.window.getComputedStyle($ele);
|
|
1240
1242
|
/* 不对position为static和display为none的元素进行获取它们的z-index */
|
|
1241
1243
|
if (nodeStyle.position !== "static" && nodeStyle.display !== "none") {
|
|
1242
1244
|
let nodeZIndex = parseInt(nodeStyle.zIndex);
|
|
@@ -1559,7 +1561,7 @@ class Utils {
|
|
|
1559
1561
|
if (url.trim() === "") {
|
|
1560
1562
|
throw new TypeError("url不能为空字符串或纯空格");
|
|
1561
1563
|
}
|
|
1562
|
-
return `thunder://${
|
|
1564
|
+
return `thunder://${this.windowApi.globalThis.btoa("AA" + url + "ZZ")}`;
|
|
1563
1565
|
}
|
|
1564
1566
|
/**
|
|
1565
1567
|
* 对于GM_cookie的兼容写法,当无法使用GM_cookie时可以使用这个,但是并不完全兼容,有些写不出来且限制了httponly是无法访问的
|
|
@@ -1797,12 +1799,12 @@ class Utils {
|
|
|
1797
1799
|
isNearBottom(nearValue?: number): boolean;
|
|
1798
1800
|
isNearBottom(nearValue: number = 50): boolean {
|
|
1799
1801
|
var scrollTop =
|
|
1800
|
-
|
|
1801
|
-
|
|
1802
|
+
this.windowApi.window.pageYOffset ||
|
|
1803
|
+
this.windowApi.document.documentElement.scrollTop;
|
|
1802
1804
|
var windowHeight =
|
|
1803
|
-
|
|
1804
|
-
|
|
1805
|
-
var documentHeight =
|
|
1805
|
+
this.windowApi.window.innerHeight ||
|
|
1806
|
+
this.windowApi.document.documentElement.clientHeight;
|
|
1807
|
+
var documentHeight = this.windowApi.document.documentElement.scrollHeight;
|
|
1806
1808
|
return scrollTop + windowHeight >= documentHeight - nearValue;
|
|
1807
1809
|
}
|
|
1808
1810
|
/**
|
|
@@ -1825,10 +1827,10 @@ class Utils {
|
|
|
1825
1827
|
isFullscreenEnabled(): boolean;
|
|
1826
1828
|
isFullscreenEnabled(): boolean {
|
|
1827
1829
|
return !!(
|
|
1828
|
-
(
|
|
1829
|
-
(
|
|
1830
|
-
(
|
|
1831
|
-
(
|
|
1830
|
+
(this.windowApi.document as any).fullscreenEnabled ||
|
|
1831
|
+
(this.windowApi.document as any).webkitFullScreenEnabled ||
|
|
1832
|
+
(this.windowApi.document as any).mozFullScreenEnabled ||
|
|
1833
|
+
(this.windowApi.document as any).msFullScreenEnabled
|
|
1832
1834
|
);
|
|
1833
1835
|
}
|
|
1834
1836
|
/**
|
|
@@ -2152,7 +2154,7 @@ class Utils {
|
|
|
2152
2154
|
*/
|
|
2153
2155
|
isThemeDark(): boolean;
|
|
2154
2156
|
isThemeDark(): boolean {
|
|
2155
|
-
return
|
|
2157
|
+
return this.windowApi.globalThis.matchMedia("(prefers-color-scheme: dark)")
|
|
2156
2158
|
.matches;
|
|
2157
2159
|
}
|
|
2158
2160
|
/**
|
|
@@ -2182,18 +2184,18 @@ class Utils {
|
|
|
2182
2184
|
}
|
|
2183
2185
|
let result = true;
|
|
2184
2186
|
for (const domItem of needCheckDomList) {
|
|
2185
|
-
let domDisplay =
|
|
2187
|
+
let domDisplay = this.windowApi.window.getComputedStyle(domItem);
|
|
2186
2188
|
if (domDisplay.display === "none") {
|
|
2187
2189
|
result = false;
|
|
2188
2190
|
} else {
|
|
2189
2191
|
let domClientRect = domItem.getBoundingClientRect();
|
|
2190
2192
|
if (inView) {
|
|
2191
2193
|
let viewportWidth =
|
|
2192
|
-
|
|
2193
|
-
|
|
2194
|
+
this.windowApi.window.innerWidth ||
|
|
2195
|
+
this.windowApi.document.documentElement.clientWidth;
|
|
2194
2196
|
let viewportHeight =
|
|
2195
|
-
|
|
2196
|
-
|
|
2197
|
+
this.windowApi.window.innerHeight ||
|
|
2198
|
+
this.windowApi.document.documentElement.clientHeight;
|
|
2197
2199
|
result = !(
|
|
2198
2200
|
domClientRect.right < 0 ||
|
|
2199
2201
|
domClientRect.left > viewportWidth ||
|
|
@@ -2225,10 +2227,10 @@ class Utils {
|
|
|
2225
2227
|
isWebView_Via(): boolean {
|
|
2226
2228
|
let result = true;
|
|
2227
2229
|
let UtilsContext = this;
|
|
2228
|
-
if (typeof (
|
|
2229
|
-
for (const key in Object.values((
|
|
2230
|
-
if (Reflect.has((
|
|
2231
|
-
let objValueFunc = (
|
|
2230
|
+
if (typeof (this.windowApi.top.window as any).via === "object") {
|
|
2231
|
+
for (const key in Object.values((this.windowApi.top.window as any).via)) {
|
|
2232
|
+
if (Reflect.has((this.windowApi.top.window as any).via, key)) {
|
|
2233
|
+
let objValueFunc = (this.windowApi.top.window as any).via[key];
|
|
2232
2234
|
if (
|
|
2233
2235
|
typeof objValueFunc === "function" &&
|
|
2234
2236
|
UtilsContext.isNativeFunc(objValueFunc)
|
|
@@ -2258,10 +2260,12 @@ class Utils {
|
|
|
2258
2260
|
isWebView_X(): boolean {
|
|
2259
2261
|
let result = true;
|
|
2260
2262
|
let UtilsContext = this;
|
|
2261
|
-
if (typeof (
|
|
2262
|
-
for (const key in Object.values(
|
|
2263
|
-
|
|
2264
|
-
|
|
2263
|
+
if (typeof (this.windowApi.top.window as any).mbrowser === "object") {
|
|
2264
|
+
for (const key in Object.values(
|
|
2265
|
+
(this.windowApi.top.window as any).mbrowser
|
|
2266
|
+
)) {
|
|
2267
|
+
if (Reflect.has((this.windowApi.top.window as any).mbrowser, key)) {
|
|
2268
|
+
let objValueFunc = (this.windowApi.top.window as any).mbrowser[key];
|
|
2265
2269
|
if (
|
|
2266
2270
|
typeof objValueFunc === "function" &&
|
|
2267
2271
|
UtilsContext.isNativeFunc(objValueFunc)
|
|
@@ -2598,9 +2602,9 @@ class Utils {
|
|
|
2598
2602
|
observer_config
|
|
2599
2603
|
);
|
|
2600
2604
|
let windowMutationObserver =
|
|
2601
|
-
|
|
2602
|
-
(
|
|
2603
|
-
(
|
|
2605
|
+
this.windowApi.window.MutationObserver ||
|
|
2606
|
+
(this.windowApi.window as any).webkitMutationObserver ||
|
|
2607
|
+
(this.windowApi.window as any).MozMutationObserver;
|
|
2604
2608
|
// 观察者对象
|
|
2605
2609
|
let mutationObserver = new windowMutationObserver(function (
|
|
2606
2610
|
mutations: MutationRecord[],
|
|
@@ -2638,13 +2642,13 @@ class Utils {
|
|
|
2638
2642
|
* let utils = Utils.noConflict();
|
|
2639
2643
|
* > ...
|
|
2640
2644
|
*/
|
|
2641
|
-
noConflict
|
|
2642
|
-
if ((
|
|
2643
|
-
Reflect.deleteProperty(
|
|
2645
|
+
noConflict() {
|
|
2646
|
+
if ((this.windowApi.window as any).Utils) {
|
|
2647
|
+
Reflect.deleteProperty(this.windowApi.window as any, "Utils");
|
|
2644
2648
|
}
|
|
2645
|
-
(
|
|
2649
|
+
(this.windowApi.window as any).Utils = utils;
|
|
2646
2650
|
return utils;
|
|
2647
|
-
}
|
|
2651
|
+
}
|
|
2648
2652
|
/**
|
|
2649
2653
|
* 恢复/释放该对象内的为function,让它无效/有效
|
|
2650
2654
|
* @param needReleaseObject 需要操作的对象
|
|
@@ -2710,11 +2714,14 @@ class Utils {
|
|
|
2710
2714
|
* 释放所有
|
|
2711
2715
|
*/
|
|
2712
2716
|
function releaseAll() {
|
|
2713
|
-
if (
|
|
2717
|
+
if (
|
|
2718
|
+
typeof (UtilsContext.windowApi.window as any)[needReleaseKey] !==
|
|
2719
|
+
"undefined"
|
|
2720
|
+
) {
|
|
2714
2721
|
/* 已存在 */
|
|
2715
2722
|
return;
|
|
2716
2723
|
}
|
|
2717
|
-
(
|
|
2724
|
+
(UtilsContext.windowApi.window as any)[needReleaseKey] =
|
|
2718
2725
|
UtilsContext.deepClone(needReleaseObject);
|
|
2719
2726
|
Object.values(needReleaseObject).forEach((value) => {
|
|
2720
2727
|
if (typeof value === "function") {
|
|
@@ -2730,14 +2737,15 @@ class Utils {
|
|
|
2730
2737
|
Object.values(needReleaseObject).forEach((value) => {
|
|
2731
2738
|
if (typeof value === "function") {
|
|
2732
2739
|
if (
|
|
2733
|
-
typeof (
|
|
2740
|
+
typeof (UtilsContext.windowApi.window as any)[needReleaseKey] ===
|
|
2741
|
+
"undefined"
|
|
2734
2742
|
) {
|
|
2735
|
-
(
|
|
2743
|
+
(UtilsContext.windowApi.window as any)[needReleaseKey] = {};
|
|
2736
2744
|
}
|
|
2737
2745
|
if (item === value.name) {
|
|
2738
|
-
(
|
|
2739
|
-
|
|
2740
|
-
)[value.name];
|
|
2746
|
+
(UtilsContext.windowApi.window as any)[needReleaseKey][
|
|
2747
|
+
value.name
|
|
2748
|
+
] = (needReleaseObject as any)[value.name];
|
|
2741
2749
|
(needReleaseObject as any)[value.name] = () => {};
|
|
2742
2750
|
}
|
|
2743
2751
|
}
|
|
@@ -2748,36 +2756,46 @@ class Utils {
|
|
|
2748
2756
|
* 恢复所有
|
|
2749
2757
|
*/
|
|
2750
2758
|
function recoveryAll() {
|
|
2751
|
-
if (
|
|
2759
|
+
if (
|
|
2760
|
+
typeof (UtilsContext.windowApi.window as any)[needReleaseKey] ===
|
|
2761
|
+
"undefined"
|
|
2762
|
+
) {
|
|
2752
2763
|
/* 未存在 */
|
|
2753
2764
|
return;
|
|
2754
2765
|
}
|
|
2755
2766
|
Object.assign(
|
|
2756
2767
|
needReleaseObject,
|
|
2757
|
-
(
|
|
2768
|
+
(UtilsContext.windowApi.window as any)[needReleaseKey]
|
|
2769
|
+
);
|
|
2770
|
+
Reflect.deleteProperty(
|
|
2771
|
+
UtilsContext.windowApi.window as any,
|
|
2772
|
+
"needReleaseKey"
|
|
2758
2773
|
);
|
|
2759
|
-
Reflect.deleteProperty(UtilsCore.window as any, "needReleaseKey");
|
|
2760
2774
|
}
|
|
2761
2775
|
|
|
2762
2776
|
/**
|
|
2763
2777
|
* 恢复单个
|
|
2764
2778
|
*/
|
|
2765
2779
|
function recoveryOne() {
|
|
2766
|
-
if (
|
|
2780
|
+
if (
|
|
2781
|
+
typeof (UtilsContext.windowApi.window as any)[needReleaseKey] ===
|
|
2782
|
+
"undefined"
|
|
2783
|
+
) {
|
|
2767
2784
|
/* 未存在 */
|
|
2768
2785
|
return;
|
|
2769
2786
|
}
|
|
2770
2787
|
Array.from(functionNameList).forEach((item) => {
|
|
2771
|
-
if ((
|
|
2772
|
-
(needReleaseObject as any)[item] = (
|
|
2773
|
-
|
|
2774
|
-
][item];
|
|
2788
|
+
if ((UtilsContext.windowApi.window as any)[needReleaseKey][item]) {
|
|
2789
|
+
(needReleaseObject as any)[item] = (
|
|
2790
|
+
UtilsContext.windowApi.window as any
|
|
2791
|
+
)[needReleaseKey][item];
|
|
2775
2792
|
Reflect.deleteProperty(
|
|
2776
|
-
(
|
|
2793
|
+
(UtilsContext.windowApi.window as any)[needReleaseKey],
|
|
2777
2794
|
item
|
|
2778
2795
|
);
|
|
2779
2796
|
if (
|
|
2780
|
-
Object.keys((
|
|
2797
|
+
Object.keys((UtilsContext.windowApi.window as any)[needReleaseKey])
|
|
2798
|
+
.length === 0
|
|
2781
2799
|
) {
|
|
2782
2800
|
Reflect.deleteProperty(window, needReleaseKey);
|
|
2783
2801
|
}
|
|
@@ -3175,7 +3193,7 @@ class Utils {
|
|
|
3175
3193
|
startIndex?: number,
|
|
3176
3194
|
endIndex?: number
|
|
3177
3195
|
): void {
|
|
3178
|
-
let range =
|
|
3196
|
+
let range = this.windowApi.document.createRange();
|
|
3179
3197
|
range.selectNodeContents(element);
|
|
3180
3198
|
if (childTextNode) {
|
|
3181
3199
|
if (childTextNode.nodeType !== Node.TEXT_NODE) {
|
|
@@ -3187,7 +3205,7 @@ class Utils {
|
|
|
3187
3205
|
}
|
|
3188
3206
|
}
|
|
3189
3207
|
|
|
3190
|
-
let selection =
|
|
3208
|
+
let selection = this.windowApi.globalThis.getSelection();
|
|
3191
3209
|
if (selection) {
|
|
3192
3210
|
selection.removeAllRanges();
|
|
3193
3211
|
selection.addRange(range);
|
|
@@ -3251,6 +3269,7 @@ class Utils {
|
|
|
3251
3269
|
} else {
|
|
3252
3270
|
textType = "text/plain";
|
|
3253
3271
|
}
|
|
3272
|
+
let UtilsContext = this;
|
|
3254
3273
|
class UtilsClipboard {
|
|
3255
3274
|
#resolve;
|
|
3256
3275
|
#copyData;
|
|
@@ -3309,15 +3328,16 @@ class Utils {
|
|
|
3309
3328
|
*/
|
|
3310
3329
|
copyTextByTextArea() {
|
|
3311
3330
|
try {
|
|
3312
|
-
let copyElement =
|
|
3331
|
+
let copyElement =
|
|
3332
|
+
UtilsContext.windowApi.document.createElement("textarea");
|
|
3313
3333
|
copyElement.value = this.#copyData;
|
|
3314
3334
|
copyElement.setAttribute("type", "text");
|
|
3315
3335
|
copyElement.setAttribute("style", "opacity:0;position:absolute;");
|
|
3316
3336
|
copyElement.setAttribute("readonly", "readonly");
|
|
3317
|
-
|
|
3337
|
+
UtilsContext.windowApi.document.body.appendChild(copyElement);
|
|
3318
3338
|
copyElement.select();
|
|
3319
|
-
|
|
3320
|
-
|
|
3339
|
+
UtilsContext.windowApi.document.execCommand("copy");
|
|
3340
|
+
UtilsContext.windowApi.document.body.removeChild(copyElement);
|
|
3321
3341
|
return true;
|
|
3322
3342
|
} catch (error) {
|
|
3323
3343
|
console.error("复制失败,error👉", error);
|
|
@@ -3392,10 +3412,10 @@ class Utils {
|
|
|
3392
3412
|
}
|
|
3393
3413
|
return new Promise((resolve) => {
|
|
3394
3414
|
const utilsClipboard = new UtilsClipboard(resolve, data, textType);
|
|
3395
|
-
if (
|
|
3415
|
+
if (UtilsContext.windowApi.document.hasFocus()) {
|
|
3396
3416
|
utilsClipboard.init();
|
|
3397
3417
|
} else {
|
|
3398
|
-
|
|
3418
|
+
UtilsContext.windowApi.window.addEventListener(
|
|
3399
3419
|
"focus",
|
|
3400
3420
|
() => {
|
|
3401
3421
|
utilsClipboard.init();
|
|
@@ -3465,15 +3485,17 @@ class Utils {
|
|
|
3465
3485
|
dragSlider(selector: string | Element | Node, offsetX?: number): void;
|
|
3466
3486
|
dragSlider(
|
|
3467
3487
|
selector: string | Element | Node,
|
|
3468
|
-
offsetX: number =
|
|
3488
|
+
offsetX: number = this.windowApi.window.innerWidth
|
|
3469
3489
|
): void {
|
|
3490
|
+
let UtilsContext = this;
|
|
3470
3491
|
function initMouseEvent(
|
|
3471
3492
|
eventName: string,
|
|
3472
3493
|
offSetX: number,
|
|
3473
3494
|
offSetY: number
|
|
3474
3495
|
) {
|
|
3475
3496
|
let win = unsafeWindow || window;
|
|
3476
|
-
let mouseEvent =
|
|
3497
|
+
let mouseEvent =
|
|
3498
|
+
UtilsContext.windowApi.document.createEvent("MouseEvents");
|
|
3477
3499
|
mouseEvent.initMouseEvent(
|
|
3478
3500
|
eventName,
|
|
3479
3501
|
true,
|
|
@@ -3495,7 +3517,7 @@ class Utils {
|
|
|
3495
3517
|
}
|
|
3496
3518
|
let sliderElement =
|
|
3497
3519
|
typeof selector === "string"
|
|
3498
|
-
?
|
|
3520
|
+
? this.windowApi.document.querySelector(selector)
|
|
3499
3521
|
: selector;
|
|
3500
3522
|
if (
|
|
3501
3523
|
!(sliderElement instanceof Node) ||
|
|
@@ -3522,7 +3544,7 @@ class Utils {
|
|
|
3522
3544
|
*/
|
|
3523
3545
|
enterFullScreen(element: HTMLElement, options?: FullscreenOptions): void;
|
|
3524
3546
|
enterFullScreen(
|
|
3525
|
-
element: HTMLElement =
|
|
3547
|
+
element: HTMLElement = this.windowApi.document.documentElement,
|
|
3526
3548
|
options?: FullscreenOptions
|
|
3527
3549
|
): void {
|
|
3528
3550
|
try {
|
|
@@ -3549,16 +3571,16 @@ class Utils {
|
|
|
3549
3571
|
*/
|
|
3550
3572
|
exitFullScreen(element?: HTMLElement): Promise<void>;
|
|
3551
3573
|
exitFullScreen(
|
|
3552
|
-
element: HTMLElement =
|
|
3574
|
+
element: HTMLElement = this.windowApi.document.documentElement
|
|
3553
3575
|
): Promise<void> {
|
|
3554
|
-
if (
|
|
3555
|
-
return
|
|
3556
|
-
} else if ((
|
|
3557
|
-
return (
|
|
3558
|
-
} else if ((
|
|
3559
|
-
return (
|
|
3560
|
-
} else if ((
|
|
3561
|
-
return (
|
|
3576
|
+
if (this.windowApi.document.exitFullscreen) {
|
|
3577
|
+
return this.windowApi.document.exitFullscreen();
|
|
3578
|
+
} else if ((this.windowApi.document as any).msExitFullscreen) {
|
|
3579
|
+
return (this.windowApi.document as any).msExitFullscreen();
|
|
3580
|
+
} else if ((this.windowApi.document as any).mozCancelFullScreen) {
|
|
3581
|
+
return (this.windowApi.document as any).mozCancelFullScreen();
|
|
3582
|
+
} else if ((this.windowApi.document as any).webkitCancelFullScreen) {
|
|
3583
|
+
return (this.windowApi.document as any).webkitCancelFullScreen();
|
|
3562
3584
|
} else {
|
|
3563
3585
|
return new Promise((resolve, reject) => {
|
|
3564
3586
|
reject(new TypeError("该浏览器不支持全屏API"));
|
|
@@ -3830,7 +3852,9 @@ class Utils {
|
|
|
3830
3852
|
UtilsContext.tryCatch()
|
|
3831
3853
|
.error(() => {
|
|
3832
3854
|
try {
|
|
3833
|
-
result = (
|
|
3855
|
+
result = (UtilsContext.windowApi.window as any).eval(
|
|
3856
|
+
"(" + data + ")"
|
|
3857
|
+
);
|
|
3834
3858
|
} catch (error2: any) {
|
|
3835
3859
|
if (typeof errorCallBack === "function") {
|
|
3836
3860
|
errorCallBack(error2);
|
|
@@ -4077,11 +4101,11 @@ class Utils {
|
|
|
4077
4101
|
waitNode<T extends Element | Element[]>(...args: any[]): Promise<T | null> {
|
|
4078
4102
|
// 过滤掉undefined
|
|
4079
4103
|
args = args.filter((arg) => arg !== void 0);
|
|
4080
|
-
let
|
|
4104
|
+
let UtilsContext = this;
|
|
4081
4105
|
// 选择器
|
|
4082
4106
|
let selector = args[0] as unknown as string | string[];
|
|
4083
4107
|
// 父元素(监听的元素)
|
|
4084
|
-
let parent: Element =
|
|
4108
|
+
let parent: Element = UtilsContext.windowApi.document as any as Element;
|
|
4085
4109
|
// 超时时间
|
|
4086
4110
|
let timeout = 0;
|
|
4087
4111
|
if (typeof args[0] !== "string" && !Array.isArray(args[0])) {
|
|
@@ -4139,7 +4163,7 @@ class Utils {
|
|
|
4139
4163
|
return parent.querySelector(selector);
|
|
4140
4164
|
}
|
|
4141
4165
|
}
|
|
4142
|
-
var observer =
|
|
4166
|
+
var observer = UtilsContext.mutationObserver(parent, {
|
|
4143
4167
|
config: {
|
|
4144
4168
|
subtree: true,
|
|
4145
4169
|
childList: true,
|
|
@@ -4229,11 +4253,11 @@ class Utils {
|
|
|
4229
4253
|
waitAnyNode<T extends Element>(...args: any[]): Promise<T | null> {
|
|
4230
4254
|
// 过滤掉undefined
|
|
4231
4255
|
args = args.filter((arg) => arg !== void 0);
|
|
4232
|
-
let
|
|
4256
|
+
let UtilsContext = this;
|
|
4233
4257
|
// 选择器
|
|
4234
4258
|
let selectorList = args[0] as unknown as string[];
|
|
4235
4259
|
// 父元素(监听的元素)
|
|
4236
|
-
let parent: Element =
|
|
4260
|
+
let parent: Element = UtilsContext.windowApi.document as any as Element;
|
|
4237
4261
|
// 超时时间
|
|
4238
4262
|
let timeout = 0;
|
|
4239
4263
|
if (typeof args[0] !== "object" && !Array.isArray(args[0])) {
|
|
@@ -4275,7 +4299,7 @@ class Utils {
|
|
|
4275
4299
|
throw new TypeError("Utils.waitAnyNode 参数个数错误");
|
|
4276
4300
|
}
|
|
4277
4301
|
let promiseList = selectorList.map((selector) => {
|
|
4278
|
-
return
|
|
4302
|
+
return UtilsContext.waitNode<T>(selector, parent, timeout);
|
|
4279
4303
|
});
|
|
4280
4304
|
return Promise.any(promiseList);
|
|
4281
4305
|
}
|
|
@@ -4399,11 +4423,11 @@ class Utils {
|
|
|
4399
4423
|
): Promise<T | null> {
|
|
4400
4424
|
// 过滤掉undefined
|
|
4401
4425
|
args = args.filter((arg) => arg !== void 0);
|
|
4402
|
-
let
|
|
4426
|
+
let UtilsContext = this;
|
|
4403
4427
|
// 选择器数组
|
|
4404
4428
|
let selector = args[0] as unknown as string | string[];
|
|
4405
4429
|
// 父元素(监听的元素)
|
|
4406
|
-
let parent: Element =
|
|
4430
|
+
let parent: Element = UtilsContext.windowApi.document as any as Element;
|
|
4407
4431
|
// 超时时间
|
|
4408
4432
|
let timeout = 0;
|
|
4409
4433
|
if (typeof args[0] !== "string" && !Array.isArray(args[0])) {
|
|
@@ -4466,7 +4490,7 @@ class Utils {
|
|
|
4466
4490
|
}
|
|
4467
4491
|
}
|
|
4468
4492
|
}
|
|
4469
|
-
var observer =
|
|
4493
|
+
var observer = UtilsContext.mutationObserver(parent, {
|
|
4470
4494
|
config: {
|
|
4471
4495
|
subtree: true,
|
|
4472
4496
|
childList: true,
|
|
@@ -4558,11 +4582,11 @@ class Utils {
|
|
|
4558
4582
|
): Promise<NodeListOf<T> | null> {
|
|
4559
4583
|
// 过滤掉undefined
|
|
4560
4584
|
args = args.filter((arg) => arg !== void 0);
|
|
4561
|
-
let
|
|
4585
|
+
let UtilsContext = this;
|
|
4562
4586
|
// 选择器数组
|
|
4563
4587
|
let selectorList = args[0] as unknown as string[];
|
|
4564
4588
|
// 父元素(监听的元素)
|
|
4565
|
-
let parent: Element =
|
|
4589
|
+
let parent: Element = UtilsContext.windowApi.document as any as Element;
|
|
4566
4590
|
// 超时时间
|
|
4567
4591
|
let timeout = 0;
|
|
4568
4592
|
if (!Array.isArray(args[0])) {
|
|
@@ -4607,7 +4631,11 @@ class Utils {
|
|
|
4607
4631
|
}
|
|
4608
4632
|
|
|
4609
4633
|
let promiseList = selectorList.map((selector) => {
|
|
4610
|
-
return
|
|
4634
|
+
return UtilsContext.waitNodeList<NodeListOf<T>>(
|
|
4635
|
+
selector,
|
|
4636
|
+
parent,
|
|
4637
|
+
timeout
|
|
4638
|
+
);
|
|
4611
4639
|
});
|
|
4612
4640
|
return Promise.any(promiseList);
|
|
4613
4641
|
}
|
|
@@ -4858,7 +4886,7 @@ class Utils {
|
|
|
4858
4886
|
* @param option
|
|
4859
4887
|
* @returns
|
|
4860
4888
|
*/
|
|
4861
|
-
createUtils(option?:
|
|
4889
|
+
createUtils(option?: UtilsWindowApiOption) {
|
|
4862
4890
|
return new Utils(option);
|
|
4863
4891
|
}
|
|
4864
4892
|
|
|
@@ -4916,11 +4944,11 @@ class Utils {
|
|
|
4916
4944
|
if (text.startsWith("//")) {
|
|
4917
4945
|
/* //www.baidu.com/xxxxxxx */
|
|
4918
4946
|
/* 没有protocol,加上 */
|
|
4919
|
-
text =
|
|
4947
|
+
text = this.windowApi.globalThis.location.protocol + text;
|
|
4920
4948
|
} else if (text.startsWith("/")) {
|
|
4921
4949
|
/* /xxx/info?xxx=xxx */
|
|
4922
4950
|
/* 没有Origin,加上 */
|
|
4923
|
-
text =
|
|
4951
|
+
text = this.windowApi.globalThis.location.origin + text;
|
|
4924
4952
|
}
|
|
4925
4953
|
return new URL(text);
|
|
4926
4954
|
}
|
package/src/UtilsCommon.ts
CHANGED
|
@@ -1,11 +1,9 @@
|
|
|
1
|
-
import { UtilsCore } from "./UtilsCore";
|
|
2
|
-
|
|
3
1
|
/**
|
|
4
2
|
* 生成uuid
|
|
5
3
|
*/
|
|
6
4
|
export const GenerateUUID = function () {
|
|
7
|
-
if (typeof
|
|
8
|
-
return
|
|
5
|
+
if (typeof window?.crypto?.randomUUID === "function") {
|
|
6
|
+
return window.crypto.randomUUID();
|
|
9
7
|
} else {
|
|
10
8
|
return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(
|
|
11
9
|
/[xy]/g,
|