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