@whitesev/utils 2.11.11 → 2.11.13
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 +220 -62
- 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 +220 -62
- 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 +220 -62
- 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 +220 -62
- 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 +220 -62
- 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 +220 -62
- 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/Dictionary.d.ts +13 -2
- package/dist/types/src/Utils.d.ts +37 -11
- package/dist/types/src/ajaxHooker/ajaxHooker.d.ts +8 -2
- package/dist/types/src/ajaxHooker/ajaxHooker1.2.4.d.ts +8 -2
- package/dist/types/src/types/Httpx.d.ts +16 -16
- package/dist/types/src/types/ajaxHooker.d.ts +92 -56
- package/package.json +3 -4
- package/src/Dictionary.ts +24 -3
- package/src/Httpx.ts +18 -18
- package/src/LockFunction.ts +3 -6
- package/src/Utils.ts +85 -53
- package/src/ajaxHooker/ajaxHooker.js +55 -5
- package/src/ajaxHooker/ajaxHooker1.2.4.js +58 -14
- package/src/types/Httpx.d.ts +16 -16
- package/src/types/ajaxHooker.d.ts +92 -56
package/dist/index.umd.js
CHANGED
|
@@ -243,7 +243,7 @@
|
|
|
243
243
|
const setInterval$1 = (...args) => loadOrReturnBroker().setInterval(...args);
|
|
244
244
|
const setTimeout$1 = (...args) => loadOrReturnBroker().setTimeout(...args);
|
|
245
245
|
|
|
246
|
-
const version = "2.11.
|
|
246
|
+
const version = "2.11.13";
|
|
247
247
|
|
|
248
248
|
/* eslint-disable */
|
|
249
249
|
// ==UserScript==
|
|
@@ -378,8 +378,12 @@
|
|
|
378
378
|
}));
|
|
379
379
|
}
|
|
380
380
|
waitForRequestKeys() {
|
|
381
|
+
/**
|
|
382
|
+
* @type {Set<typeof hookInst>}
|
|
383
|
+
*/
|
|
384
|
+
const winHookInsts = win.__ajaxHooker.hookInsts;
|
|
381
385
|
if (!this.request.async) {
|
|
382
|
-
|
|
386
|
+
winHookInsts.forEach(({ hookFns, filters }) => {
|
|
383
387
|
if (this.shouldFilter(filters))
|
|
384
388
|
return;
|
|
385
389
|
hookFns.forEach((fn) => {
|
|
@@ -395,10 +399,10 @@
|
|
|
395
399
|
}
|
|
396
400
|
const promises = [];
|
|
397
401
|
const ignoreKeys = new Set(["type", "async", "response"]);
|
|
398
|
-
|
|
402
|
+
winHookInsts.forEach(({ hookFns, filters }) => {
|
|
399
403
|
if (this.shouldFilter(filters))
|
|
400
404
|
return;
|
|
401
|
-
promises.push(Promise.all(hookFns.map((fn) => catchError(fn, this.request))).then(() => {
|
|
405
|
+
promises.push(Promise.all(hookFns.map((fn, index) => catchError(fn, this.request, index))).then(() => {
|
|
402
406
|
const requestKeys = [];
|
|
403
407
|
for (const key in this.request)
|
|
404
408
|
!ignoreKeys.has(key) && requestKeys.push(key);
|
|
@@ -820,11 +824,52 @@
|
|
|
820
824
|
});
|
|
821
825
|
});
|
|
822
826
|
}
|
|
827
|
+
/**
|
|
828
|
+
*
|
|
829
|
+
* @type {import("./../types/ajaxHooker.d.ts").UtilsAjaxHookResult["removeHook"]}
|
|
830
|
+
*/
|
|
831
|
+
const removeHook = (fn, onlyRemove = false) => {
|
|
832
|
+
let flag = false;
|
|
833
|
+
for (let index = hookInst.hookFns.length - 1; index >= 0; index--) {
|
|
834
|
+
const __fn__ = hookInst.hookFns[index];
|
|
835
|
+
if (fn === __fn__) {
|
|
836
|
+
hookInst.hookFns.splice(index, 1);
|
|
837
|
+
flag = true;
|
|
838
|
+
if (onlyRemove) {
|
|
839
|
+
break;
|
|
840
|
+
}
|
|
841
|
+
}
|
|
842
|
+
}
|
|
843
|
+
return flag;
|
|
844
|
+
};
|
|
845
|
+
/**
|
|
846
|
+
*
|
|
847
|
+
* @type {import("./../types/ajaxHooker.d.ts").UtilsAjaxHookResult["removeFilter"]}
|
|
848
|
+
*/
|
|
849
|
+
const removeFilter = () => {
|
|
850
|
+
if (Array.isArray(hookInst.filters)) {
|
|
851
|
+
hookInst.filters.length = 0;
|
|
852
|
+
}
|
|
853
|
+
else {
|
|
854
|
+
hookInst.filters = [];
|
|
855
|
+
}
|
|
856
|
+
};
|
|
823
857
|
return {
|
|
824
|
-
hook: (fn) =>
|
|
858
|
+
hook: (fn) => {
|
|
859
|
+
hookInst.hookFns.push(fn);
|
|
860
|
+
return {
|
|
861
|
+
remove: () => {
|
|
862
|
+
return removeHook(fn, true);
|
|
863
|
+
}
|
|
864
|
+
};
|
|
865
|
+
},
|
|
825
866
|
filter: (arr) => {
|
|
826
|
-
if (Array.isArray(arr))
|
|
867
|
+
if (Array.isArray(arr)) {
|
|
827
868
|
hookInst.filters = arr;
|
|
869
|
+
}
|
|
870
|
+
return {
|
|
871
|
+
remove: removeFilter
|
|
872
|
+
};
|
|
828
873
|
},
|
|
829
874
|
protect: () => {
|
|
830
875
|
readonly(win, "XMLHttpRequest", winAh.fakeXHR);
|
|
@@ -840,6 +885,8 @@
|
|
|
840
885
|
delete win.__ajaxHooker;
|
|
841
886
|
}
|
|
842
887
|
},
|
|
888
|
+
removeHook: removeHook,
|
|
889
|
+
removeFilter: removeFilter
|
|
843
890
|
};
|
|
844
891
|
};
|
|
845
892
|
|
|
@@ -1238,10 +1285,50 @@
|
|
|
1238
1285
|
Object.keys(realXhr).forEach((key) => (fakeXhr[key] = realXhr[key]));
|
|
1239
1286
|
fakeXhr.prototype = realXhr.prototype;
|
|
1240
1287
|
win.fetch = fakeFetch;
|
|
1288
|
+
/**
|
|
1289
|
+
*
|
|
1290
|
+
* @type {import("./../types/ajaxHooker.d.ts").UtilsAjaxHookResult["removeHook"]}
|
|
1291
|
+
*/
|
|
1292
|
+
const removeHook = (fn, onlyRemove = false) => {
|
|
1293
|
+
let flag = false;
|
|
1294
|
+
for (let index = hookFns.length - 1; index >= 0; index--) {
|
|
1295
|
+
const __fn__ = hookFns[index];
|
|
1296
|
+
if (fn === __fn__) {
|
|
1297
|
+
hookFns.splice(index, 1);
|
|
1298
|
+
flag = true;
|
|
1299
|
+
if (onlyRemove) {
|
|
1300
|
+
break;
|
|
1301
|
+
}
|
|
1302
|
+
}
|
|
1303
|
+
}
|
|
1304
|
+
return flag;
|
|
1305
|
+
};
|
|
1306
|
+
/**
|
|
1307
|
+
*
|
|
1308
|
+
* @type {import("./../types/ajaxHooker.d.ts").UtilsAjaxHookResult["removeFilter"]}
|
|
1309
|
+
*/
|
|
1310
|
+
const removeFilter = () => {
|
|
1311
|
+
if (Array.isArray(filter)) {
|
|
1312
|
+
filter.length = 0;
|
|
1313
|
+
}
|
|
1314
|
+
else {
|
|
1315
|
+
filter = void 0;
|
|
1316
|
+
}
|
|
1317
|
+
};
|
|
1241
1318
|
return {
|
|
1242
|
-
hook: (fn) =>
|
|
1319
|
+
hook: (fn) => {
|
|
1320
|
+
hookFns.push(fn);
|
|
1321
|
+
return {
|
|
1322
|
+
remove: () => {
|
|
1323
|
+
return removeHook(fn, true);
|
|
1324
|
+
}
|
|
1325
|
+
};
|
|
1326
|
+
},
|
|
1243
1327
|
filter: (arr) => {
|
|
1244
1328
|
filter = Array.isArray(arr) && arr.map(toFilterObj);
|
|
1329
|
+
return {
|
|
1330
|
+
remove: removeFilter
|
|
1331
|
+
};
|
|
1245
1332
|
},
|
|
1246
1333
|
protect: () => {
|
|
1247
1334
|
readonly(win, "XMLHttpRequest", fakeXhr);
|
|
@@ -1251,6 +1338,8 @@
|
|
|
1251
1338
|
writable(win, "XMLHttpRequest", realXhr);
|
|
1252
1339
|
writable(win, "fetch", realFetch);
|
|
1253
1340
|
},
|
|
1341
|
+
removeHook: removeHook,
|
|
1342
|
+
removeFilter: removeFilter
|
|
1254
1343
|
};
|
|
1255
1344
|
})();
|
|
1256
1345
|
};
|
|
@@ -1835,13 +1924,25 @@
|
|
|
1835
1924
|
}
|
|
1836
1925
|
/**
|
|
1837
1926
|
* 迭代字典
|
|
1838
|
-
* @param
|
|
1927
|
+
* @param cb 回调函数
|
|
1839
1928
|
*/
|
|
1840
|
-
forEach(
|
|
1929
|
+
forEach(cb) {
|
|
1841
1930
|
this.items.forEach((value, key) => {
|
|
1842
|
-
|
|
1931
|
+
cb(value, key, this);
|
|
1843
1932
|
});
|
|
1844
1933
|
}
|
|
1934
|
+
/**
|
|
1935
|
+
* 找到字典中对应的键和值
|
|
1936
|
+
* @param cb 回调函数
|
|
1937
|
+
*/
|
|
1938
|
+
find(cb) {
|
|
1939
|
+
for (const [key, value] of this.items.entries()) {
|
|
1940
|
+
const result = cb(value, key, this);
|
|
1941
|
+
if (result) {
|
|
1942
|
+
return result;
|
|
1943
|
+
}
|
|
1944
|
+
}
|
|
1945
|
+
}
|
|
1845
1946
|
/**
|
|
1846
1947
|
* 检查已有的键中是否以xx开头
|
|
1847
1948
|
* @param key 需要匹配的键
|
|
@@ -2675,42 +2776,42 @@
|
|
|
2675
2776
|
const method = requestOption.method;
|
|
2676
2777
|
if (method === "GET" || method === "HEAD") {
|
|
2677
2778
|
// GET类型,data如果有,那么需要转为searchParams
|
|
2678
|
-
const
|
|
2779
|
+
const urlInst = new URL(requestOption.url);
|
|
2679
2780
|
let urlSearch = "";
|
|
2680
|
-
let
|
|
2781
|
+
let deleteData = false;
|
|
2681
2782
|
if (typeof requestOption.data === "string") {
|
|
2682
|
-
|
|
2783
|
+
deleteData = true;
|
|
2683
2784
|
urlSearch = requestOption.data;
|
|
2684
2785
|
}
|
|
2685
2786
|
else if (typeof requestOption.data === "object") {
|
|
2686
|
-
|
|
2787
|
+
deleteData = true;
|
|
2687
2788
|
// URLSearchParams参数可以转普通的string:string,包括FormData
|
|
2688
2789
|
const searchParams = new URLSearchParams(requestOption.data);
|
|
2689
2790
|
urlSearch = searchParams.toString();
|
|
2690
2791
|
}
|
|
2691
|
-
if (
|
|
2792
|
+
if (deleteData) {
|
|
2692
2793
|
// GET/HEAD请求不支持data参数
|
|
2693
2794
|
// 对data进行处理了才可以删除
|
|
2694
2795
|
Reflect.deleteProperty(requestOption, "data");
|
|
2695
2796
|
}
|
|
2696
|
-
if (urlSearch != "") {
|
|
2697
|
-
if (
|
|
2797
|
+
if (urlSearch.trim() != "") {
|
|
2798
|
+
if (urlInst.search.trim() === "") {
|
|
2698
2799
|
// url没有search参数,直接覆盖
|
|
2699
|
-
|
|
2800
|
+
urlInst.search = urlSearch;
|
|
2700
2801
|
}
|
|
2701
2802
|
else {
|
|
2702
2803
|
// 有search参数
|
|
2703
|
-
if (
|
|
2804
|
+
if (urlInst.search.trim().endsWith("&")) {
|
|
2704
2805
|
// xxx=xxx&
|
|
2705
|
-
|
|
2806
|
+
urlInst.search = urlInst.search + urlSearch;
|
|
2706
2807
|
}
|
|
2707
2808
|
else {
|
|
2708
2809
|
// xxx=xxx&xxx=
|
|
2709
|
-
|
|
2810
|
+
urlInst.search = `${urlInst.search}&${urlSearch}`;
|
|
2710
2811
|
}
|
|
2711
2812
|
}
|
|
2712
2813
|
}
|
|
2713
|
-
requestOption.url =
|
|
2814
|
+
requestOption.url = urlInst.toString();
|
|
2714
2815
|
}
|
|
2715
2816
|
else if (method === "POST" && requestOption.headers != null) {
|
|
2716
2817
|
// POST类型,data如果是FormData,那么需要转为string
|
|
@@ -2720,10 +2821,10 @@
|
|
|
2720
2821
|
typeof requestOption.headers[headerKey] === "string");
|
|
2721
2822
|
});
|
|
2722
2823
|
if (ContentTypeIndex !== -1) {
|
|
2723
|
-
const
|
|
2724
|
-
const
|
|
2824
|
+
const contentTypeKey = headersKeyList[ContentTypeIndex];
|
|
2825
|
+
const contentType = requestOption.headers[contentTypeKey].toLowerCase();
|
|
2725
2826
|
// 设置了Content-Type
|
|
2726
|
-
if (
|
|
2827
|
+
if (contentType.includes("application/json")) {
|
|
2727
2828
|
// application/json
|
|
2728
2829
|
if (requestOption.data instanceof FormData) {
|
|
2729
2830
|
const entries = {};
|
|
@@ -2736,16 +2837,16 @@
|
|
|
2736
2837
|
requestOption.data = JSON.stringify(requestOption.data);
|
|
2737
2838
|
}
|
|
2738
2839
|
}
|
|
2739
|
-
else if (
|
|
2840
|
+
else if (contentType.includes("application/x-www-form-urlencoded")) {
|
|
2740
2841
|
// application/x-www-form-urlencoded
|
|
2741
2842
|
if (typeof requestOption.data === "object") {
|
|
2742
2843
|
requestOption.data = new URLSearchParams(requestOption.data).toString();
|
|
2743
2844
|
}
|
|
2744
2845
|
}
|
|
2745
|
-
else if (
|
|
2846
|
+
else if (contentType.includes("multipart/form-data")) {
|
|
2746
2847
|
// multipart/form-data
|
|
2747
2848
|
if (requestOption.data instanceof FormData) {
|
|
2748
|
-
Reflect.deleteProperty(requestOption.headers,
|
|
2849
|
+
Reflect.deleteProperty(requestOption.headers, contentTypeKey);
|
|
2749
2850
|
}
|
|
2750
2851
|
}
|
|
2751
2852
|
}
|
|
@@ -5703,20 +5804,25 @@
|
|
|
5703
5804
|
}
|
|
5704
5805
|
/**
|
|
5705
5806
|
* ajax劫持库,支持xhr和fetch劫持。
|
|
5706
|
-
* +
|
|
5707
|
-
* +
|
|
5708
|
-
* +
|
|
5709
|
-
* +
|
|
5710
|
-
* +
|
|
5711
|
-
|
|
5712
|
-
|
|
5713
|
-
|
|
5714
|
-
|
|
5715
|
-
|
|
5716
|
-
|
|
5717
|
-
|
|
5718
|
-
|
|
5719
|
-
|
|
5807
|
+
* + 来源: https://bbs.tampermonkey.net.cn/thread-3284-1-1.html
|
|
5808
|
+
* + 作者: cxxjackie
|
|
5809
|
+
* + 实现方式: Proxy
|
|
5810
|
+
* + 版本: `1.4.8`
|
|
5811
|
+
* + 文档: https://scriptcat.org/zh-CN/script-show-page/637/
|
|
5812
|
+
*/
|
|
5813
|
+
ajaxHooker = () => {
|
|
5814
|
+
return ajaxHooker();
|
|
5815
|
+
};
|
|
5816
|
+
/**
|
|
5817
|
+
* ajax劫持库,支持xhr和fetch劫持。
|
|
5818
|
+
* + 来源: https://bbs.tampermonkey.net.cn/thread-3284-1-1.html
|
|
5819
|
+
* + 作者: cxxjackie
|
|
5820
|
+
* + 实现方式: Object.defineProperty
|
|
5821
|
+
* + 版本: `1.2.4`
|
|
5822
|
+
* + 文档: https://scriptcat.org/zh-CN/script-show-page/637/
|
|
5823
|
+
*/
|
|
5824
|
+
oldAjaxHooker = () => {
|
|
5825
|
+
return AjaxHooker1_2_4();
|
|
5720
5826
|
};
|
|
5721
5827
|
canvasClickByPosition(canvasElement, clientX = 0, clientY = 0, view = this.windowApi.window) {
|
|
5722
5828
|
if (!(canvasElement instanceof HTMLCanvasElement)) {
|
|
@@ -7241,6 +7347,26 @@
|
|
|
7241
7347
|
}
|
|
7242
7348
|
return content;
|
|
7243
7349
|
}
|
|
7350
|
+
/**
|
|
7351
|
+
* 监听页面元素改变并处理
|
|
7352
|
+
* @param target 需要监听的元素,如果不存在,可以等待它出现
|
|
7353
|
+
* @param observer_config MutationObserver的配置
|
|
7354
|
+
* @example
|
|
7355
|
+
Utils.mutationObserver(document.querySelector("div.xxxx"),{
|
|
7356
|
+
"callback":(mutations, observer)=>{},
|
|
7357
|
+
"config":{childList:true,attributes:true}
|
|
7358
|
+
});
|
|
7359
|
+
* @example
|
|
7360
|
+
Utils.mutationObserver(document.querySelectorAll("div.xxxx"),{
|
|
7361
|
+
"callback":(mutations, observer)=>{},
|
|
7362
|
+
"config":{childList:true,attributes:true}}
|
|
7363
|
+
);
|
|
7364
|
+
* @example
|
|
7365
|
+
Utils.mutationObserver($("div.xxxx"),{
|
|
7366
|
+
"callback":(mutations, observer)=>{},
|
|
7367
|
+
"config":{childList:true,attributes:true}}
|
|
7368
|
+
);
|
|
7369
|
+
**/
|
|
7244
7370
|
mutationObserver(target, observer_config) {
|
|
7245
7371
|
const that = this;
|
|
7246
7372
|
const default_obverser_config = {
|
|
@@ -7283,16 +7409,24 @@
|
|
|
7283
7409
|
characterDataOldValue: void 0,
|
|
7284
7410
|
},
|
|
7285
7411
|
immediate: false,
|
|
7412
|
+
once: false,
|
|
7286
7413
|
};
|
|
7287
7414
|
observer_config = that.assign(default_obverser_config, observer_config);
|
|
7288
7415
|
const windowMutationObserver = this.windowApi.window.MutationObserver ||
|
|
7289
7416
|
this.windowApi.window.webkitMutationObserver ||
|
|
7290
7417
|
this.windowApi.window.MozMutationObserver;
|
|
7291
7418
|
// 观察者对象
|
|
7292
|
-
const
|
|
7419
|
+
const handler = (mutations, observer) => {
|
|
7420
|
+
if (observer_config.once) {
|
|
7421
|
+
// 仅触发一次
|
|
7422
|
+
observer.disconnect();
|
|
7423
|
+
}
|
|
7293
7424
|
if (typeof observer_config.callback === "function") {
|
|
7294
7425
|
observer_config.callback(mutations, observer);
|
|
7295
7426
|
}
|
|
7427
|
+
};
|
|
7428
|
+
const mutationObserver = new windowMutationObserver(function (mutations, observer) {
|
|
7429
|
+
handler(mutations, observer);
|
|
7296
7430
|
});
|
|
7297
7431
|
if (Array.isArray(target) || target instanceof NodeList) {
|
|
7298
7432
|
// 传入的是数组或者元素数组
|
|
@@ -7301,7 +7435,7 @@
|
|
|
7301
7435
|
});
|
|
7302
7436
|
}
|
|
7303
7437
|
else if (that.isJQuery(target)) {
|
|
7304
|
-
|
|
7438
|
+
// 传入的参数是jQuery对象
|
|
7305
7439
|
target.each((_, item) => {
|
|
7306
7440
|
mutationObserver.observe(item, observer_config.config);
|
|
7307
7441
|
});
|
|
@@ -7310,16 +7444,14 @@
|
|
|
7310
7444
|
mutationObserver.observe(target, observer_config.config);
|
|
7311
7445
|
}
|
|
7312
7446
|
if (observer_config.immediate) {
|
|
7313
|
-
|
|
7314
|
-
|
|
7315
|
-
observer_config.callback([], mutationObserver);
|
|
7316
|
-
}
|
|
7447
|
+
// 主动触发一次
|
|
7448
|
+
handler([], mutationObserver);
|
|
7317
7449
|
}
|
|
7318
7450
|
return mutationObserver;
|
|
7319
7451
|
}
|
|
7320
7452
|
/**
|
|
7321
7453
|
* 使用观察器观察元素出现在视图内,出现的话触发回调
|
|
7322
|
-
* @param
|
|
7454
|
+
* @param $el 目标元素
|
|
7323
7455
|
* @param callback 触发的回调
|
|
7324
7456
|
* @param options 观察器配置
|
|
7325
7457
|
* @example
|
|
@@ -7327,34 +7459,47 @@
|
|
|
7327
7459
|
* console.log("该元素出现在视图内");
|
|
7328
7460
|
* }))
|
|
7329
7461
|
*/
|
|
7330
|
-
mutationVisible(
|
|
7462
|
+
mutationVisible($el, callback, options) {
|
|
7331
7463
|
if (typeof IntersectionObserver === "undefined") {
|
|
7332
7464
|
throw new TypeError("IntersectionObserver is not defined");
|
|
7333
7465
|
}
|
|
7334
|
-
if (
|
|
7466
|
+
if ($el == null) {
|
|
7335
7467
|
throw new TypeError("mutatuinVisible target is null");
|
|
7336
7468
|
}
|
|
7469
|
+
options = options || {};
|
|
7337
7470
|
let defaultOptions = {
|
|
7338
7471
|
root: null,
|
|
7339
7472
|
rootMargin: "0px 0px 0px 0px",
|
|
7340
7473
|
threshold: [0.01, 0.99],
|
|
7341
7474
|
};
|
|
7342
|
-
defaultOptions = this.assign(defaultOptions, options
|
|
7475
|
+
defaultOptions = this.assign(defaultOptions, options);
|
|
7476
|
+
const handler = (entries, observer) => {
|
|
7477
|
+
if (options.once) {
|
|
7478
|
+
// 仅触发一次
|
|
7479
|
+
observer.disconnect();
|
|
7480
|
+
}
|
|
7481
|
+
if (typeof callback === "function") {
|
|
7482
|
+
callback(entries, observer);
|
|
7483
|
+
}
|
|
7484
|
+
};
|
|
7343
7485
|
const intersectionObserver = new IntersectionObserver((entries, observer) => {
|
|
7344
7486
|
if (entries[0].isIntersecting) {
|
|
7345
|
-
|
|
7346
|
-
callback(entries, observer);
|
|
7347
|
-
}
|
|
7487
|
+
handler(entries, observer);
|
|
7348
7488
|
}
|
|
7349
7489
|
}, defaultOptions);
|
|
7350
|
-
if (Array.isArray(
|
|
7351
|
-
|
|
7352
|
-
intersectionObserver.observe(
|
|
7490
|
+
if (Array.isArray($el)) {
|
|
7491
|
+
$el.forEach(($elItem) => {
|
|
7492
|
+
intersectionObserver.observe($elItem);
|
|
7353
7493
|
});
|
|
7354
7494
|
}
|
|
7355
7495
|
else {
|
|
7356
|
-
intersectionObserver.observe(
|
|
7496
|
+
intersectionObserver.observe($el);
|
|
7357
7497
|
}
|
|
7498
|
+
if (options.immediate) {
|
|
7499
|
+
// 立即触发
|
|
7500
|
+
handler([], intersectionObserver);
|
|
7501
|
+
}
|
|
7502
|
+
return intersectionObserver;
|
|
7358
7503
|
}
|
|
7359
7504
|
/**
|
|
7360
7505
|
* 去除全局window下的Utils,返回控制权
|
|
@@ -8143,12 +8288,25 @@
|
|
|
8143
8288
|
}
|
|
8144
8289
|
/**
|
|
8145
8290
|
* 将UrlSearchParams格式的字符串转为对象
|
|
8291
|
+
* @param searhParamsStr 字符串或对象
|
|
8292
|
+
* @example
|
|
8293
|
+
* Utils.searchParamStrToObj("xxx=xx&xx2=xx2")
|
|
8294
|
+
* @example
|
|
8295
|
+
* Utils.searchParamStrToObj(new URLSearchParams({
|
|
8296
|
+
* test1: 1,
|
|
8297
|
+
* test2: 2
|
|
8298
|
+
* }))
|
|
8146
8299
|
*/
|
|
8147
8300
|
searchParamStrToObj(searhParamsStr) {
|
|
8148
|
-
|
|
8149
|
-
|
|
8301
|
+
const params = {};
|
|
8302
|
+
if (searhParamsStr == null) {
|
|
8303
|
+
return params;
|
|
8150
8304
|
}
|
|
8151
|
-
|
|
8305
|
+
const urlSearchParams = searhParamsStr instanceof URLSearchParams ? searhParamsStr : new URLSearchParams(searhParamsStr);
|
|
8306
|
+
urlSearchParams.forEach((value, key) => {
|
|
8307
|
+
Reflect.set(params, key, value);
|
|
8308
|
+
});
|
|
8309
|
+
return params;
|
|
8152
8310
|
}
|
|
8153
8311
|
/**
|
|
8154
8312
|
* 提供一个封装了 try-catch 的函数,可以执行传入的函数并捕获其可能抛出的错误,并通过传入的错误处理函数进行处理。
|