ph-utils 0.15.3 → 0.15.4
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/README.md +7 -7
- package/lib/array.d.ts +3 -3
- package/lib/clipboard.d.ts +11 -0
- package/lib/clipboard.js +101 -0
- package/lib/dom.d.ts +2 -2
- package/lib/dom.js +19 -2
- package/lib/server.d.ts +0 -1
- package/lib/theme.js +4 -4
- package/package.json +1 -1
package/README.md
CHANGED
@@ -1,7 +1,7 @@
|
|
1
|
-
## ph-utils
|
2
|
-
|
3
|
-
整理了 js 前后端开发(web + nodejs)时常用的一些工具;[详细文档](https://gitee.com/towardly/ph/wikis/Home?sort_id=4035190)
|
4
|
-
|
5
|
-
### 包含如下工具文件
|
6
|
-
|
7
|
-
`index` 基础工具类、`date` 跟日期相关的工具类、`file` 文件操作相关工具类[**服务端**]、`server` 服务端工具类、`validator` 数据验证、`dom` 浏览器节点操作相关[**前端**]、`web` 一些只适用于前端相关的工具、`color` 颜色相关工具
|
1
|
+
## ph-utils
|
2
|
+
|
3
|
+
整理了 js 前后端开发(web + nodejs)时常用的一些工具;[详细文档](https://gitee.com/towardly/ph/wikis/Home?sort_id=4035190)
|
4
|
+
|
5
|
+
### 包含如下工具文件
|
6
|
+
|
7
|
+
`index` 基础工具类、`date` 跟日期相关的工具类、`file` 文件操作相关工具类[**服务端**]、`server` 服务端工具类、`validator` 数据验证、`dom` 浏览器节点操作相关[**前端**]、`web` 一些只适用于前端相关的工具、`color` 颜色相关工具
|
package/lib/array.d.ts
CHANGED
@@ -59,14 +59,14 @@ export declare function symmetricDifference<T>(...arrs: T[][]): T[];
|
|
59
59
|
* @param a2
|
60
60
|
* @returns
|
61
61
|
*/
|
62
|
-
export declare function isSubsetOf<T>(a1: T[] | Set<T>, a2: T[] | Set<T>):
|
62
|
+
export declare function isSubsetOf<T>(a1: T[] | Set<T>, a2: T[] | Set<T>): boolean;
|
63
63
|
/**
|
64
64
|
* 返回一个布尔值,指示给定集合中的所有元素是否都在此集合中。
|
65
65
|
* @param arr1
|
66
66
|
* @param arr2
|
67
67
|
* @returns
|
68
68
|
*/
|
69
|
-
export declare function isSupersetOf<T>(arr1: T[] | Set<T>, arr2: T[] | Set<T>):
|
69
|
+
export declare function isSupersetOf<T>(arr1: T[] | Set<T>, arr2: T[] | Set<T>): boolean;
|
70
70
|
/**
|
71
71
|
* 返回一个布尔值,指示此集合是否与给定集合没有公共元素。
|
72
72
|
*
|
@@ -76,4 +76,4 @@ export declare function isSupersetOf<T>(arr1: T[] | Set<T>, arr2: T[] | Set<T>):
|
|
76
76
|
* @param arr2
|
77
77
|
* @returns
|
78
78
|
*/
|
79
|
-
export declare function isDisjointFrom<T>(arr1: T[] | Set<T>, arr2: T[] | Set<T>):
|
79
|
+
export declare function isDisjointFrom<T>(arr1: T[] | Set<T>, arr2: T[] | Set<T>): boolean;
|
@@ -0,0 +1,11 @@
|
|
1
|
+
/**
|
2
|
+
* 复制数据, 可以从多种类型的数据
|
3
|
+
* 1. 直接复制文本: await copy("待复制的文本")
|
4
|
+
* 2. 复制节点上的 data-copy-text:
|
5
|
+
* <button data-copy-text="这是待复制的文本">复制</button>
|
6
|
+
* await copy(e.target) // or await copy("#a") or await copy(document.querySelector('#a'))
|
7
|
+
* 3. 直接复制节点本身数据: await copy('#a')
|
8
|
+
* @param {string | HTMLElement} source 复制源, 从中解析待复制的数据
|
9
|
+
* @returns {Promise<boolean>} 是否复制成功
|
10
|
+
*/
|
11
|
+
export declare function copy(source: string | HTMLElement): Promise<boolean>;
|
package/lib/clipboard.js
ADDED
@@ -0,0 +1,101 @@
|
|
1
|
+
/**
|
2
|
+
* 创建一个临时节点缓存待复制数据
|
3
|
+
* @param {String} value - 待复制文本
|
4
|
+
* @return {HTMLElement}
|
5
|
+
*/
|
6
|
+
function createFakeElement(value) {
|
7
|
+
const fakeElement = document.createElement("textarea");
|
8
|
+
fakeElement.style.border = "0";
|
9
|
+
fakeElement.style.padding = "0";
|
10
|
+
fakeElement.style.margin = "0";
|
11
|
+
fakeElement.style.position = "absolute";
|
12
|
+
fakeElement.style.left = "-9999px";
|
13
|
+
fakeElement.style.top = "-9999";
|
14
|
+
fakeElement.setAttribute("readonly", "");
|
15
|
+
fakeElement.value = value;
|
16
|
+
return fakeElement;
|
17
|
+
}
|
18
|
+
/** 通过执行 execCommand 来执行复制 */
|
19
|
+
function copyFromCommand(text) {
|
20
|
+
// 添加节点
|
21
|
+
const fakeEl = createFakeElement(text);
|
22
|
+
document.body.append(fakeEl);
|
23
|
+
fakeEl.focus();
|
24
|
+
fakeEl.select();
|
25
|
+
// 执行复制
|
26
|
+
const res = document.execCommand("copy");
|
27
|
+
fakeEl.remove(); // 删除节点
|
28
|
+
return Promise.resolve(res);
|
29
|
+
}
|
30
|
+
/** 使用 navigator.clipboard 复制 */
|
31
|
+
function copyFromClipboard(text) {
|
32
|
+
const theClipboard = navigator.clipboard;
|
33
|
+
if (theClipboard != null) {
|
34
|
+
return theClipboard
|
35
|
+
.writeText(text)
|
36
|
+
.then(() => {
|
37
|
+
Promise.resolve(true);
|
38
|
+
})
|
39
|
+
.catch(() => Promise.resolve(false));
|
40
|
+
}
|
41
|
+
return Promise.resolve(false);
|
42
|
+
}
|
43
|
+
/** 解析待复制的文本 */
|
44
|
+
function parseCopyText(source) {
|
45
|
+
let copyText = null; // 待复制文本
|
46
|
+
let sourceEl = null;
|
47
|
+
// 获取待复制数据
|
48
|
+
if (typeof source === "string") {
|
49
|
+
// 从节点拿数据
|
50
|
+
if (source.startsWith("#") || source.startsWith(".")) {
|
51
|
+
sourceEl = document.querySelector(source);
|
52
|
+
if (sourceEl == null) {
|
53
|
+
copyText = source;
|
54
|
+
}
|
55
|
+
}
|
56
|
+
else {
|
57
|
+
copyText = source;
|
58
|
+
}
|
59
|
+
}
|
60
|
+
if (source instanceof HTMLElement) {
|
61
|
+
sourceEl = source;
|
62
|
+
}
|
63
|
+
// 从节点获取待复制数据
|
64
|
+
if (sourceEl != null) {
|
65
|
+
if (sourceEl.hasAttribute("data-copy-text")) {
|
66
|
+
copyText = sourceEl.getAttribute("data-copy-text");
|
67
|
+
}
|
68
|
+
else {
|
69
|
+
const tagName = sourceEl.tagName;
|
70
|
+
if (tagName === "INPUT" || tagName === "TEXTAREA") {
|
71
|
+
copyText = sourceEl.value;
|
72
|
+
}
|
73
|
+
else {
|
74
|
+
copyText = sourceEl.textContent;
|
75
|
+
}
|
76
|
+
}
|
77
|
+
}
|
78
|
+
return copyText;
|
79
|
+
}
|
80
|
+
/**
|
81
|
+
* 复制数据, 可以从多种类型的数据
|
82
|
+
* 1. 直接复制文本: await copy("待复制的文本")
|
83
|
+
* 2. 复制节点上的 data-copy-text:
|
84
|
+
* <button data-copy-text="这是待复制的文本">复制</button>
|
85
|
+
* await copy(e.target) // or await copy("#a") or await copy(document.querySelector('#a'))
|
86
|
+
* 3. 直接复制节点本身数据: await copy('#a')
|
87
|
+
* @param {string | HTMLElement} source 复制源, 从中解析待复制的数据
|
88
|
+
* @returns {Promise<boolean>} 是否复制成功
|
89
|
+
*/
|
90
|
+
export async function copy(source) {
|
91
|
+
// 待复制文本
|
92
|
+
const copyText = parseCopyText(source);
|
93
|
+
if (copyText == null) {
|
94
|
+
return Promise.resolve(false);
|
95
|
+
}
|
96
|
+
const v = await copyFromClipboard(copyText);
|
97
|
+
if (v === false) {
|
98
|
+
return copyFromCommand(copyText);
|
99
|
+
}
|
100
|
+
return Promise.resolve(true);
|
101
|
+
}
|
package/lib/dom.d.ts
CHANGED
@@ -150,9 +150,9 @@ export declare function getAttr<T extends Record<string, string | number | boole
|
|
150
150
|
*/
|
151
151
|
export declare function parent(el: HTMLElement): HTMLElement;
|
152
152
|
/**
|
153
|
-
*
|
153
|
+
* 获取隐藏节点的尺寸, 如果 parent 传空, 且 hideNode 为节点,则会通过修改原始样式方式计算
|
154
154
|
* @param {string | HTMLElement} hideNode - The node to hide.
|
155
|
-
* @param parent -
|
155
|
+
* @param parent - 添加临时节点的父节点, 如果传递 null, 则通过修改原始样式方式计算,默认为: body.
|
156
156
|
* @returns The DOMRect of the element.
|
157
157
|
*/
|
158
158
|
export declare function queryHideNodeSize(hideNode: string | HTMLElement, parent?: HTMLElement): {
|
package/lib/dom.js
CHANGED
@@ -282,12 +282,29 @@ export function parent(el) {
|
|
282
282
|
return el.parentNode;
|
283
283
|
}
|
284
284
|
/**
|
285
|
-
*
|
285
|
+
* 获取隐藏节点的尺寸, 如果 parent 传空, 且 hideNode 为节点,则会通过修改原始样式方式计算
|
286
286
|
* @param {string | HTMLElement} hideNode - The node to hide.
|
287
|
-
* @param parent -
|
287
|
+
* @param parent - 添加临时节点的父节点, 如果传递 null, 则通过修改原始样式方式计算,默认为: body.
|
288
288
|
* @returns The DOMRect of the element.
|
289
289
|
*/
|
290
290
|
export function queryHideNodeSize(hideNode, parent = document.body) {
|
291
|
+
if (parent == null && typeof hideNode !== "string") {
|
292
|
+
// 保存原来的样式
|
293
|
+
const originalDisplay = hideNode.style.display;
|
294
|
+
const originalVisibility = hideNode.style.visibility;
|
295
|
+
const originalPosition = hideNode.style.position;
|
296
|
+
// 设置为可见但不可见状态,不影响布局
|
297
|
+
hideNode.style.display = "block";
|
298
|
+
hideNode.style.visibility = "hidden";
|
299
|
+
hideNode.style.position = "absolute";
|
300
|
+
// 读取高度
|
301
|
+
const rect = hideNode.getBoundingClientRect();
|
302
|
+
// 恢复原样式
|
303
|
+
hideNode.style.display = originalDisplay;
|
304
|
+
hideNode.style.visibility = originalVisibility;
|
305
|
+
hideNode.style.position = originalPosition;
|
306
|
+
return { width: rect.width, height: rect.height };
|
307
|
+
}
|
291
308
|
// 计算折叠菜单的高度
|
292
309
|
let $tmp = document.createElement("div");
|
293
310
|
$tmp.style.cssText = "position:fixed;left:-1000px;top:-1000px;opacity:0;";
|
package/lib/server.d.ts
CHANGED
package/lib/theme.js
CHANGED
@@ -19,10 +19,10 @@ export async function initTheme() {
|
|
19
19
|
if ($themeStyle == null) {
|
20
20
|
$themeStyle = document.createElement("style");
|
21
21
|
$themeStyle.id = "theme-style";
|
22
|
-
$themeStyle.innerHTML = `
|
23
|
-
:root{color-scheme:light dark;}
|
24
|
-
html.light{color-scheme: light;}
|
25
|
-
html.dark {color-scheme: dark;}
|
22
|
+
$themeStyle.innerHTML = `
|
23
|
+
:root{color-scheme:light dark;}
|
24
|
+
html.light{color-scheme: light;}
|
25
|
+
html.dark {color-scheme: dark;}
|
26
26
|
`;
|
27
27
|
document.head.appendChild($themeStyle);
|
28
28
|
}
|