@whitesev/utils 2.11.10 → 2.11.12
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 +208 -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 +208 -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 +208 -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 +208 -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 +208 -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 +208 -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/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/Httpx.ts +18 -18
- package/src/LockFunction.ts +3 -6
- package/src/Utils.ts +88 -55
- 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.12";
|
|
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
|
};
|
|
@@ -2675,42 +2764,42 @@
|
|
|
2675
2764
|
const method = requestOption.method;
|
|
2676
2765
|
if (method === "GET" || method === "HEAD") {
|
|
2677
2766
|
// GET类型,data如果有,那么需要转为searchParams
|
|
2678
|
-
const
|
|
2767
|
+
const urlInst = new URL(requestOption.url);
|
|
2679
2768
|
let urlSearch = "";
|
|
2680
|
-
let
|
|
2769
|
+
let deleteData = false;
|
|
2681
2770
|
if (typeof requestOption.data === "string") {
|
|
2682
|
-
|
|
2771
|
+
deleteData = true;
|
|
2683
2772
|
urlSearch = requestOption.data;
|
|
2684
2773
|
}
|
|
2685
2774
|
else if (typeof requestOption.data === "object") {
|
|
2686
|
-
|
|
2775
|
+
deleteData = true;
|
|
2687
2776
|
// URLSearchParams参数可以转普通的string:string,包括FormData
|
|
2688
2777
|
const searchParams = new URLSearchParams(requestOption.data);
|
|
2689
2778
|
urlSearch = searchParams.toString();
|
|
2690
2779
|
}
|
|
2691
|
-
if (
|
|
2780
|
+
if (deleteData) {
|
|
2692
2781
|
// GET/HEAD请求不支持data参数
|
|
2693
2782
|
// 对data进行处理了才可以删除
|
|
2694
2783
|
Reflect.deleteProperty(requestOption, "data");
|
|
2695
2784
|
}
|
|
2696
|
-
if (urlSearch != "") {
|
|
2697
|
-
if (
|
|
2785
|
+
if (urlSearch.trim() != "") {
|
|
2786
|
+
if (urlInst.search.trim() === "") {
|
|
2698
2787
|
// url没有search参数,直接覆盖
|
|
2699
|
-
|
|
2788
|
+
urlInst.search = urlSearch;
|
|
2700
2789
|
}
|
|
2701
2790
|
else {
|
|
2702
2791
|
// 有search参数
|
|
2703
|
-
if (
|
|
2792
|
+
if (urlInst.search.trim().endsWith("&")) {
|
|
2704
2793
|
// xxx=xxx&
|
|
2705
|
-
|
|
2794
|
+
urlInst.search = urlInst.search + urlSearch;
|
|
2706
2795
|
}
|
|
2707
2796
|
else {
|
|
2708
2797
|
// xxx=xxx&xxx=
|
|
2709
|
-
|
|
2798
|
+
urlInst.search = `${urlInst.search}&${urlSearch}`;
|
|
2710
2799
|
}
|
|
2711
2800
|
}
|
|
2712
2801
|
}
|
|
2713
|
-
requestOption.url =
|
|
2802
|
+
requestOption.url = urlInst.toString();
|
|
2714
2803
|
}
|
|
2715
2804
|
else if (method === "POST" && requestOption.headers != null) {
|
|
2716
2805
|
// POST类型,data如果是FormData,那么需要转为string
|
|
@@ -2720,10 +2809,10 @@
|
|
|
2720
2809
|
typeof requestOption.headers[headerKey] === "string");
|
|
2721
2810
|
});
|
|
2722
2811
|
if (ContentTypeIndex !== -1) {
|
|
2723
|
-
const
|
|
2724
|
-
const
|
|
2812
|
+
const contentTypeKey = headersKeyList[ContentTypeIndex];
|
|
2813
|
+
const contentType = requestOption.headers[contentTypeKey].toLowerCase();
|
|
2725
2814
|
// 设置了Content-Type
|
|
2726
|
-
if (
|
|
2815
|
+
if (contentType.includes("application/json")) {
|
|
2727
2816
|
// application/json
|
|
2728
2817
|
if (requestOption.data instanceof FormData) {
|
|
2729
2818
|
const entries = {};
|
|
@@ -2736,16 +2825,16 @@
|
|
|
2736
2825
|
requestOption.data = JSON.stringify(requestOption.data);
|
|
2737
2826
|
}
|
|
2738
2827
|
}
|
|
2739
|
-
else if (
|
|
2828
|
+
else if (contentType.includes("application/x-www-form-urlencoded")) {
|
|
2740
2829
|
// application/x-www-form-urlencoded
|
|
2741
2830
|
if (typeof requestOption.data === "object") {
|
|
2742
2831
|
requestOption.data = new URLSearchParams(requestOption.data).toString();
|
|
2743
2832
|
}
|
|
2744
2833
|
}
|
|
2745
|
-
else if (
|
|
2834
|
+
else if (contentType.includes("multipart/form-data")) {
|
|
2746
2835
|
// multipart/form-data
|
|
2747
2836
|
if (requestOption.data instanceof FormData) {
|
|
2748
|
-
Reflect.deleteProperty(requestOption.headers,
|
|
2837
|
+
Reflect.deleteProperty(requestOption.headers, contentTypeKey);
|
|
2749
2838
|
}
|
|
2750
2839
|
}
|
|
2751
2840
|
}
|
|
@@ -5703,20 +5792,25 @@
|
|
|
5703
5792
|
}
|
|
5704
5793
|
/**
|
|
5705
5794
|
* ajax劫持库,支持xhr和fetch劫持。
|
|
5706
|
-
* +
|
|
5707
|
-
* +
|
|
5708
|
-
* +
|
|
5709
|
-
* +
|
|
5710
|
-
* +
|
|
5711
|
-
|
|
5712
|
-
|
|
5713
|
-
|
|
5714
|
-
|
|
5715
|
-
|
|
5716
|
-
|
|
5717
|
-
|
|
5718
|
-
|
|
5719
|
-
|
|
5795
|
+
* + 来源: https://bbs.tampermonkey.net.cn/thread-3284-1-1.html
|
|
5796
|
+
* + 作者: cxxjackie
|
|
5797
|
+
* + 实现方式: Proxy
|
|
5798
|
+
* + 版本: `1.4.8`
|
|
5799
|
+
* + 文档: https://scriptcat.org/zh-CN/script-show-page/637/
|
|
5800
|
+
*/
|
|
5801
|
+
ajaxHooker = () => {
|
|
5802
|
+
return ajaxHooker();
|
|
5803
|
+
};
|
|
5804
|
+
/**
|
|
5805
|
+
* ajax劫持库,支持xhr和fetch劫持。
|
|
5806
|
+
* + 来源: https://bbs.tampermonkey.net.cn/thread-3284-1-1.html
|
|
5807
|
+
* + 作者: cxxjackie
|
|
5808
|
+
* + 实现方式: Object.defineProperty
|
|
5809
|
+
* + 版本: `1.2.4`
|
|
5810
|
+
* + 文档: https://scriptcat.org/zh-CN/script-show-page/637/
|
|
5811
|
+
*/
|
|
5812
|
+
oldAjaxHooker = () => {
|
|
5813
|
+
return AjaxHooker1_2_4();
|
|
5720
5814
|
};
|
|
5721
5815
|
canvasClickByPosition(canvasElement, clientX = 0, clientY = 0, view = this.windowApi.window) {
|
|
5722
5816
|
if (!(canvasElement instanceof HTMLCanvasElement)) {
|
|
@@ -6310,10 +6404,11 @@
|
|
|
6310
6404
|
left: maxRect.left,
|
|
6311
6405
|
};
|
|
6312
6406
|
}
|
|
6313
|
-
|
|
6407
|
+
const calcZIndex = zIndex + deviation;
|
|
6314
6408
|
if (calcZIndex >= maxZIndexCompare) {
|
|
6315
6409
|
// 不要超过最大值
|
|
6316
|
-
|
|
6410
|
+
// 超过就忽略
|
|
6411
|
+
return;
|
|
6317
6412
|
}
|
|
6318
6413
|
return {
|
|
6319
6414
|
/** 计算偏移量后的z-index值 */
|
|
@@ -7240,6 +7335,26 @@
|
|
|
7240
7335
|
}
|
|
7241
7336
|
return content;
|
|
7242
7337
|
}
|
|
7338
|
+
/**
|
|
7339
|
+
* 监听页面元素改变并处理
|
|
7340
|
+
* @param target 需要监听的元素,如果不存在,可以等待它出现
|
|
7341
|
+
* @param observer_config MutationObserver的配置
|
|
7342
|
+
* @example
|
|
7343
|
+
Utils.mutationObserver(document.querySelector("div.xxxx"),{
|
|
7344
|
+
"callback":(mutations, observer)=>{},
|
|
7345
|
+
"config":{childList:true,attributes:true}
|
|
7346
|
+
});
|
|
7347
|
+
* @example
|
|
7348
|
+
Utils.mutationObserver(document.querySelectorAll("div.xxxx"),{
|
|
7349
|
+
"callback":(mutations, observer)=>{},
|
|
7350
|
+
"config":{childList:true,attributes:true}}
|
|
7351
|
+
);
|
|
7352
|
+
* @example
|
|
7353
|
+
Utils.mutationObserver($("div.xxxx"),{
|
|
7354
|
+
"callback":(mutations, observer)=>{},
|
|
7355
|
+
"config":{childList:true,attributes:true}}
|
|
7356
|
+
);
|
|
7357
|
+
**/
|
|
7243
7358
|
mutationObserver(target, observer_config) {
|
|
7244
7359
|
const that = this;
|
|
7245
7360
|
const default_obverser_config = {
|
|
@@ -7282,16 +7397,24 @@
|
|
|
7282
7397
|
characterDataOldValue: void 0,
|
|
7283
7398
|
},
|
|
7284
7399
|
immediate: false,
|
|
7400
|
+
once: false,
|
|
7285
7401
|
};
|
|
7286
7402
|
observer_config = that.assign(default_obverser_config, observer_config);
|
|
7287
7403
|
const windowMutationObserver = this.windowApi.window.MutationObserver ||
|
|
7288
7404
|
this.windowApi.window.webkitMutationObserver ||
|
|
7289
7405
|
this.windowApi.window.MozMutationObserver;
|
|
7290
7406
|
// 观察者对象
|
|
7291
|
-
const
|
|
7407
|
+
const handler = (mutations, observer) => {
|
|
7408
|
+
if (observer_config.once) {
|
|
7409
|
+
// 仅触发一次
|
|
7410
|
+
observer.disconnect();
|
|
7411
|
+
}
|
|
7292
7412
|
if (typeof observer_config.callback === "function") {
|
|
7293
7413
|
observer_config.callback(mutations, observer);
|
|
7294
7414
|
}
|
|
7415
|
+
};
|
|
7416
|
+
const mutationObserver = new windowMutationObserver(function (mutations, observer) {
|
|
7417
|
+
handler(mutations, observer);
|
|
7295
7418
|
});
|
|
7296
7419
|
if (Array.isArray(target) || target instanceof NodeList) {
|
|
7297
7420
|
// 传入的是数组或者元素数组
|
|
@@ -7300,7 +7423,7 @@
|
|
|
7300
7423
|
});
|
|
7301
7424
|
}
|
|
7302
7425
|
else if (that.isJQuery(target)) {
|
|
7303
|
-
|
|
7426
|
+
// 传入的参数是jQuery对象
|
|
7304
7427
|
target.each((_, item) => {
|
|
7305
7428
|
mutationObserver.observe(item, observer_config.config);
|
|
7306
7429
|
});
|
|
@@ -7309,16 +7432,14 @@
|
|
|
7309
7432
|
mutationObserver.observe(target, observer_config.config);
|
|
7310
7433
|
}
|
|
7311
7434
|
if (observer_config.immediate) {
|
|
7312
|
-
|
|
7313
|
-
|
|
7314
|
-
observer_config.callback([], mutationObserver);
|
|
7315
|
-
}
|
|
7435
|
+
// 主动触发一次
|
|
7436
|
+
handler([], mutationObserver);
|
|
7316
7437
|
}
|
|
7317
7438
|
return mutationObserver;
|
|
7318
7439
|
}
|
|
7319
7440
|
/**
|
|
7320
7441
|
* 使用观察器观察元素出现在视图内,出现的话触发回调
|
|
7321
|
-
* @param
|
|
7442
|
+
* @param $el 目标元素
|
|
7322
7443
|
* @param callback 触发的回调
|
|
7323
7444
|
* @param options 观察器配置
|
|
7324
7445
|
* @example
|
|
@@ -7326,34 +7447,47 @@
|
|
|
7326
7447
|
* console.log("该元素出现在视图内");
|
|
7327
7448
|
* }))
|
|
7328
7449
|
*/
|
|
7329
|
-
mutationVisible(
|
|
7450
|
+
mutationVisible($el, callback, options) {
|
|
7330
7451
|
if (typeof IntersectionObserver === "undefined") {
|
|
7331
7452
|
throw new TypeError("IntersectionObserver is not defined");
|
|
7332
7453
|
}
|
|
7333
|
-
if (
|
|
7454
|
+
if ($el == null) {
|
|
7334
7455
|
throw new TypeError("mutatuinVisible target is null");
|
|
7335
7456
|
}
|
|
7457
|
+
options = options || {};
|
|
7336
7458
|
let defaultOptions = {
|
|
7337
7459
|
root: null,
|
|
7338
7460
|
rootMargin: "0px 0px 0px 0px",
|
|
7339
7461
|
threshold: [0.01, 0.99],
|
|
7340
7462
|
};
|
|
7341
|
-
defaultOptions = this.assign(defaultOptions, options
|
|
7463
|
+
defaultOptions = this.assign(defaultOptions, options);
|
|
7464
|
+
const handler = (entries, observer) => {
|
|
7465
|
+
if (options.once) {
|
|
7466
|
+
// 仅触发一次
|
|
7467
|
+
observer.disconnect();
|
|
7468
|
+
}
|
|
7469
|
+
if (typeof callback === "function") {
|
|
7470
|
+
callback(entries, observer);
|
|
7471
|
+
}
|
|
7472
|
+
};
|
|
7342
7473
|
const intersectionObserver = new IntersectionObserver((entries, observer) => {
|
|
7343
7474
|
if (entries[0].isIntersecting) {
|
|
7344
|
-
|
|
7345
|
-
callback(entries, observer);
|
|
7346
|
-
}
|
|
7475
|
+
handler(entries, observer);
|
|
7347
7476
|
}
|
|
7348
7477
|
}, defaultOptions);
|
|
7349
|
-
if (Array.isArray(
|
|
7350
|
-
|
|
7351
|
-
intersectionObserver.observe(
|
|
7478
|
+
if (Array.isArray($el)) {
|
|
7479
|
+
$el.forEach(($elItem) => {
|
|
7480
|
+
intersectionObserver.observe($elItem);
|
|
7352
7481
|
});
|
|
7353
7482
|
}
|
|
7354
7483
|
else {
|
|
7355
|
-
intersectionObserver.observe(
|
|
7484
|
+
intersectionObserver.observe($el);
|
|
7356
7485
|
}
|
|
7486
|
+
if (options.immediate) {
|
|
7487
|
+
// 立即触发
|
|
7488
|
+
handler([], intersectionObserver);
|
|
7489
|
+
}
|
|
7490
|
+
return intersectionObserver;
|
|
7357
7491
|
}
|
|
7358
7492
|
/**
|
|
7359
7493
|
* 去除全局window下的Utils,返回控制权
|
|
@@ -8142,12 +8276,25 @@
|
|
|
8142
8276
|
}
|
|
8143
8277
|
/**
|
|
8144
8278
|
* 将UrlSearchParams格式的字符串转为对象
|
|
8279
|
+
* @param searhParamsStr 字符串或对象
|
|
8280
|
+
* @example
|
|
8281
|
+
* Utils.searchParamStrToObj("xxx=xx&xx2=xx2")
|
|
8282
|
+
* @example
|
|
8283
|
+
* Utils.searchParamStrToObj(new URLSearchParams({
|
|
8284
|
+
* test1: 1,
|
|
8285
|
+
* test2: 2
|
|
8286
|
+
* }))
|
|
8145
8287
|
*/
|
|
8146
8288
|
searchParamStrToObj(searhParamsStr) {
|
|
8147
|
-
|
|
8148
|
-
|
|
8289
|
+
const params = {};
|
|
8290
|
+
if (searhParamsStr == null) {
|
|
8291
|
+
return params;
|
|
8149
8292
|
}
|
|
8150
|
-
|
|
8293
|
+
const urlSearchParams = searhParamsStr instanceof URLSearchParams ? searhParamsStr : new URLSearchParams(searhParamsStr);
|
|
8294
|
+
urlSearchParams.forEach((value, key) => {
|
|
8295
|
+
Reflect.set(params, key, value);
|
|
8296
|
+
});
|
|
8297
|
+
return params;
|
|
8151
8298
|
}
|
|
8152
8299
|
/**
|
|
8153
8300
|
* 提供一个封装了 try-catch 的函数,可以执行传入的函数并捕获其可能抛出的错误,并通过传入的错误处理函数进行处理。
|