書到用時方恨少,一大波JS開發工具函式來了
前言
在我們日常開發的時候,可能會遇到各種各樣的需求,但是自己一時半會兒可能找不到合適的辦法去解決。書到用時方恨少,下面的這些JavaScript的工具函式可能就會派上大用場了,我們可以進行復用,提高我們的工作效率。
我把下面的方法都大致分了個類放在了我的GitHub上。大家可以
clone
下來直接使用,也可以在需要用到時在裡面去查詢,善用
ctrl+F
。
這個倉庫也會持更新的,如果裡面沒有,但是需要用到的工具函式,大家也可以在issues提出來,說不定就幫到了別人喲~
正則校驗check工具函式
這裡的正則表示式主要參考了any-rule。
驗證不能包含字母
/**
* @param { string } value
*/
export
const
isNoWord
=
value
=>
/^
[
^
A
-
Za
-
z
]
*
$
/
g
。
test
(
value
);
驗證中文和數字
/**
* @param { string } value
*/
export
const
isCHNAndEN
=
value
=>
/^
((
?:
[
\u3400
-
\u4DB5\u4E00
-
\u9FEA\uFA0E\uFA0F\uFA11\uFA13\uFA14\uFA1F\uFA21\uFA23\uFA24\uFA27
-
\uFA29
]
|
[
\uD840
-
\uD868\uD86A
-
\uD86C\uD86F
-
\uD872\uD874
-
\uD879
][
\uDC00
-
\uDFFF
]
|
\uD869
[
\uDC00
-
\uDED6\uDF00
-
\uDFFF
]
|
\uD86D
[
\uDC00
-
\uDF34\uDF40
-
\uDFFF
]
|
\uD86E
[
\uDC00
-
\uDC1D\uDC20
-
\uDFFF
]
|
\uD873
[
\uDC00
-
\uDEA1\uDEB0
-
\uDFFF
]
|
\uD87A
[
\uDC00
-
\uDFE0
])
|
(
\
d
))
+
$
/
g
。
test
(
value
);
驗證郵政編碼(中國)
/**
* @param { string } value
*/
export
const
isPostcode
=
value
=>
/^
(
0
[
1
-
7
]
|
1
[
0
-
356
]
|
2
[
0
-
7
]
|
3
[
0
-
6
]
|
4
[
0
-
7
]
|
5
[
1
-
7
]
|
6
[
1
-
7
]
|
7
[
0
-
5
]
|
8
[
013
-
6
])
\
d
{
4
}
$
/
g
。
test
(
value
);
驗證微訊號,6至20位,以字母開頭,字母,數字,減號,下劃線
/**
* @param { string } value
*/
export
const
isWeChatNum
=
value
=>
/^
[
a
-
zA
-
Z
][
-
_a
-
zA
-
Z0
-
9
]{
5
,
19
}
$
/
g
。
test
(
value
);
### 驗證16進位制顏色
/**
* @param { string } value
*/
export
const
isColor16
=
value
=>
/^
#
?
([
a
-
fA
-
F0
-
9
]{
6
}
|
[
a
-
fA
-
F0
-
9
]{
3
})
$
/
g
。
test
(
value
);
驗證火車車次
/**
* @param { string } value
*/
export
const
isTrainNum
=
value
=>
/^
[
GCDZTSPKXLY1
-
9
]
\
d
{
1
,
4
}
$
/
g
。
test
(
value
);
驗證手機機身碼(IMEI)
/**
* @param { string } value
*/
export
const
isIMEI
=
value
=>
/^
\
d
{
15
,
17
}
$
/
g
。
test
(
value
);
驗證必須帶埠號的網址(或ip)
/**
* @param { string } value
*/
export
const
isHttpAndPort
=
value
=>
/^
((
ht
|
f
)
tps
?:
\
/
\
/
)
?
[
\
w
-
]
+
(
\
。[
\
w
-
]
+
)
+:
\
d
{
1
,
5
}
\
/?
$
/
g
。
test
(
value
);
### 驗證網址(支援埠和“?+引數”和“#+引數)
/**
* @param { string } value
*/
export
const
isRightWebsite
=
value
=>
/^
(((
ht
|
f
)
tps
?
)
:
\
/
\
/
)
?
[
\
w
-
]
+
(
\
。[
\
w
-
]
+
)
+
([
\
w
。,
@
?^=%&:
/~+#-]*[\w@?^=%&/~+#-])?$/g
。
test
(
value
);
驗證統一社會信用程式碼
/**
* @param { string } value
*/
export
const
isCreditCode
=
value
=>
/^
[
0
-
9
A
-
HJ
-
NPQRTUWXY
]{
2
}
\
d
{
6
}[
0
-
9
A
-
HJ
-
NPQRTUWXY
]{
10
}
$
/
g
。
test
(
value
);
驗證迅雷連結
/**
* @param { string } value
*/
export
const
isThunderLink
=
value
=>
/^
thunderx
?:
\
/
\
/
[
a
-
zA
-
Z
\
d
]
+=
$
/
g
。
test
(
value
);
### 驗證ed2k連結(寬鬆匹配)
/**
* @param { string } value
*/
export
const
ised2k
=
value
=>
/^
ed2k
:
\
/
\
/
\
|
file
\
|
。
+
\
|
\
/
$
/
g
。
test
(
value
);
驗證磁力連結(寬鬆匹配)
/**
* @param { string } value
*/
export
const
isMagnet
=
value
=>
/^
magnet
:
\
?
xt
=
urn
:
btih
:
[
0
-
9
a
-
fA
-
F
]{
40
,}。
*
$
/
g
。
test
(
value
);
驗證子網掩碼
/**
* @param { string } value
*/
export
const
isSubnetMask
=
value
=>
/^
(
?:
\
d
{
1
,
2
}
|
1
\
d
\
d
|
2
[
0
-
4
]
\
d
|
25
[
0
-
5
])(
?:
\
。(
?:
\
d
{
1
,
2
}
|
1
\
d
\
d
|
2
[
0
-
4
]
\
d
|
25
[
0
-
5
])){
3
}
$
/
g
。
test
(
value
);
驗證linux”資料夾“路徑
/**
* @param { string } value
*/
export
const
isLinuxFolderPath
=
value
=>
/^
(
\
/
[
^
/]+)+\/?$/g
。
test
(
value
);
### 驗證linux”檔案“路徑
/**
* @param { string } value
*/
export
const
isLinuxFilePath
=
value
=>
/^
(
\
/
[
^
/]+)+$/g
。
test
(
value
);
驗證window”資料夾“路徑
/**
* @param { string } value
*/
export
const
isWindowsFolderPath
=
value
=>
/^
[
a
-
zA
-
Z
]
:
\\
(
?:
\
w
+
\\
?
)
*
$
/
g
。
test
(
value
);
驗證window下”檔案“路徑
/**
* @param { string } value
*/
export
const
isWindowsFilePath
=
value
=>
/^
[
a
-
zA
-
Z
]
:
\\
(
?:
\
w
+
\\
)
*
\
w
+
\
。
\
w
+
$
/
g
。
test
(
value
);
驗證股票程式碼(A股)
/**
* @param { string } value
*/
export
const
isAShare
=
value
=>
/^
(
s
[
hz
]
|
S
[
HZ
])(
000
[
\
d
]{
3
}
|
002
[
\
d
]{
3
}
|
300
[
\
d
]{
3
}
|
600
[
\
d
]{
3
}
|
60
[
\
d
]{
4
})
$
/
g
。
test
(
value
);
驗證版本號格式必須為X。Y。Z
/**
* @param { string } value
*/
export
const
isVersion
=
value
=>
/^
\
d
+
(
?:
\
。
\
d
+
){
2
}
$
/
g
。
test
(
value
);
驗證影片連結地址(影片格式可按需增刪)
/**
* @param { string } value
*/
export
const
isVideoUrl
=
value
=>
/^
https
?:
\
/
\
/
(。
+
\
/
)
+
。
+
(
\
。(
swf
|
avi
|
flv
|
mpg
|
rm
|
mov
|
wav
|
asf
|
3
gp
|
mkv
|
rmvb
|
mp4
))
$
/
i
。
test
(
value
);
驗證圖片連結地址(圖片格式可按需增刪)
/**
* @param { string } value
*/
export
const
isImageUrl
=
value
=>
/^
https
?:
\
/
\
/
(。
+
\
/
)
+
。
+
(
\
。(
gif
|
png
|
jpg
|
jpeg
|
webp
|
svg
|
psd
|
bmp
|
tif
))
$
/
i
。
test
(
value
);
驗證銀行卡號(10到30位, 覆蓋對公/私賬戶, 參考微信支付)
/**
* @param { string } value
*/
export
const
isAccountNumber
=
value
=>
/^
[
1
-
9
]
\
d
{
9
,
29
}
$
/
g
。
test
(
value
);
驗證中文姓名
/**
* @param { string } value
*/
export
const
isChineseName
=
value
=>
/^
(
?:
[
\u4e00
-
\u9fa5
·
]{
2
,
16
})
$
/
g
。
test
(
value
);
驗證英文姓名
/**
* @param { string } value
*/
export
const
isEnglishName
=
value
=>
/
(
^
[
a
-
zA
-
Z
]{
1
}[
a
-
zA
-
Z
\
s
]{
0
,
20
}[
a
-
zA
-
Z
]{
1
}
$
)
/
g
。
test
(
value
);
### 驗證車牌號(新能源)
/**
* @param { string } value
*/
export
const
isLicensePlateNumberNER
=
value
=>
/
[
京津滬渝冀豫雲遼黑湘皖魯新蘇浙贛鄂桂甘晉蒙陝吉閩貴粵青藏川寧瓊使領
A
-
Z
]{
1
}[
A
-
HJ
-
NP
-
Z
]{
1
}(([
0
-
9
]{
5
}[
DF
])
|
([
DF
][
A
-
HJ
-
NP
-
Z0
-
9
][
0
-
9
]{
4
}))
$
/
g
。
test
(
value
);
驗證車牌號(非新能源)
/**
* @param { string } value
*/
export
const
isLicensePlateNumberNNER
=
value
=>
/^
[
京津滬渝冀豫雲遼黑湘皖魯新蘇浙贛鄂桂甘晉蒙陝吉閩貴粵青藏川寧瓊使領
A
-
Z
]{
1
}[
A
-
HJ
-
NP
-
Z
]{
1
}[
A
-
Z0
-
9
]{
4
}[
A
-
Z0
-
9
掛學警港澳
]{
1
}
$
/
g
。
test
(
value
);
驗證車牌號(新能源+非新能源)
/**
* @param { string } value
*/
export
const
isLicensePlateNumber
=
value
=>
/^
(
?:
[
京津滬渝冀豫雲遼黑湘皖魯新蘇浙贛鄂桂甘晉蒙陝吉閩貴粵青藏川寧瓊使領
A
-
Z
]{
1
}[
A
-
HJ
-
NP
-
Z
]{
1
}(
?:
(
?:
[
0
-
9
]{
5
}[
DF
])
|
(
?:
[
DF
](
?:
[
A
-
HJ
-
NP
-
Z0
-
9
])[
0
-
9
]{
4
})))
|
(
?:
[
京津滬渝冀豫雲遼黑湘皖魯新蘇浙贛鄂桂甘晉蒙陝吉閩貴粵青藏川寧瓊使領
A
-
Z
]{
1
}[
A
-
Z
]{
1
}[
A
-
HJ
-
NP
-
Z0
-
9
]{
4
}[
A
-
HJ
-
NP
-
Z0
-
9
掛學警港澳
]{
1
})
$
/
g
。
test
(
value
);
驗證手機號中國(嚴謹), 根據工信部2019年最新公佈的手機號段
/**
* @param { string } value
*/
export
const
isMPStrict
=
value
=>
/^
(
?:
(
?:
\
+|
00
)
86
)
?
1
(
?:
(
?:
3
[
\
d
])
|
(
?:
4
[
5
-
7
|
9
])
|
(
?:
5
[
0
-
3
|
5
-
9
])
|
(
?:
6
[
5
-
7
])
|
(
?:
7
[
0
-
8
])
|
(
?:
8
[
\
d
])
|
(
?:
9
[
1
|
8
|
9
]))
\
d
{
8
}
$
/
g
。
test
(
value
);
驗證手機號中國(寬鬆), 只要是13,14,15,16,17,18,19開頭即可
/**
* @param { string } value
*/
export
const
isMPRelaxed
=
value
=>
/^
(
?:
(
?:
\
+|
00
)
86
)
?
1
[
3
-
9
]
\
d
{
9
}
$
/
g
。
test
(
value
);
驗證email(郵箱)
/**
* @param { string } value
*/
export
const
isEmail
=
value
=>
/^
[
a
-
zA
-
Z0
-
9。
!
#
$
%&
‘
*+
/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\。[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/g
。
test
(
value
);
驗證座機電話(國內),如: 0341-86091234
/**
* @param { string } value
*/
export
const
isLandlineTelephone
=
value
=>
/
\
d
{
3
}
-
\
d
{
8
}
|
\
d
{
4
}
-
\
d
{
7
}
/
g
。
test
(
value
);
驗證身份證號(1代,15位數字)
/**
* @param { string } value
*/
export
const
isIDCardOld
=
value
=>
/^
\
d
{
8
}(
0
\
d
|
10
|
11
|
12
)([
0
-
2
]
\
d
|
30
|
31
)
\
d
{
3
}
$
/
g
。
test
(
value
);
驗證身份證號(2代,18位數字),最後一位是校驗位,可能為數字或字元X
/**
* @param { string } value
*/
export
const
isIDCardNew
=
value
=>
/^
\
d
{
6
}(
18
|
19
|
20
)
\
d
{
2
}(
0
\
d
|
10
|
11
|
12
)([
0
-
2
]
\
d
|
30
|
31
)
\
d
{
3
}[
\
dXx
]
$
/
g
。
test
(
value
);
驗證身份證號, 支援1/2代(15位/18位數字)
/**
* @param { string } value
*/
export
const
isIDCard
=
value
=>
/
(
^
\
d
{
8
}(
0
\
d
|
10
|
11
|
12
)([
0
-
2
]
\
d
|
30
|
31
)
\
d
{
3
}
$
)
|
(
^
\
d
{
6
}(
18
|
19
|
20
)
\
d
{
2
}(
0
\
d
|
10
|
11
|
12
)([
0
-
2
]
\
d
|
30
|
31
)
\
d
{
3
}(
\
d
|
X
|
x
)
$
)
/
g
。
test
(
value
);
驗證護照(包含香港、澳門)
/**
* @param { string } value
*/
export
const
isPassport
=
value
=>
/
(
^
[
EeKkGgDdSsPpHh
]
\
d
{
8
}
$
)
|
(
^
(([
Ee
][
a
-
fA
-
F
])
|
([
DdSsPp
][
Ee
])
|
([
Kk
][
Jj
])
|
([
Mm
][
Aa
])
|
(
1
[
45
]))
\
d
{
7
}
$
)
/
g
。
test
(
value
);
驗證帳號是否合法(字母開頭,允許5-16位元組,允許字母數字下劃線組合
/**
* @param { string } value
*/
export
const
isWebAccount
=
value
=>
/^
[
a
-
zA
-
Z
]
\
w
{
4
,
15
}
$
/
g
。
test
(
value
);
驗證中文/漢字
/**
* @param { string } value
*/
export
const
isChineseCharacter
=
value
=>
/^
(
?:
[
\u3400
-
\u4DB5\u4E00
-
\u9FEA\uFA0E\uFA0F\uFA11\uFA13\uFA14\uFA1F\uFA21\uFA23\uFA24\uFA27
-
\uFA29
]
|
[
\uD840
-
\uD868\uD86A
-
\uD86C\uD86F
-
\uD872\uD874
-
\uD879
][
\uDC00
-
\uDFFF
]
|
\uD869
[
\uDC00
-
\uDED6\uDF00
-
\uDFFF
]
|
\uD86D
[
\uDC00
-
\uDF34\uDF40
-
\uDFFF
]
|
\uD86E
[
\uDC00
-
\uDC1D\uDC20
-
\uDFFF
]
|
\uD873
[
\uDC00
-
\uDEA1\uDEB0
-
\uDFFF
]
|
\uD87A
[
\uDC00
-
\uDFE0
])
+
$
/
g
。
test
(
value
);
驗證小數
/**
* @param { string } value
*/
export
const
isDecimal
=
value
=>
/^
\
d
+
\
。
\
d
+
$
/
g
。
test
(
value
);
驗證數字
/**
* @param { string } value
*/
export
const
isNumber
=
value
=>
/^
\
d
{
1
,}
$
/
g
。
test
(
value
);
驗證qq號格式
/**
* @param { string } value
*/
export
const
isQQNum
=
value
=>
/^
[
1
-
9
][
0
-
9
]{
4
,
10
}
$
/
g
。
test
(
value
);
驗證數字和字母組成
/**
* @param { string } value
*/
export
const
isNumAndStr
=
value
=>
/^
[
A
-
Za
-
z0
-
9
]
+
$
/
g
。
test
(
value
);
驗證英文字母
/**
* @param { string } value
*/
export
const
isEnglish
=
value
=>
/^
[
a
-
zA
-
Z
]
+
$
/
g
。
test
(
value
);
驗證大寫英文字母
/**
* @param { string } value
*/
export
const
isCapital
=
value
=>
/^
[
A
-
Z
]
+
$
/
g
。
test
(
value
);
驗證小寫英文字母
/**
* @param { string } value
*/
export
const
isLowercase
=
value
=>
/^
[
a
-
z
]
+
$
/
g
。
test
(
value
);
瀏覽器操作相關browser工具函式
返回當前url
export
const
currentURL
=
()
=>
window
。
location
。
href
;
獲取url引數(第一種)
/**
* @param {*} name
* @param {*} origin
*/
export
function
getUrlParam
(
name
,
origin
=
null
)
{
let
reg
=
new
RegExp
(
”(^|&)“
+
name
+
”=([^&]*)(&|$)“
);
let
r
=
null
;
if
(
origin
==
null
)
{
r
=
window
。
location
。
search
。
substr
(
1
)。
match
(
reg
);
}
else
{
r
=
origin
。
substr
(
1
)。
match
(
reg
);
}
if
(
r
!=
null
)
return
decodeURIComponent
(
r
[
2
]);
return
null
;
}
獲取url引數(第二種)
/**
* @param {*} name
* @param {*} origin
*/
export
function
getUrlParams
(
name
,
origin
=
null
)
{
let
url
=
location
。
href
;
let
temp1
=
url
。
split
(
’?‘
);
let
pram
=
temp1
[
1
];
let
keyValue
=
pram
。
split
(
’&‘
);
let
obj
=
{};
for
(
let
i
=
0
;
i
<
keyValue
。
length
;
i
++
)
{
let
item
=
keyValue
[
i
]。
split
(
’=‘
);
let
key
=
item
[
0
];
let
value
=
item
[
1
];
obj
[
key
]
=
value
;
}
return
obj
[
name
];
}
修改url中的引數
/**
* @param { string } paramName
* @param { string } replaceWith
*/
export
function
replaceParamVal
(
paramName
,
replaceWith
)
{
var
oUrl
=
location
。
href
。
toString
();
var
re
=
eval
(
’/(‘
+
paramName
+
’=)([^&]*)/gi‘
);
location
。
href
=
oUrl
。
replace
(
re
,
paramName
+
’=‘
+
replaceWith
);
return
location
。
href
;
}
刪除url中指定的引數
/**
* @param { string } name
*/
export
function
funcUrlDel
(
name
){
var
loca
=
location
;
var
baseUrl
=
loca
。
origin
+
loca
。
pathname
+
”?“
;
var
query
=
loca
。
search
。
substr
(
1
);
if
(
query
。
indexOf
(
name
)
>-
1
)
{
var
obj
=
{};
var
arr
=
query
。
split
(
”&“
);
for
(
var
i
=
0
;
i
<
arr
。
length
;
i
++
)
{
arr
[
i
]
=
arr
[
i
]。
split
(
”=“
);
obj
[
arr
[
i
][
0
]]
=
arr
[
i
][
1
];
}
delete
obj
[
name
];
var
url
=
baseUrl
+
JSON
。
stringify
(
obj
)。
replace
(
/[\”\{\}]/g
,
“”
)。
replace
(
/\:/g
,
“=”
)。
replace
(
/\,/g
,
“&”
);
return
url
}
}
獲取視窗可視範圍的高度
export
function
getClientHeight
()
{
let
clientHeight
=
0
;
if
(
document
。
body
。
clientHeight
&&
document
。
documentElement
。
clientHeight
)
{
clientHeight
=
(
document
。
body
。
clientHeight
<
document
。
documentElement
。
clientHeight
)
?
document
。
body
。
clientHeight
:
document
。
documentElement
。
clientHeight
;
}
else
{
clientHeight
=
(
document
。
body
。
clientHeight
>
document
。
documentElement
。
clientHeight
)
?
document
。
body
。
clientHeight
:
document
。
documentElement
。
clientHeight
;
}
return
clientHeight
;
}
獲取視窗可視範圍寬度
export
function
getPageViewWidth
()
{
let
d
=
document
,
a
=
d
。
compatMode
==
“BackCompat”
?
d
。
body
:
d
。
documentElement
;
return
a
。
clientWidth
;
}
獲取視窗寬度
export
function
getPageWidth
()
{
let
g
=
document
,
a
=
g
。
body
,
f
=
g
。
documentElement
,
d
=
g
。
compatMode
==
“BackCompat”
?
a
:
g
。
documentElement
;
return
Math
。
max
(
f
。
scrollWidth
,
a
。
scrollWidth
,
d
。
clientWidth
);
}
獲取視窗尺寸
export
function
getViewportOffset
()
{
if
(
window
。
innerWidth
)
{
return
{
w
:
window
。
innerWidth
,
h
:
window
。
innerHeight
}
}
else
{
// ie8及其以下
if
(
document
。
compatMode
===
“BackCompat”
)
{
// 怪異模式
return
{
w
:
document
。
body
。
clientWidth
,
h
:
document
。
body
。
clientHeight
}
}
else
{
// 標準模式
return
{
w
:
document
。
documentElement
。
clientWidth
,
h
:
document
。
documentElement
。
clientHeight
}
}
}
}
獲取捲軸距頂部高度
export
function
getPageScrollTop
()
{
let
a
=
document
;
return
a
。
documentElement
。
scrollTop
||
a
。
body
。
scrollTop
;
}
獲取捲軸距左邊的高度
export
function
getPageScrollLeft
()
{
let
a
=
document
;
return
a
。
documentElement
。
scrollLeft
||
a
。
body
。
scrollLeft
;
}
開啟全屏
/**
* @param {*} element
*/
export
function
launchFullscreen
(
element
)
{
if
(
element
。
requestFullscreen
)
{
element
。
requestFullscreen
()
}
else
if
(
element
。
mozRequestFullScreen
)
{
element
。
mozRequestFullScreen
()
}
else
if
(
element
。
msRequestFullscreen
)
{
element
。
msRequestFullscreen
()
}
else
if
(
element
。
webkitRequestFullscreen
)
{
element
。
webkitRequestFullScreen
()
}
}
關閉全屏
export
function
exitFullscreen
()
{
if
(
document
。
exitFullscreen
)
{
document
。
exitFullscreen
()
}
else
if
(
document
。
msExitFullscreen
)
{
document
。
msExitFullscreen
()
}
else
if
(
document
。
mozCancelFullScreen
)
{
document
。
mozCancelFullScreen
()
}
else
if
(
document
。
webkitExitFullscreen
)
{
document
。
webkitExitFullscreen
()
}
}
返回當前捲軸位置
export
const
getScrollPosition
=
(
el
=
window
)
=>
({
x
:
el
。
pageXOffset
!==
undefined
?
el
。
pageXOffset
:
el
。
scrollLeft
,
y
:
el
。
pageYOffset
!==
undefined
?
el
。
pageYOffset
:
el
。
scrollTop
});
滾動到指定元素區域
export
const
smoothScroll
=
element
=>{
document
。
querySelector
(
element
)。
scrollIntoView
({
behavior
:
’smooth‘
});
};
平滑滾動到頁面頂部
export
const
scrollToTop
=
()
=>
{
const
c
=
document
。
documentElement
。
scrollTop
||
document
。
body
。
scrollTop
;
if
(
c
>
0
)
{
window
。
requestAnimationFrame
(
scrollToTop
);
window
。
scrollTo
(
0
,
c
-
c
/
8
);
}
};
http跳轉https
export
const
httpsRedirect
=
()
=>
{
if
(
location
。
protocol
!==
’https:‘
)
location
。
replace
(
’https://‘
+
location
。
href
。
split
(
’//‘
)[
1
]);
};
檢查頁面底部是否可見
export
const
bottomVisible
=
()
=>{
return
document
。
documentElement
。
clientHeight
+
window
。
scrollY
>=
(
document
。
documentElement
。
scrollHeight
||
document
。
documentElement
。
clientHeight
);
};
開啟一個視窗
/**
* @param { string } url
* @param { string } windowName
* @param { number } width
* @param { number } height
*/
export
function
openWindow
(
url
,
windowName
,
width
,
height
)
{
var
x
=
parseInt
(
screen
。
width
/
2。0
)
-
width
/
2。0
;
var
y
=
parseInt
(
screen
。
height
/
2。0
)
-
height
/
2。0
;
var
isMSIE
=
navigator
。
appName
==
“Microsoft Internet Explorer”
;
if
(
isMSIE
)
{
var
p
=
“resizable=1,location=no,scrollbars=no,width=”
;
p
=
p
+
width
;
p
=
p
+
“,height=”
;
p
=
p
+
height
;
p
=
p
+
“,left=”
;
p
=
p
+
x
;
p
=
p
+
“,top=”
;
p
=
p
+
y
;
window
。
open
(
url
,
windowName
,
p
);
}
else
{
var
win
=
window
。
open
(
url
,
“ZyiisPopup”
,
“top=”
+
y
+
“,left=”
+
x
+
“,scrollbars=”
+
scrollbars
+
“,dialog=yes,modal=yes,width=”
+
width
+
“,height=”
+
height
+
“,resizable=no”
);
eval
(
“try { win。resizeTo(width, height); } catch(e) { }”
);
win
。
focus
();
}
}
自適應頁面(rem)
/**
* @param { number } width
*/
export
function
AutoResponse
(
width
=
750
)
{
const
target
=
document
。
documentElement
;
target
。
clientWidth
>=
600
?
(
target
。
style
。
fontSize
=
“80px”
)
:
(
target
。
style
。
fontSize
=
target
。
clientWidth
/
width
*
100
+
“px”
);
}
日期工具date工具函式
可以參考我的另一篇文章《前端的各種日期操作》,或者直接到我的GitHub檢視
瀏覽器儲存相關storage工具函式
主要為瀏覽器儲存方面的工具函式,大部分搬運自大神火狼1
localStorage 存貯
/**
* 目前物件值如果是函式 、RegExp等特殊物件存貯會被忽略
* @param { String } key 屬性
* @param { string } value 值
*/
export
const
localStorageSet
=
(
key
,
value
)
=>
{
if
(
typeof
(
value
)
===
’object‘
)
value
=
JSON
。
stringify
(
value
);
localStorage
。
setItem
(
key
,
value
)
};
localStorage 獲取
/**
* @param {String} key 屬性
*/
export
const
localStorageGet
=
(
key
)
=>
{
return
localStorage
。
getItem
(
key
)
};
localStorage 移除
/**
* @param {String} key 屬性
*/
export
const
localStorageRemove
=
(
key
)
=>
{
localStorage
。
removeItem
(
key
)
};
localStorage 存貯某一段時間失效
/**
* @param {String} key 屬性
* @param {*} value 存貯值
* @param { number } expire 過期時間,毫秒數
*/
export
const
localStorageSetExpire
=
(
key
,
value
,
expire
)
=>
{
if
(
typeof
(
value
)
===
’object‘
)
value
=
JSON
。
stringify
(
value
);
localStorage
。
setItem
(
key
,
value
);
setTimeout
(()
=>
{
localStorage
。
removeItem
(
key
)
},
expire
)
};
sessionStorage 存貯
/**
* @param {String} key 屬性
* @param {*} value 值
*/
export
const
sessionStorageSet
=
(
key
,
value
)
=>
{
if
(
typeof
(
value
)
===
’object‘
)
value
=
JSON
。
stringify
(
value
);
sessionStorage
。
setItem
(
key
,
value
)
};
sessionStorage 獲取
/**
* @param {String} key 屬性
*/
export
const
sessionStorageGet
=
(
key
)
=>
{
return
sessionStorage
。
getItem
(
key
)
};
sessionStorage 刪除
/**
* @param {String} key 屬性
*/
export
const
sessionStorageRemove
=
(
key
)
=>
{
sessionStorage
。
removeItem
(
key
)
};
sessionStorage 存貯某一段時間失效
/**
* @param {String} key 屬性
* @param {*} value 存貯值
* @param {String} expire 過期時間,毫秒數
*/
export
const
sessionStorageSetExpire
=
(
key
,
value
,
expire
)
=>
{
if
(
typeof
(
value
)
===
’object‘
)
value
=
JSON
。
stringify
(
value
);
sessionStorage
。
setItem
(
key
,
value
);
setTimeout
(()
=>
{
sessionStorage
。
removeItem
(
key
)
},
expire
)
};
cookie 存貯
/**
* @param {String} key 屬性
* @param {*} value 值
* @param { String } expire 過期時間,單位天
*/
export
const
cookieSet
=
(
key
,
value
,
expire
)
=>
{
const
d
=
new
Date
();
d
。
setDate
(
d
。
getDate
()
+
expire
);
document
。
cookie
=
`
${
key
}
=
${
value
}
;expires=
${
d
。
toUTCString
()
}
`
};
cookie 獲取
/**
* @param {String} key 屬性
*/
export
const
cookieGet
=
(
key
)
=>
{
const
cookieStr
=
unescape
(
document
。
cookie
);
const
arr
=
cookieStr
。
split
(
’; ‘
);
let
cookieValue
=
’‘
;
for
(
let
i
=
0
;
i
<
arr
。
length
;
i
++
)
{
const
temp
=
arr
[
i
]。
split
(
’=‘
);
if
(
temp
[
0
]
===
key
)
{
cookieValue
=
temp
[
1
];
break
}
}
return
cookieValue
};
cookie 刪除
/**
* @param {String} key 屬性
*/
export
const
cookieRemove
=
(
key
)
=>
{
document
。
cookie
=
`
${
encodeURIComponent
(
key
)
}
=;expires=
${
new
Date
()
}
`
};
更多的工具函式
這裡包含了平時可能常用的工具函式,包含數字,字串,陣列和物件等等操作。
金錢格式化,三位加逗號
/**
* @param { number } num
*/
export
const
formatMoney
=
num
=>
num
。
toString
()。
replace
(
/\B(?=(\d{3})+(?!\d))/g
,
“,”
);
擷取字串並加身略號
export
function
subText
(
str
,
length
)
{
if
(
str
。
length
===
0
)
{
return
’‘
;
}
if
(
str
。
length
>
length
)
{
return
str
。
substr
(
0
,
length
)
+
“。。。”
;
}
else
{
return
str
;
}
}
獲取檔案base64編碼
/**
* @param file
* @param format 指定檔案格式
* @param size 指定檔案大小(位元組)
* @param formatMsg 格式錯誤提示
* @param sizeMsg 大小超出限制提示
* @returns {Promise
*/
export
function
fileToBase64String
(
file
,
format
=
[
’jpg‘
,
’jpeg‘
,
’png‘
,
’gif‘
],
size
=
20
*
1024
*
1024
,
formatMsg
=
’檔案格式不正確‘
,
sizeMsg
=
’檔案大小超出限制‘
)
{
return
new
Promise
((
resolve
,
reject
)
=>
{
// 格式過濾
let
suffix
=
file
。
type
。
split
(
’/‘
)[
1
]。
toLowerCase
();
let
inFormat
=
false
;
for
(
let
i
=
0
;
i
<
format
。
length
;
i
++
)
{
if
(
suffix
===
format
[
i
])
{
inFormat
=
true
;
break
;
}
}
if
(
!
inFormat
)
{
reject
(
formatMsg
);
}
// 大小過濾
if
(
file
。
size
>
size
)
{
reject
(
sizeMsg
);
}
// 轉base64字串
let
fileReader
=
new
FileReader
();
fileReader
。
readAsDataURL
(
file
);
fileReader
。
onload
=
()
=>
{
let
res
=
fileReader
。
result
;
resolve
({
base64String
:
res
,
suffix
:
suffix
});
reject
(
’異常檔案,請重新選擇‘
);
}
})
}
B轉換到KB,MB,GB並保留兩位小數
/**
* @param { number } fileSize
*/
export
function
formatFileSize
(
fileSize
)
{
let
temp
;
if
(
fileSize
<
1024
)
{
return
fileSize
+
’B‘
;
}
else
if
(
fileSize
<
(
1024
*
1024
))
{
temp
=
fileSize
/
1024
;
temp
=
temp
。
toFixed
(
2
);
return
temp
+
’KB‘
;
}
else
if
(
fileSize
<
(
1024
*
1024
*
1024
))
{
temp
=
fileSize
/
(
1024
*
1024
);
temp
=
temp
。
toFixed
(
2
);
return
temp
+
’MB‘
;
}
else
{
temp
=
fileSize
/
(
1024
*
1024
*
1024
);
temp
=
temp
。
toFixed
(
2
);
return
temp
+
’GB‘
;
}
}
base64轉file
/**
* @param { base64 } base64
* @param { string } filename 轉換後的檔名
*/
export
const
base64ToFile
=
(
base64
,
filename
)=>
{
let
arr
=
base64
。
split
(
’,‘
);
let
mime
=
arr
[
0
]。
match
(
/:(。*?);/
)[
1
];
let
suffix
=
mime
。
split
(
’/‘
)[
1
]
;
// 圖片字尾
let
bstr
=
atob
(
arr
[
1
]);
let
n
=
bstr
。
length
;
let
u8arr
=
new
Uint8Array
(
n
);
while
(
n
——
)
{
u8arr
[
n
]
=
bstr
。
charCodeAt
(
n
)
}
return
new
File
([
u8arr
],
`
${
filename
}
。
${
suffix
}
`
,
{
type
:
mime
})
};
base64轉blob
/**
* @param { base64 } base64
*/
export
const
base64ToBlob
=
base64
=>
{
let
arr
=
base64
。
split
(
’,‘
),
mime
=
arr
[
0
]。
match
(
/:(。*?);/
)[
1
],
bstr
=
atob
(
arr
[
1
]),
n
=
bstr
。
length
,
u8arr
=
new
Uint8Array
(
n
);
while
(
n
——
)
{
u8arr
[
n
]
=
bstr
。
charCodeAt
(
n
);
}
return
new
Blob
([
u8arr
],
{
type
:
mime
});
};
blob轉file
/**
* @param { blob } blob
* @param { string } fileName
*/
export
const
blobToFile
=
(
blob
,
fileName
)
=>
{
blob
。
lastModifiedDate
=
new
Date
();
blob
。
name
=
fileName
;
return
blob
;
};
file轉base64
/**
* @param { * } file 圖片檔案
*/
export
const
fileToBase64
=
file
=>
{
let
reader
=
new
FileReader
();
reader
。
readAsDataURL
(
file
);
reader
。
onload
=
function
(
e
)
{
return
e
。
target
。
result
};
};
遞迴生成樹形結構
export
function
getTreeData
(
data
,
pid
,
pidName
=
’parentId‘
,
idName
=
’id‘
,
childrenName
=
’children‘
,
key
)
{
let
arr
=
[];
for
(
let
i
=
0
;
i
<
data
。
length
;
i
++
)
{
if
(
data
[
i
][
pidName
]
==
pid
)
{
data
[
i
]。
key
=
data
[
i
][
idName
];
data
[
i
][
childrenName
]
=
getTreeData
(
data
,
data
[
i
][
idName
],
pidName
,
idName
,
childrenName
);
arr
。
push
(
data
[
i
]);
}
}
return
arr
;
}
遍歷樹節點
export
function
foreachTree
(
data
,
childrenName
=
’children‘
,
callback
)
{
for
(
let
i
=
0
;
i
<
data
。
length
;
i
++
)
{
callback
(
data
[
i
]);
if
(
data
[
i
][
childrenName
]
&&
data
[
i
][
childrenName
]。
length
>
0
)
{
foreachTree
(
data
[
i
][
childrenName
],
childrenName
,
callback
);
}
}
}
追溯父節點
export
function
traceParentNode
(
pid
,
data
,
rootPid
,
pidName
=
’parentId‘
,
idName
=
’id‘
,
childrenName
=
’children‘
)
{
let
arr
=
[];
foreachTree
(
data
,
childrenName
,
(
node
)
=>
{
if
(
node
[
idName
]
==
pid
)
{
arr
。
push
(
node
);
if
(
node
[
pidName
]
!=
rootPid
)
{
arr
=
arr
。
concat
(
traceParentNode
(
node
[
pidName
],
data
,
rootPid
,
pidName
,
idName
));
}
}
});
return
arr
;
}
尋找所有子節點
export
function
traceChildNode
(
id
,
data
,
pidName
=
’parentId‘
,
idName
=
’id‘
,
childrenName
=
’children‘
)
{
let
arr
=
[];
foreachTree
(
data
,
childrenName
,
(
node
)
=>
{
if
(
node
[
pidName
]
==
id
)
{
arr
。
push
(
node
);
arr
=
arr
。
concat
(
traceChildNode
(
node
[
idName
],
data
,
pidName
,
idName
,
childrenName
));
}
});
return
arr
;
}
根據pid生成樹形結構
/**
* @param { object } items 後臺獲取的資料
* @param { * } id 資料中的id
* @param { * } link 生成樹形結構的依據
*/
export
const
createTree
=
(
items
,
id
=
null
,
link
=
’pid‘
)
=>{
items
。
filter
(
item
=>
item
[
link
]
===
id
)。
map
(
item
=>
({
。。。
item
,
children
:
createTree
(
items
,
item
。
id
)
}));
};
查詢陣列中是否存在某個元素並返回元素第一次出現的下標
/**
* @param {*} item
* @param { array } data
*/
export
function
inArray
(
item
,
data
)
{
for
(
let
i
=
0
;
i
<
data
。
length
;
i
++
)
{
if
(
item
===
data
[
i
])
{
return
i
;
}
}
return
-
1
;
}
Windows根據詳細版本號判斷當前系統名稱
/**
* @param { string } osVersion
*/
export
function
OutOsName
(
osVersion
)
{
if
(
!
osVersion
){
return
}
let
str
=
osVersion
。
substr
(
0
,
3
);
if
(
str
===
“5。0”
)
{
return
“Win 2000”
}
else
if
(
str
===
“5。1”
)
{
return
“Win XP”
}
else
if
(
str
===
“5。2”
)
{
return
“Win XP64”
}
else
if
(
str
===
“6。0”
)
{
return
“Win Vista”
}
else
if
(
str
===
“6。1”
)
{
return
“Win 7”
}
else
if
(
str
===
“6。2”
)
{
return
“Win 8”
}
else
if
(
str
===
“6。3”
)
{
return
“Win 8。1”
}
else
if
(
str
===
“10。”
)
{
return
“Win 10”
}
else
{
return
“Win”
}
}
判斷手機是Andoird還是IOS
/**
* 0: ios
* 1: android
* 2: 其它
*/
export
function
getOSType
()
{
let
u
=
navigator
。
userAgent
,
app
=
navigator
。
appVersion
;
let
isAndroid
=
u
。
indexOf
(
’Android‘
)
>
-
1
||
u
。
indexOf
(
’Linux‘
)
>
-
1
;
let
isIOS
=
!!
u
。
match
(
/\(i[^;]+;( U;)? CPU。+Mac OS X/
);
if
(
isIOS
)
{
return
0
;
}
if
(
isAndroid
)
{
return
1
;
}
return
2
;
}
函式防抖
/**
* @param { function } func
* @param { number } wait 延遲執行毫秒數
* @param { boolean } immediate true 表立即執行,false 表非立即執行
*/
export
function
debounce
(
func
,
wait
,
immediate
)
{
let
timeout
;
return
function
()
{
let
context
=
this
;
let
args
=
arguments
;
if
(
timeout
)
clearTimeout
(
timeout
);
if
(
immediate
)
{
let
callNow
=
!
timeout
;
timeout
=
setTimeout
(()
=>
{
timeout
=
null
;
},
wait
);
if
(
callNow
)
func
。
apply
(
context
,
args
)
}
else
{
timeout
=
setTimeout
(()
=>
{
func
。
apply
(
context
,
args
)
},
wait
);
}
}
}
函式節流
/**
* @param { function } func 函式
* @param { number } wait 延遲執行毫秒數
* @param { number } type 1 表時間戳版,2 表定時器版
*/
export
function
throttle
(
func
,
wait
,
type
)
{
let
previous
,
timeout
;
if
(
type
===
1
){
previous
=
0
;
}
else
if
(
type
===
2
){
timeout
=
null
;
}
return
function
()
{
let
context
=
this
;
let
args
=
arguments
;
if
(
type
===
1
){
let
now
=
Date
。
now
();
if
(
now
-
previous
>
wait
)
{
func
。
apply
(
context
,
args
);
previous
=
now
;
}
}
else
if
(
type
===
2
){
if
(
!
timeout
)
{
timeout
=
setTimeout
(()
=>
{
timeout
=
null
;
func
。
apply
(
context
,
args
)
},
wait
)
}
}
}
}
判斷資料型別
/**
* @param {*} target
*/
export
function
type
(
target
)
{
let
ret
=
typeof
(
target
);
let
template
=
{
“[object Array]”
:
“array”
,
“[object Object]”
:
“object”
,
“[object Number]”
:
“number - object”
,
“[object Boolean]”
:
“boolean - object”
,
“[object String]”
:
’string-object‘
};
if
(
target
===
null
)
{
return
’null‘
;
}
else
if
(
ret
==
“object”
){
let
str
=
Object
。
prototype
。
toString
。
call
(
target
);
return
template
[
str
];
}
else
{
return
ret
;
}
}
生成指定範圍隨機數
/**
* @param { number } min
* @param { number } max
*/
export
const
RandomNum
=
(
min
,
max
)
=>
Math
。
floor
(
Math
。
random
()
*
(
max
-
min
+
1
))
+
min
;
陣列亂序
/**
* @param {array} arr
*/
export
function
arrScrambling
(
arr
)
{
let
array
=
arr
;
let
index
=
array
。
length
;
while
(
index
)
{
index
-=
1
;
let
randomIndex
=
Math
。
floor
(
Math
。
random
()
*
index
);
let
middleware
=
array
[
index
];
array
[
index
]
=
array
[
randomIndex
];
array
[
randomIndex
]
=
middleware
}
return
array
}
陣列交集
/**
* @param { array} arr1
* @param { array } arr2
*/
export
const
similarity
=
(
arr1
,
arr2
)
=>
arr1
。
filter
(
v
=>
arr2
。
includes
(
v
));
陣列中某元素出現的次數
/**
* @param { array } arr
* @param {*} value
*/
export
function
countOccurrences
(
arr
,
value
)
{
return
arr
。
reduce
((
a
,
v
)
=>
v
===
value
?
a
+
1
:
a
+
0
,
0
);
}
加法函式(精度丟失問題)
/**
* @param { number } arg1
* @param { number } arg2
*/
export
function
add
(
arg1
,
arg2
)
{
let
r1
,
r2
,
m
;
try
{
r1
=
arg1
。
toString
()。
split
(
“。”
)[
1
]。
length
}
catch
(
e
)
{
r1
=
0
}
try
{
r2
=
arg2
。
toString
()。
split
(
“。”
)[
1
]。
length
}
catch
(
e
)
{
r2
=
0
}
m
=
Math
。
pow
(
10
,
Math
。
max
(
r1
,
r2
));
return
(
arg1
*
m
+
arg2
*
m
)
/
m
}
減法函式(精度丟失問題)
/**
* @param { number } arg1
* @param { number } arg2
*/
export
function
sub
(
arg1
,
arg2
)
{
let
r1
,
r2
,
m
,
n
;
try
{
r1
=
arg1
。
toString
()。
split
(
“。”
)[
1
]。
length
}
catch
(
e
)
{
r1
=
0
}
try
{
r2
=
arg2
。
toString
()。
split
(
“。”
)[
1
]。
length
}
catch
(
e
)
{
r2
=
0
}
m
=
Math
。
pow
(
10
,
Math
。
max
(
r1
,
r2
));
n
=
(
r1
>=
r2
)
?
r1
:
r2
;
return
Number
(((
arg1
*
m
-
arg2
*
m
)
/
m
)。
toFixed
(
n
));
}
除法函式(精度丟失問題)
/**
* @param { number } num1
* @param { number } num2
*/
export
function
division
(
num1
,
num2
){
let
t1
,
t2
,
r1
,
r2
;
try
{
t1
=
num1
。
toString
()。
split
(
’。‘
)[
1
]。
length
;
}
catch
(
e
){
t1
=
0
;
}
try
{
t2
=
num2
。
toString
()。
split
(
“。”
)[
1
]。
length
;
}
catch
(
e
){
t2
=
0
;
}
r1
=
Number
(
num1
。
toString
()。
replace
(
“。”
,
“”
));
r2
=
Number
(
num2
。
toString
()。
replace
(
“。”
,
“”
));
return
(
r1
/
r2
)
*
Math
。
pow
(
10
,
t2
-
t1
);
}
乘法函式(精度丟失問題)
/**
* @param { number } num1
* @param { number } num2
*/
export
function
mcl
(
num1
,
num2
){
let
m
=
0
,
s1
=
num1
。
toString
(),
s2
=
num2
。
toString
();
try
{
m
+=
s1
。
split
(
“。”
)[
1
]。
length
}
catch
(
e
){}
try
{
m
+=
s2
。
split
(
“。”
)[
1
]。
length
}
catch
(
e
){}
return
Number
(
s1
。
replace
(
“。”
,
“”
))
*
Number
(
s2
。
replace
(
“。”
,
“”
))
/
Math
。
pow
(
10
,
m
);
}
遞迴最佳化(尾遞迴)
/**
* @param { function } f
*/
export
function
tco
(
f
)
{
let
value
;
let
active
=
false
;
let
accumulated
=
[];
return
function
accumulator
()
{
accumulated
。
push
(
arguments
);
if
(
!
active
)
{
active
=
true
;
while
(
accumulated
。
length
)
{
value
=
f
。
apply
(
this
,
accumulated
。
shift
());
}
active
=
false
;
return
value
;
}
};
}
生成隨機整數
export
function
randomNumInteger
(
min
,
max
)
{
switch
(
arguments
。
length
)
{
case
1
:
return
parseInt
(
Math
。
random
()
*
min
+
1
,
10
);
case
2
:
return
parseInt
(
Math
。
random
()
*
(
max
-
min
+
1
)
+
min
,
10
);
default
:
return
0
}
}
去除空格
/**
* @param { string } str 待處理字串
* @param { number } type 去除空格型別 1-所有空格 2-前後空格 3-前空格 4-後空格 預設為1
*/
export
function
trim
(
str
,
type
=
1
)
{
if
(
type
&&
type
!==
1
&&
type
!==
2
&&
type
!==
3
&&
type
!==
4
)
return
;
switch
(
type
)
{
case
1
:
return
str
。
replace
(
/\s/g
,
“”
);
case
2
:
return
str
。
replace
(
/(^\s)|(\s*$)/g
,
“”
);
case
3
:
return
str
。
replace
(
/(^\s)/g
,
“”
);
case
4
:
return
str
。
replace
(
/(\s$)/g
,
“”
);
default
:
return
str
;
}
}
大小寫轉換
/**
* @param { string } str 待轉換的字串
* @param { number } type 1-全大寫 2-全小寫 3-首字母大寫 其他-不轉換
*/
export
function
turnCase
(
str
,
type
)
{
switch
(
type
)
{
case
1
:
return
str
。
toUpperCase
();
case
2
:
return
str
。
toLowerCase
();
case
3
:
return
str
[
0
]。
toUpperCase
()
+
str
。
substr
(
1
)。
toLowerCase
();
default
:
return
str
;
}
}
隨機16進位制顏色 hexColor
/**
* 方法一
*/
export
function
hexColor
()
{
let
str
=
’#‘
;
let
arr
=
[
0
,
1
,
2
,
3
,
4
,
5
,
6
,
7
,
8
,
9
,
’A‘
,
’B‘
,
’C‘
,
’D‘
,
’E‘
,
’F‘
];
for
(
let
i
=
0
;
i
<
6
;
i
++
)
{
let
index
=
Number
。
parseInt
((
Math
。
random
()
*
16
)。
toString
());
str
+=
arr
[
index
]
}
return
str
;
}
隨機16進位制顏色 randomHexColorCode
/**
* 方法二
*/
export
const
randomHexColorCode
=
()
=>
{
let
n
=
(
Math
。
random
()
*
0xfffff
*
1000000
)。
toString
(
16
);
return
’#‘
+
n
。
slice
(
0
,
6
);
};
轉義html(防XSS攻擊)
export
const
escapeHTML
=
str
=>{
str
。
replace
(
/[&<>’“]/g
,
tag
=>
({
‘&’
:
‘&;’
,
‘<’
:
‘<;’
,
‘>’
:
‘>;’
,
”‘“
:
’';‘
,
’”‘
:
’";‘
}[
tag
]
||
tag
)
);
};
檢測移動/PC裝置
export
const
detectDeviceType
=
()
=>
{
return
/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i
。
test
(
navigator
。
userAgent
)
?
’Mobile‘
:
’Desktop‘
;
};
隱藏所有指定標籤
/**
* 例: hide(document。querySelectorAll(’img‘))
*/
export
const
hideTag
=
(。。。
el
)
=>
[。。。
el
]。
forEach
(
e
=>
(
e
。
style
。
display
=
’none‘
));
返回指定元素的生效樣式
/**
* @param { element} el 元素節點
* @param { string } ruleName 指定元素的名稱
*/
export
const
getStyle
=
(
el
,
ruleName
)
=>
getComputedStyle
(
el
)[
ruleName
];
檢查是否包含子元素
/**
* @param { element } parent
* @param { element } child
* 例:elementContains(document。querySelector(’head‘), document。querySelector(’title‘)); // true
*/
export
const
elementContains
=
(
parent
,
child
)
=>
parent
!==
child
&&
parent
。
contains
(
child
);
數字超過規定大小加上加號“+”,如數字超過99顯示99+
/**
* @param { number } val 輸入的數字
* @param { number } maxNum 數字規定界限
*/
export
const
outOfNum
=
(
val
,
maxNum
)
=>{
val
=
val
?
val
-
0
:
0
;
if
(
val
>
maxNum
)
{
return
`
${
maxNum
}
+`
}
else
{
return
val
;
}
};
未完待續。。。
參考
https://github。com/any86/any-。。。
https://juejin。im/post/5cc7af。。。
https://juejin。im/post/5da1a0。。。
https://juejin。im/post/5deb2c。。。
https://juejin。im/post/5de5be。。。
最後
上面的工具函式,一部分來自於自己平時的總結,一部分來自於上面的參考文章,,感謝大神們的總結。如果對你有幫助,為了方便查閱,不妨在GitHub上點個star~
這個倉庫會持續更新,如果你有更好的點子,或者沒有找到你想要的工具函式,歡迎issues~
文中若有不準確或錯誤的地方,歡迎指出,更歡迎issues~
原作者姓名:
xmanlin
原出處:segmentfault
原文連結:書到用時方恨少,一大波JS開發工具函式來了 - 前端車站的技術分享 - SegmentFault 思否