cainiaoblog 23.2.348 → 23.2.349

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.
Files changed (403) hide show
  1. package/{app/manual.html → manual.html} +1 -1
  2. package/package.json +1 -1
  3. package/CNAME +0 -1
  4. package/MP_verify_o6dHCK5mIkxNpzvZ.txt +0 -1
  5. package/README.md +0 -8
  6. package/about/index.html +0 -55
  7. package/ads.txt +0 -1
  8. package/archives/2018/index.html +0 -48
  9. package/archives/2019/index.html +0 -48
  10. package/archives/2019/page/2/index.html +0 -48
  11. package/archives/2020/index.html +0 -48
  12. package/archives/2021/index.html +0 -48
  13. package/archives/2022/index.html +0 -48
  14. package/archives/2023/index.html +0 -48
  15. package/archives/index.html +0 -48
  16. package/archives/page/2/index.html +0 -48
  17. package/archives/page/3/index.html +0 -48
  18. package/article/10047.html +0 -148
  19. package/article/10164.html +0 -65
  20. package/article/10624.html +0 -436
  21. package/article/10745.html +0 -586
  22. package/article/11674.html +0 -71
  23. package/article/11939.html +0 -72
  24. package/article/12238.html +0 -86
  25. package/article/1230.html +0 -533
  26. package/article/13265.html +0 -69
  27. package/article/13823.html +0 -78
  28. package/article/14125.html +0 -72
  29. package/article/14192.html +0 -561
  30. package/article/14375.html +0 -85
  31. package/article/14744.html +0 -83
  32. package/article/14936.html +0 -451
  33. package/article/1518.html +0 -250
  34. package/article/15428.html +0 -71
  35. package/article/15518.html +0 -288
  36. package/article/15569.html +0 -418
  37. package/article/1566.html +0 -122
  38. package/article/16017.html +0 -156
  39. package/article/16947.html +0 -440
  40. package/article/17096.html +0 -82
  41. package/article/17246.html +0 -89
  42. package/article/17575.html +0 -350
  43. package/article/179.html +0 -757
  44. package/article/18039.html +0 -233
  45. package/article/18071.html +0 -375
  46. package/article/18142.html +0 -71
  47. package/article/19909.html +0 -160
  48. package/article/20014.html +0 -89
  49. package/article/20021.html +0 -389
  50. package/article/20037.html +0 -280
  51. package/article/20056.html +0 -95
  52. package/article/20093.html +0 -404
  53. package/article/2021.html +0 -607
  54. package/article/20459.html +0 -115
  55. package/article/20613.html +0 -263
  56. package/article/20635.html +0 -71
  57. package/article/21317.html +0 -71
  58. package/article/21320.html +0 -90
  59. package/article/21782.html +0 -548
  60. package/article/22230.html +0 -435
  61. package/article/22237.html +0 -347
  62. package/article/22398.html +0 -109
  63. package/article/22422.html +0 -270
  64. package/article/22565.html +0 -300
  65. package/article/23046.html +0 -250
  66. package/article/23083.html +0 -215
  67. package/article/23195.html +0 -297
  68. package/article/23301.html +0 -835
  69. package/article/23589.html +0 -285
  70. package/article/23655.html +0 -338
  71. package/article/23864.html +0 -76
  72. package/article/23914.html +0 -96
  73. package/article/24169.html +0 -135
  74. package/article/24581.html +0 -349
  75. package/article/2475.html +0 -500
  76. package/article/24826.html +0 -77
  77. package/article/24924.html +0 -247
  78. package/article/25164.html +0 -1495
  79. package/article/25318.html +0 -394
  80. package/article/25710.html +0 -1129
  81. package/article/25734.html +0 -83
  82. package/article/26083.html +0 -174
  83. package/article/26147.html +0 -283
  84. package/article/26291.html +0 -110
  85. package/article/26354.html +0 -71
  86. package/article/26624.html +0 -145
  87. package/article/26639.html +0 -298
  88. package/article/26850.html +0 -138
  89. package/article/26940.html +0 -258
  90. package/article/27796.html +0 -190
  91. package/article/27800.html +0 -161
  92. package/article/28963.html +0 -159
  93. package/article/28976.html +0 -247
  94. package/article/29042.html +0 -72
  95. package/article/29596.html +0 -81
  96. package/article/29619.html +0 -183
  97. package/article/29623.html +0 -329
  98. package/article/29829.html +0 -205
  99. package/article/29abbd1c.html +0 -112
  100. package/article/30215.html +0 -178
  101. package/article/30552.html +0 -78
  102. package/article/30818.html +0 -201
  103. package/article/31330.html +0 -364
  104. package/article/3154.html +0 -577
  105. package/article/31695.html +0 -348
  106. package/article/31826.html +0 -71
  107. package/article/31843.html +0 -132
  108. package/article/32280.html +0 -212
  109. package/article/32431.html +0 -74
  110. package/article/32443.html +0 -72
  111. package/article/32732.html +0 -122
  112. package/article/3286.html +0 -251
  113. package/article/32960.html +0 -198
  114. package/article/33713.html +0 -72
  115. package/article/33899.html +0 -615
  116. package/article/34351.html +0 -74
  117. package/article/34372.html +0 -89
  118. package/article/34410.html +0 -74
  119. package/article/34431.html +0 -118
  120. package/article/3447.html +0 -75
  121. package/article/34474.html +0 -142
  122. package/article/34871.html +0 -147
  123. package/article/35397.html +0 -175
  124. package/article/3544.html +0 -199
  125. package/article/35503.html +0 -115
  126. package/article/35624.html +0 -84
  127. package/article/35697.html +0 -384
  128. package/article/35863.html +0 -73
  129. package/article/36037.html +0 -253
  130. package/article/36118.html +0 -71
  131. package/article/3621.html +0 -119
  132. package/article/36251.html +0 -296
  133. package/article/36642.html +0 -352
  134. package/article/37102.html +0 -763
  135. package/article/37336.html +0 -351
  136. package/article/37351.html +0 -89
  137. package/article/3760.html +0 -294
  138. package/article/37749.html +0 -75
  139. package/article/37789.html +0 -83
  140. package/article/38005.html +0 -765
  141. package/article/38009.html +0 -284
  142. package/article/38269.html +0 -194
  143. package/article/38344.html +0 -88
  144. package/article/38359.html +0 -334
  145. package/article/38423.html +0 -379
  146. package/article/38530.html +0 -213
  147. package/article/38743.html +0 -268
  148. package/article/38753.html +0 -204
  149. package/article/38881.html +0 -71
  150. package/article/39087.html +0 -414
  151. package/article/39309.html +0 -84
  152. package/article/39486.html +0 -73
  153. package/article/39637.html +0 -306
  154. package/article/39839.html +0 -72
  155. package/article/39937.html +0 -152
  156. package/article/39970.html +0 -71
  157. package/article/402.html +0 -559
  158. package/article/40698.html +0 -71
  159. package/article/40811.html +0 -71
  160. package/article/40964.html +0 -462
  161. package/article/41011.html +0 -322
  162. package/article/41152.html +0 -78
  163. package/article/41696.html +0 -71
  164. package/article/41717.html +0 -281
  165. package/article/41777.html +0 -149
  166. package/article/419.html +0 -985
  167. package/article/4233.html +0 -136
  168. package/article/4292.html +0 -86
  169. package/article/43302.html +0 -96
  170. package/article/43397.html +0 -106
  171. package/article/43724.html +0 -281
  172. package/article/43999.html +0 -224
  173. package/article/44426.html +0 -77
  174. package/article/44964.html +0 -137
  175. package/article/45004.html +0 -123
  176. package/article/4510.html +0 -83
  177. package/article/45156.html +0 -320
  178. package/article/45157.html +0 -52
  179. package/article/45267.html +0 -87
  180. package/article/45641.html +0 -207
  181. package/article/45960.html +0 -75
  182. package/article/46100.html +0 -1262
  183. package/article/46366.html +0 -74
  184. package/article/46771.html +0 -96
  185. package/article/46911.html +0 -517
  186. package/article/46948.html +0 -137
  187. package/article/46ee4850.html +0 -349
  188. package/article/47019.html +0 -84
  189. package/article/47532.html +0 -94
  190. package/article/4783.html +0 -429
  191. package/article/47972.html +0 -72
  192. package/article/48216.html +0 -127
  193. package/article/48252.html +0 -185
  194. package/article/48520.html +0 -74
  195. package/article/48722.html +0 -75
  196. package/article/48807.html +0 -99
  197. package/article/49126.html +0 -323
  198. package/article/50001.html +0 -88
  199. package/article/50058.html +0 -151
  200. package/article/50343.html +0 -410
  201. package/article/50510.html +0 -82
  202. package/article/51082.html +0 -98
  203. package/article/51677.html +0 -111
  204. package/article/5204.html +0 -1085
  205. package/article/52500.html +0 -538
  206. package/article/52689.html +0 -259
  207. package/article/52877.html +0 -569
  208. package/article/53125.html +0 -191
  209. package/article/53428.html +0 -251
  210. package/article/53524.html +0 -74
  211. package/article/53698.html +0 -322
  212. package/article/53803e6.html +0 -93
  213. package/article/53924.html +0 -291
  214. package/article/53962.html +0 -253
  215. package/article/54006.html +0 -71
  216. package/article/54018.html +0 -88
  217. package/article/54161.html +0 -83
  218. package/article/54178.html +0 -69
  219. package/article/54258.html +0 -327
  220. package/article/54295.html +0 -214
  221. package/article/54313.html +0 -1976
  222. package/article/54351.html +0 -90
  223. package/article/54604.html +0 -80
  224. package/article/54632.html +0 -71
  225. package/article/54912.html +0 -756
  226. package/article/54918.html +0 -136
  227. package/article/55119.html +0 -136
  228. package/article/55756.html +0 -118
  229. package/article/55769.html +0 -136
  230. package/article/55870.html +0 -161
  231. package/article/56139.html +0 -92
  232. package/article/56557.html +0 -69
  233. package/article/56604.html +0 -69
  234. package/article/56816.html +0 -266
  235. package/article/56926.html +0 -153
  236. package/article/57747.html +0 -409
  237. package/article/57965.html +0 -475
  238. package/article/58816.html +0 -78
  239. package/article/59059.html +0 -435
  240. package/article/59095.html +0 -350
  241. package/article/59349.html +0 -244
  242. package/article/59402.html +0 -216
  243. package/article/59448.html +0 -55
  244. package/article/59870.html +0 -94
  245. package/article/59877.html +0 -208
  246. package/article/5dbb6f41.html +0 -86
  247. package/article/6008.html +0 -75
  248. package/article/60327.html +0 -126
  249. package/article/6035.html +0 -76
  250. package/article/60428.html +0 -71
  251. package/article/60544.html +0 -128
  252. package/article/61319.html +0 -95
  253. package/article/61367.html +0 -93
  254. package/article/624d1918.html +0 -292
  255. package/article/62543.html +0 -71
  256. package/article/62887.html +0 -169
  257. package/article/63074.html +0 -120
  258. package/article/63266.html +0 -311
  259. package/article/63351.html +0 -74
  260. package/article/63542.html +0 -104
  261. package/article/63824.html +0 -275
  262. package/article/64051.html +0 -653
  263. package/article/64189b69.html +0 -72
  264. package/article/64354.html +0 -75
  265. package/article/64869.html +0 -79
  266. package/article/64923.html +0 -596
  267. package/article/65128.html +0 -95
  268. package/article/65295.html +0 -79
  269. package/article/6888.html +0 -75
  270. package/article/7065.html +0 -84
  271. package/article/7455.html +0 -85
  272. package/article/7a3ef8f.html +0 -315
  273. package/article/8140.html +0 -188
  274. package/article/8190.html +0 -85
  275. package/article/8225.html +0 -78
  276. package/article/84c9ccd6.html +0 -159
  277. package/article/8f9a9ae3.html +0 -82
  278. package/article/9174.html +0 -73
  279. package/article/9738.html +0 -294
  280. package/article/9c3c56c.html +0 -682
  281. package/article/a4145266.html +0 -71
  282. package/article/bedea419.html +0 -72
  283. package/article/bf7e7421.html +0 -78
  284. package/article/c1867fbf.html +0 -103
  285. package/article/dcb0db28.html +0 -76
  286. package/article/fc3b727a.html +0 -79
  287. package/atom.xml +0 -441
  288. package/baidusitemap.xml +0 -1079
  289. package/blocks/dns.txt +0 -291
  290. package/blocks/filter.txt +0 -1068
  291. package/blocks/script.js +0 -42
  292. package/categories/CDN/index.html +0 -48
  293. package/categories/IDE/index.html +0 -48
  294. package/categories/git/index.html +0 -48
  295. package/categories/hexo/index.html +0 -48
  296. package/categories//345/205/254/345/205/261/350/212/202/346/227/245/index.html +0 -48
  297. package/categories//345/210/206/344/272/253/index.html +0 -48
  298. package/categories//345/211/215/347/253/257/index.html +0 -48
  299. package/categories//345/211/215/347/253/257/page/2/index.html +0 -48
  300. package/categories//345/211/215/347/253/257//346/265/217/350/247/210/345/231/250/index.html +0 -48
  301. package/categories//345/211/215/347/253/257//346/265/217/350/247/210/345/231/250//347/275/221/347/273/234/345/215/217/350/256/256/index.html +0 -48
  302. package/categories//345/215/232/345/256/242/index.html +0 -48
  303. package/categories//345/267/245/345/205/267/index.html +0 -48
  304. package/categories//345/271/277/345/221/212/350/277/207/346/273/244/index.html +0 -48
  305. package/categories//345/271/277/345/221/212/350/277/207/346/273/244//345/275/261/350/247/206/347/224/265/350/247/206/345/260/217/350/257/264/346/274/253/347/224/273/350/265/204/350/256/257/351/237/263/344/271/220/index.html +0 -48
  306. package/categories//345/271/277/345/221/212/350/277/207/346/273/244//350/247/206/351/242/221/347/224/265/350/247/206/345/260/217/350/257/264/346/274/253/347/224/273/350/265/204/350/256/257/351/237/263/344/271/220/index.html +0 -48
  307. package/categories//346/255/243/345/210/231/index.html +0 -48
  308. package/categories//346/265/217/350/247/210/345/231/250/index.html +0 -48
  309. package/categories//347/256/227/346/263/225/index.html +0 -48
  310. package/categories//350/265/204/350/256/257/index.html +0 -48
  311. package/categories//350/275/273/346/235/276/344/270/200/345/210/273/index.html +0 -48
  312. package/cdn/css/font-awesome.min.css +0 -4
  313. package/cdn/css/grids-responsive-min.css +0 -7
  314. package/cdn/css/normalize.css +0 -349
  315. package/cdn/css/pure-min.css +0 -11
  316. package/cdn/fonts/fontawesome-webfont.eot +0 -0
  317. package/cdn/fonts/fontawesome-webfont.svg +0 -2671
  318. package/cdn/fonts/fontawesome-webfont.ttf +0 -0
  319. package/cdn/fonts/fontawesome-webfont.woff +0 -0
  320. package/cdn/fonts/fontawesome-webfont.woff2 +0 -0
  321. package/cdn/js/Valine.min.js +0 -17
  322. package/cdn/js/canvas-nest.js +0 -1
  323. package/cdn/js/clipboard.min.js +0 -7
  324. package/cdn/js/crypto-js.js +0 -25
  325. package/cdn/js/jquery.min.js +0 -2
  326. package/css/default.css +0 -1144
  327. package/css/donate.css +0 -338
  328. package/css/hbe.style.css +0 -749
  329. package/css/style.css +0 -2095
  330. package/donate/index.html +0 -40
  331. package/google917dcf72f6e5c7f5.html +0 -1
  332. package/guestbook/index.html +0 -68
  333. package/hosts/ads.txt +0 -149
  334. package/hosts/flash.txt +0 -9
  335. package/hosts/github.txt +0 -15
  336. package/hosts/google.txt +0 -16936
  337. package/hosts/winrar.txt +0 -2
  338. package/img/alipay.svg +0 -46
  339. package/img/bitcoin.svg +0 -135
  340. package/img/blog.ico +0 -0
  341. package/img/blog.png +0 -0
  342. package/img/gaba.png +0 -0
  343. package/img/github.svg +0 -1
  344. package/img/like.svg +0 -1
  345. package/img/mp-mini.jpg +0 -0
  346. package/img/mp.png +0 -0
  347. package/img/paypal.svg +0 -63
  348. package/img/upy_logo.svg +0 -59
  349. package/img/wechat.svg +0 -49
  350. package/index.html +0 -48
  351. package/jd_root.txt +0 -1
  352. package/js/codeblock-resizer.js +0 -51
  353. package/js/dark.js +0 -12
  354. package/js/donate.js +0 -87
  355. package/js/fixedPage.js +0 -110
  356. package/js/gitment.browser.js +0 -3751
  357. package/js/search.js +0 -86
  358. package/js/share.js +0 -60
  359. package/js/smartresize.js +0 -32
  360. package/js/totop.js +0 -12
  361. package/kankan/index.html +0 -1323
  362. package/lib/hbe.js +0 -297
  363. package/page/10/index.html +0 -49
  364. package/page/11/index.html +0 -59
  365. package/page/12/index.html +0 -67
  366. package/page/13/index.html +0 -63
  367. package/page/14/index.html +0 -66
  368. package/page/15/index.html +0 -60
  369. package/page/16/index.html +0 -60
  370. package/page/17/index.html +0 -62
  371. package/page/18/index.html +0 -61
  372. package/page/19/index.html +0 -58
  373. package/page/2/index.html +0 -48
  374. package/page/20/index.html +0 -57
  375. package/page/21/index.html +0 -61
  376. package/page/22/index.html +0 -55
  377. package/page/23/index.html +0 -64
  378. package/page/24/index.html +0 -60
  379. package/page/25/index.html +0 -58
  380. package/page/26/index.html +0 -48
  381. package/page/27/index.html +0 -58
  382. package/page/3/index.html +0 -48
  383. package/page/4/index.html +0 -48
  384. package/page/5/index.html +0 -51
  385. package/page/6/index.html +0 -51
  386. package/page/7/index.html +0 -51
  387. package/page/8/index.html +0 -53
  388. package/page/9/index.html +0 -48
  389. package/randomcall/README.html +0 -1
  390. package/randomcall/lucker.html +0 -290
  391. package/randomcall/lucky.png +0 -0
  392. package/robots.txt +0 -22
  393. package/search.xml +0 -6728
  394. package/sitemap.xml +0 -2694
  395. package/tags//345/216/237/345/210/233/index.html +0 -48
  396. package/tags//345/250/261/344/271/220/index.html +0 -48
  397. package/tags//346/211/213/345/206/231/index.html +0 -48
  398. package/tags//347/226/253/346/203/205/index.html +0 -48
  399. package/tags//350/275/254/350/275/275/index.html +0 -48
  400. package/tags//350/275/254/350/275/275/page/2/index.html +0 -48
  401. package/v.html +0 -22
  402. /package/{appConfigs/config → config} +0 -0
  403. /package/{extConfigs/extension.json → extension.json} +0 -0
@@ -1,88 +0,0 @@
1
- <!DOCTYPE html><html lang="zh-CN" data-dark><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" name="viewport"><meta content="yes" name="apple-mobile-web-app-capable"><meta content="black-translucent" name="apple-mobile-web-app-status-bar-style"><meta content="telephone=no" name="format-detection"><meta name="description" content="前端壹菜鸟,记录工作难题,关注前端知识,收集精彩博文,做技术的搬运工"><meta name="msvalidate.01" content="0FE4D8B3381D3D87088996B886E1E2BD"><title>uniapp的webview嵌套页面中的js,css等文件如何替换 | 前端壹菜鸟</title><link rel="stylesheet" type="text/css" href="//unpkg.com/cainiaoblog@latest/css/style.css"><link rel="stylesheet" type="text/css" href="//cdn.staticaly.com/gh/npljy/npljy.github.io/main/css/style.min.css"><link rel="stylesheet" type="text/css" href="//cdn.jsdelivr.net/npm/cainiaoblog@latest/css/style.min.css"><link rel="stylesheet" type="text/css" href="//cdn.jsdelivr.net/npm/normalize.css@latest/normalize.min.css"><link rel="stylesheet" type="text/css" href="//cdn.jsdelivr.net/npm/purecss@latest/build/pure-min.min.css"><link rel="stylesheet" type="text/css" href="//cdn.jsdelivr.net/npm/purecss@latest/build/grids-responsive-min.css"><link rel="stylesheet" type="text/css" href="//cdn.jsdelivr.net/npm/font-awesome@4.7.0/css/font-awesome.min.css"><link rel="icon" mask="" sizes="any" href="//cdn.staticaly.com/gh/npljy/npljy.github.io/main/img/blog.ico"><link rel="Shortcut Icon" type="image/x-icon" href="//cdn.staticaly.com/gh/npljy/npljy.github.io/main/img/blog.ico"><link rel="apple-touch-icon" href="//cdn.staticaly.com/gh/npljy/npljy.github.io/main/img/blog.png"><link rel="apple-touch-icon-precomposed" href="//cdn.staticaly.com/gh/npljy/npljy.github.io/main/img/blog.png"><link rel="alternate" type="application/atom+xml" href="/atom.xml"><script type="text/javascript" src="//cdn.jsdelivr.net/npm/jquery@latest/dist/jquery.min.js"></script><script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8385136408348258"></script><script src="https://busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js" async></script><script>(function(){
2
- var bp = document.createElement('script');
3
- var curProtocol = window.location.protocol.split(':')[0];
4
- if (curProtocol === 'https'){
5
- bp.src = 'https://zz.bdstatic.com/linksubmit/push.js';
6
- }
7
- else{
8
- bp.src = 'http://push.zhanzhang.baidu.com/push.js';
9
- }
10
- var s = document.getElementsByTagName("script")[0];
11
- s.parentNode.insertBefore(bp, s);
12
- })();
13
- </script><script>(function(){
14
- var src = 'https://jspassport.ssl.qhimg.com/11.0.1.js?d182b3f28525f2db83acfaaf6e696dba';
15
- document.write('<script src="' + src + '" id="sozz"><\/script>');
16
- })();
17
- </script><script>var _hmt=_hmt||[];(function(){var hm=document.createElement("script");hm.src='https://hm.baidu.com/hm.js?011f0b44e8452bfa57fbfa23c5fe7683';var s=document.getElementsByTagName("script")[0];s.parentNode.insertBefore(hm, s);})();
18
- </script><script async src="https://www.googletagmanager.com/gtag/js?id=UA-150860401-1"></script><script>window.dataLayer=window.dataLayer||[];function gtag(){dataLayer.push(arguments);};gtag('js',new Date());gtag('config','UA-150860401-1');
19
- </script><script type="text/javascript" src="//cdn.jsdelivr.net/npm/cainiaoblog@latest/js/fixedPage.min.js"></script><meta name="generator" content="Hexo 6.3.0"></head><body><div class="body_container"><div id="header"><div class="site-name"><a id="logo" href="/.">前端壹菜鸟</a><p class="description">关注前端知识,收集精彩博文,做技术的搬运工</p></div><div id="nav-menu"><a class="current" href="/." target="_self"><i class="fa fa-home"> 首页</i></a><a href="/archives/" target="_self"><i class="fa fa-archive"> 归档</i></a><a href="/guestbook/" target="_self"><i class="fa fa-comments"> 留言</i></a><a href="/about/" target="_self"><i class="fa fa-user"> 关于</i></a><a href="https://laonongmin.online/" target="_target"><i class="fa fa-group"> 看看</i></a><a href="https://love.xuehuayu.cn/" target="_target"><i class="fa fa-heart"> LOVE</i></a></div></div><div class="pure-g" id="layout"><div class="pure-u-1 pure-u-md-3-4"><div class="content_container"><div class="post"><h1 class="post-title c-post">uniapp的webview嵌套页面中的js,css等文件如何替换</h1><div class="post-meta"><span class="date">2021-11-08</span><span> | </span><span class="tag original"><a href="/tags/%E5%8E%9F%E5%88%9B/">原创 </a></span><span> | </span><span class="category"><a href="/categories/%E5%89%8D%E7%AB%AF/">前端 </a></span><span id="busuanzi_container_page_pv"> | <span id="busuanzi_value_page_pv"><i class="fa fa-spinner"></i></span><span> 阅读</span></span><span class="post-time"><span class="post-meta-item-text"> | </span><span class="post-meta-item-icon"><i class="fa fa-keyboard-o"></i><span class="post-count"> 177</span><span class="post-meta-item-text"> 字</span></span></span><span class="post-time"> | <span class="post-meta-item-icon"><i class="fa fa-hourglass-half"></i><span class="post-count"> 1</span><span class="post-meta-item-text"> 分钟</span></span></span></div><a class="disqus-comment-count" href="/article/38344.html#vcomment"><span class="waline-comment-count" data-path="/article/38344.html"></span><span> 条评论</span></a><div class="post-content"><p>uniapp的webview嵌套页面中的广告,js文件、图片文件等如何替换</p>
20
- <span id="more"></span>
21
- <blockquote>
22
- <p>场景:</p>
23
- </blockquote>
24
- <p>webview嵌套了一个在线播放页面,但是播放页面中还有广告js,广告图片等</p>
25
- <blockquote>
26
- <p>解决方法:</p>
27
- </blockquote>
28
- <p>使用webviewObject的overrideResourceRequest</p>
29
- <blockquote>
30
- <p>实现</p>
31
- </blockquote>
32
- <figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 获取当前页面 webview</span></span><br><span class="line">currentWebview = <span class="variable language_">this</span>.<span class="property">$scope</span>.$getAppWebview()</span><br><span class="line"><span class="comment">// 需要替换的资源路径列表</span></span><br><span class="line"><span class="keyword">const</span> filterUrls = [<span class="string">&#x27;cnzz&#x27;</span>, <span class="string">&#x27;umeng&#x27;</span>]</span><br><span class="line"><span class="keyword">const</span> urlFilter = _.<span class="title function_">map</span>(filterUrls, <span class="function"><span class="params">f</span> =&gt;</span> &#123;</span><br><span class="line"> <span class="keyword">return</span> &#123;</span><br><span class="line"> <span class="comment">// 正则匹配</span></span><br><span class="line"> <span class="attr">match</span>: <span class="string">`.*<span class="subst">$&#123;f&#125;</span>.*`</span>,</span><br><span class="line"> <span class="comment">// 将匹配的文件重定向到此文件,仅支持本地资源地址,如&quot;_www&quot;、&quot;_doc&quot;、&quot;_downloads&quot;、&quot;_documents&quot;等开头的路径。</span></span><br><span class="line"> <span class="attr">redirect</span>: <span class="string">&#x27;_www/static/override/none.js&#x27;</span> </span><br><span class="line"> &#125;</span><br><span class="line"> &#125;)</span><br><span class="line"><span class="comment">// 调用 overrideResourceRequest</span></span><br><span class="line">currentWebview.<span class="title function_">overrideResourceRequest</span>(urlFilter)</span><br></pre></td></tr></table></figure>
33
-
34
- <blockquote>
35
- <p>文档</p>
36
- </blockquote>
37
- <p><a target="_blank" rel="noopener" href="https://www.html5plus.org/doc/zh_cn/webview.html#plus.webview.WebviewObject.overrideResourceRequest">webviewObject的overrideResourceRequest方法</a></p>
38
- <p><a target="_blank" rel="noopener" href="https://www.html5plus.org/doc/zh_cn/webview.html#plus.webview.WebviewObject.overrideUrlLoading">webviewObject的overrideUrlLoading方法</a></p>
39
- </div><div><ul class="post-copyright"><li class="post-copyright-author"><strong>本文作者:</strong>雪花雨</li><li class="post-copyright-link"><strong>本文链接:</strong><a href="/article/38344.html">https://xuehuayu.cn/article/38344.html</a></li><li class="post-copyright-license"><strong>版权声明:</strong>① 标为原创的文章为博主原创,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接。② 转载文章来自网络,已标明出处,<a href="mailto:cainiaoblog@126.com">侵删</a>。</li></ul></div><br><div class="tags"><a href="/tags/%E5%8E%9F%E5%88%9B/">原创</a></div><div class="post-nav"><a class="pre" href="/article/65295.html">一行代码生成随机字符串</a><a class="next" href="/article/59870.html">vue的input输入框中截取字符串改变时不刷新问题</a></div><div id="vcomment"></div><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@waline/client@v2/dist/waline.min.css"><script src="//cdn.jsdelivr.net/npm/@waline/client@v2/dist/waline.js"></script><script>const origin = window.location.origin
40
- const serverURL = origin.includes('cainiaoblog') ? 'https://cmts.cainiaoblog.cn' : 'https://cmts.xuehuayu.cn'
41
- const locale = {
42
- placeholder: '请正确填写昵称和邮箱,方便接收回复通知~',
43
- sofa: '沙发空缺中,还不快抢~',
44
- };
45
- Waline.init({
46
- el: '#vcomment',
47
- serverURL: serverURL,
48
- pageSize: '20',
49
- visitor: true, // 阅读量统计
50
- requiredMeta: ['nick', 'mail'],
51
- emoji: [
52
- 'https://cdn.jsdelivr.net/gh/walinejs/emojis@1.0.0/weibo',
53
- 'https://cdn.jsdelivr.net/gh/walinejs/emojis@1.0.0/qq',
54
- 'https://cdn.jsdelivr.net/gh/walinejs/emojis@1.0.0/tw-emoji',
55
- ],
56
- locale,
57
- pageview: true
58
- })
59
- </script></div></div></div><div class="pure-u-1 pure-u-md-1-4 fixed-search hidden_mid_and_down"><div id="sidebar"><script type="text/javascript" src="//cdn.jsdelivr.net/npm/cainiaoblog@latest/js/search.min.js"></script><div class="widget"><div class="widget-search"><input class="search" type="radio" name="search" value="baidu" id="baidu" checked="checked"/><label class="label" for="baidu" title="百度全站搜索">百度</label><input class="search" type="radio" name="search" value="google" id="google"/><label class="label" for="google" title="谷歌全站搜索">谷歌</label><input class="search" type="radio" name="search" value="self" id="self"/><label class="label" for="self" title="使用站内搜索">站内</label></div><div class="widget" id="search"><form class="search-form" action="//www.baidu.com/baidu" method="get" accept-charset="utf-8" target="_blank"><input type="search" name="word" maxlength="30" placeholder="百度全站搜索"/><input type="hidden" name="si" value="xuehuayu.cn"/><input type="hidden" name="cl" value="3"/><input type="hidden" name="ct" value="2097152"/><input type="hidden" name="s" value="on"/><input class="search-submit" type="submit" value=""/></form></div></div><script>$('input[type=radio][name=search]').change(function() {
60
- var val = $(this).val()
61
- var self = '<div class="search-form"><input id="local-search-input" placeholder="站内搜索,首次慢" type="search" name="q" results="0"><input class="search-submit" type="submit" value=""/><div id="local-search-result"></div></div>'
62
- var google = '<form class="search-form" action="//www.google.com/search" method="get" accept-charset="utf-8" target="_blank"><input type="search" name="q" maxlength="30" placeholder="谷歌全站搜索"><input type="hidden" name="sitesearch" value="xuehuayu.cn"><input class="search-submit" type="submit" value=""/></form>'
63
- var baidu = '<form class="search-form" action="//www.baidu.com/baidu" method="get" accept-charset="utf-8" target="_blank"><input type="search" name="word" maxlength="30" placeholder="百度全站搜索"><input type="hidden" name="si" value="xuehuayu.cn"><input type="hidden" name="cl" value="3"><input type="hidden" name="ct" value="2097152"><input type="hidden" name="s" value="on"><input class="search-submit" type="submit" value=""/></form>'
64
-
65
- if (val === 'self') {
66
- $('#search').html(self)
67
- var search_path = 'search.xml';
68
- if (search_path.length == 0) {
69
- search_path = 'search.xml';
70
- }
71
- var path = 'https://cdn.staticaly.com/gh/npljy/npljy.github.io/main/' + search_path;
72
- searchFunc(path, 'local-search-input', 'local-search-result');
73
- } else if (val === 'baidu') {
74
- $('#search').html(baidu)
75
- } else if (val === 'google') {
76
- $('#search').html(google)
77
- }
78
- })</script><div class="widget widget-wxmp"><img alt="微信公众号" width="100%" src="//cdn.staticaly.com/gh/npljy/npljy.github.io/main/img/mp-mini.jpg"/></div><div class="widget widget-categories"><div class="widget-title"><i class="fa fa-folder-o"> 分类</i></div><ul class="category-list"><li class="category-list-item"><a class="category-list-link" href="/categories/CDN/">CDN</a><span class="category-list-count">2</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/IDE/">IDE</a><span class="category-list-count">1</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/git/">git</a><span class="category-list-count">2</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/hexo/">hexo</a><span class="category-list-count">1</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E5%85%AC%E5%85%B1%E8%8A%82%E6%97%A5/">公共节日</a><span class="category-list-count">1</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E5%88%86%E4%BA%AB/">分享</a><span class="category-list-count">29</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E5%89%8D%E7%AB%AF/">前端</a><span class="category-list-count">190</span><ul class="category-list-child"><li class="category-list-item"><a class="category-list-link" href="/categories/%E5%89%8D%E7%AB%AF/%E6%B5%8F%E8%A7%88%E5%99%A8/">浏览器</a><span class="category-list-count">1</span><ul class="category-list-child"><li class="category-list-item"><a class="category-list-link" href="/categories/%E5%89%8D%E7%AB%AF/%E6%B5%8F%E8%A7%88%E5%99%A8/%E7%BD%91%E7%BB%9C%E5%8D%8F%E8%AE%AE/">网络协议</a><span class="category-list-count">1</span></li></ul></li></ul></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E5%8D%9A%E5%AE%A2/">博客</a><span class="category-list-count">3</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E5%B7%A5%E5%85%B7/">工具</a><span class="category-list-count">2</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E5%B9%BF%E5%91%8A%E8%BF%87%E6%BB%A4/">广告过滤</a><span class="category-list-count">8</span><ul class="category-list-child"><li class="category-list-item"><a class="category-list-link" href="/categories/%E5%B9%BF%E5%91%8A%E8%BF%87%E6%BB%A4/%E5%BD%B1%E8%A7%86%E7%94%B5%E8%A7%86%E5%B0%8F%E8%AF%B4%E6%BC%AB%E7%94%BB%E8%B5%84%E8%AE%AF%E9%9F%B3%E4%B9%90/">影视电视小说漫画资讯音乐</a><span class="category-list-count">1</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E5%B9%BF%E5%91%8A%E8%BF%87%E6%BB%A4/%E8%A7%86%E9%A2%91%E7%94%B5%E8%A7%86%E5%B0%8F%E8%AF%B4%E6%BC%AB%E7%94%BB%E8%B5%84%E8%AE%AF%E9%9F%B3%E4%B9%90/">视频电视小说漫画资讯音乐</a><span class="category-list-count">1</span></li></ul></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E6%AD%A3%E5%88%99/">正则</a><span class="category-list-count">5</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E6%B5%8F%E8%A7%88%E5%99%A8/">浏览器</a><span class="category-list-count">5</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E7%AE%97%E6%B3%95/">算法</a><span class="category-list-count">2</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E8%B5%84%E8%AE%AF/">资讯</a><span class="category-list-count">16</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E8%BD%BB%E6%9D%BE%E4%B8%80%E5%88%BB/">轻松一刻</a><span class="category-list-count">1</span></li></ul></div><div class="widget widget-tags"><div class="widget-title"><i class="fa fa-star-o"> 标签</i></div><div class="tagcloud"><a href="/tags/%E5%8E%9F%E5%88%9B/" style="font-size: 15px;">原创</a> <a href="/tags/%E8%BD%AC%E8%BD%BD/" style="font-size: 15px;">转载</a> <a href="/tags/%E6%89%8B%E5%86%99/" style="font-size: 15px;">手写</a> <a href="/tags/%E7%96%AB%E6%83%85/" style="font-size: 15px;">疫情</a> <a href="/tags/%E5%A8%B1%E4%B9%90/" style="font-size: 15px;">娱乐</a></div></div><div class="widget widget-recent-posts"><div class="widget-title"><i class="fa fa-file-o"> 最近文章</i></div><ul class="post-list"><li class="post-list-item"><a class="post-list-link" href="/article/9c3c56c.html">vue、react、webpack、babel</a></li><li class="post-list-item"><a class="post-list-link" href="/article/84c9ccd6.html">精读《SolidJS》</a></li><li class="post-list-item"><a class="post-list-link" href="/article/53803e6.html">git提交注释规范</a></li><li class="post-list-item"><a class="post-list-link" href="/article/a4145266.html">前端数组拍平flat一行代码</a></li><li class="post-list-item"><a class="post-list-link" href="/article/bedea419.html">一道前端this面试题</a></li><li class="post-list-item"><a class="post-list-link" href="/article/bf7e7421.html">git多账号配置</a></li></ul></div><div class="widget widget-links"><div class="widget-title"><i class="fa fa-external-link"> 友情链接</i></div><ul></ul><a href="https://github.com/npljy?utm_source=xuehuayu.cn" title="GitHub" target="_blank">GitHub</a><ul></ul><a href="https://laonongmin.online?utm_source=xuehuayu.cn" title="看看" target="_blank">看看</a><ul></ul><a href="https://cainiaoblog.cn?utm_source=xuehuayu.cn" title="菜鸟博客" target="_blank">菜鸟博客</a><ul></ul><a href="mailto:cainiaoblog@126.com" title="友链联系" target="_blank">友链联系</a></div></div></div><div class="pure-u-1 pure-u-md-3-4"><div id="footer"><div class="flex-block justify-center align-center flex-wrap"><a class="gxba-link" id="gxba" rel="nofollow" target="_blank" href="http://beian.miit.gov.cn/">京ICP备20007647号-2</a><a class="gaba-link" id="gaba-link" rel="nofollow" target="_blank" href="http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=11010802031264"><img class="nofancybox" src="//cdn.staticaly.com/gh/npljy/npljy.github.io/main/img/gaba.png" alt=""/><span id="gaba">京公网安备 11010802031264号</span><span style="padding-right: 10px;"></span></a><span>Copyright © 2023 </span><a href="/." rel="nofollow">前端壹菜鸟. </a><script>(function(){
79
- var cnb =window.location.origin.indexOf('cainiaoblog') !==-1
80
- if (cnb) {
81
- var gxba =document.getElementById('gxba')
82
- var gaba =document.getElementById('gaba')
83
- var gabaLink =document.getElementById('gaba-link')
84
- gxba.innerText ='京ICP备20007647号-1'
85
- gaba.innerText ='京公网安备 11010802031254号'
86
- gabaLink.setAttribute('href','http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=11010802031254')
87
- }
88
- })()</script></div><div class="flex-block justify-center align-center flex-wrap"><a rel="nofollow" target="_blank" href="https://v6.51.la/s/Guz3lwHCsVme9Cu"><div class="busuanzi_container" id="busuanzi_container"><span class="busuanzi_container_site_pv" id="busuanzi_container_site_pv">访问量:<span id="busuanzi_value_site_pv"><i class="fa fa-spinner"></i></span></span><span class="busuanzi_container_site_uv" id="busuanzi_container_site_uv">访客数:<span id="busuanzi_value_site_uv"><i class="fa fa-spinner"></i></span></span><span style="padding-right: 10px;"></span></div></a><a rel="nofollow" target="_blank" href="https://www.upyun.com/?utm_source=lianmeng&amp;utm_medium=referral"><span style="font-weight:bold;letter-spacing: 1px;">本网站由 </span><img class="nofancybox" height="32" style="vertical-align: middle" src="//cdn.staticaly.com/gh/npljy/npljy.github.io/main/img/upy_logo.min.svg" alt=""/><span style="font-weight:bold;letter-spacing: 1px;">提供CDN加速/云存储服务</span></a><span style="padding-right: 10px;"></span><a rel="nofollow" style="font-size:18px;font-weight:bold;vertical-align: middle" target="_blank" title="注册就送代金券可直接使用" href="https://console.upyun.com/register/?invite=HyDsjZHIL">注册</a></div></div></div></div><a class="show" id="rocket" href="#top"></a><div class="darkmode-toggle">🌓</div><script type="text/javascript" src="//cdn.jsdelivr.net/npm/cainiaoblog@latest/js/totop.min.js" async></script><script type="text/javascript" src="//cdn.jsdelivr.net/npm/cainiaoblog@latest/js/dark.min.js" async></script><script type="text/javascript" src="//cdn.jsdelivr.net/npm/cainiaoblog@latest/js/codeblock-resizer.min.js"></script><script type="text/javascript" src="//cdn.jsdelivr.net/npm/cainiaoblog@latest/js/smartresize.min.js"></script></div></body></html>
@@ -1,334 +0,0 @@
1
- <!DOCTYPE html><html lang="zh-CN" data-dark><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" name="viewport"><meta content="yes" name="apple-mobile-web-app-capable"><meta content="black-translucent" name="apple-mobile-web-app-status-bar-style"><meta content="telephone=no" name="format-detection"><meta name="description" content="前端壹菜鸟,记录工作难题,关注前端知识,收集精彩博文,做技术的搬运工"><meta name="msvalidate.01" content="0FE4D8B3381D3D87088996B886E1E2BD"><title>高频面试题深入解析/ 周刊 03 | 前端壹菜鸟</title><link rel="stylesheet" type="text/css" href="//unpkg.com/cainiaoblog@latest/css/style.css"><link rel="stylesheet" type="text/css" href="//cdn.staticaly.com/gh/npljy/npljy.github.io/main/css/style.min.css"><link rel="stylesheet" type="text/css" href="//cdn.jsdelivr.net/npm/cainiaoblog@latest/css/style.min.css"><link rel="stylesheet" type="text/css" href="//cdn.jsdelivr.net/npm/normalize.css@latest/normalize.min.css"><link rel="stylesheet" type="text/css" href="//cdn.jsdelivr.net/npm/purecss@latest/build/pure-min.min.css"><link rel="stylesheet" type="text/css" href="//cdn.jsdelivr.net/npm/purecss@latest/build/grids-responsive-min.css"><link rel="stylesheet" type="text/css" href="//cdn.jsdelivr.net/npm/font-awesome@4.7.0/css/font-awesome.min.css"><link rel="icon" mask="" sizes="any" href="//cdn.staticaly.com/gh/npljy/npljy.github.io/main/img/blog.ico"><link rel="Shortcut Icon" type="image/x-icon" href="//cdn.staticaly.com/gh/npljy/npljy.github.io/main/img/blog.ico"><link rel="apple-touch-icon" href="//cdn.staticaly.com/gh/npljy/npljy.github.io/main/img/blog.png"><link rel="apple-touch-icon-precomposed" href="//cdn.staticaly.com/gh/npljy/npljy.github.io/main/img/blog.png"><link rel="alternate" type="application/atom+xml" href="/atom.xml"><script type="text/javascript" src="//cdn.jsdelivr.net/npm/jquery@latest/dist/jquery.min.js"></script><script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8385136408348258"></script><script src="https://busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js" async></script><script>(function(){
2
- var bp = document.createElement('script');
3
- var curProtocol = window.location.protocol.split(':')[0];
4
- if (curProtocol === 'https'){
5
- bp.src = 'https://zz.bdstatic.com/linksubmit/push.js';
6
- }
7
- else{
8
- bp.src = 'http://push.zhanzhang.baidu.com/push.js';
9
- }
10
- var s = document.getElementsByTagName("script")[0];
11
- s.parentNode.insertBefore(bp, s);
12
- })();
13
- </script><script>(function(){
14
- var src = 'https://jspassport.ssl.qhimg.com/11.0.1.js?d182b3f28525f2db83acfaaf6e696dba';
15
- document.write('<script src="' + src + '" id="sozz"><\/script>');
16
- })();
17
- </script><script>var _hmt=_hmt||[];(function(){var hm=document.createElement("script");hm.src='https://hm.baidu.com/hm.js?011f0b44e8452bfa57fbfa23c5fe7683';var s=document.getElementsByTagName("script")[0];s.parentNode.insertBefore(hm, s);})();
18
- </script><script async src="https://www.googletagmanager.com/gtag/js?id=UA-150860401-1"></script><script>window.dataLayer=window.dataLayer||[];function gtag(){dataLayer.push(arguments);};gtag('js',new Date());gtag('config','UA-150860401-1');
19
- </script><script type="text/javascript" src="//cdn.jsdelivr.net/npm/cainiaoblog@latest/js/fixedPage.min.js"></script><meta name="generator" content="Hexo 6.3.0"></head><body><div class="body_container"><div id="header"><div class="site-name"><a id="logo" href="/.">前端壹菜鸟</a><p class="description">关注前端知识,收集精彩博文,做技术的搬运工</p></div><div id="nav-menu"><a class="current" href="/." target="_self"><i class="fa fa-home"> 首页</i></a><a href="/archives/" target="_self"><i class="fa fa-archive"> 归档</i></a><a href="/guestbook/" target="_self"><i class="fa fa-comments"> 留言</i></a><a href="/about/" target="_self"><i class="fa fa-user"> 关于</i></a><a href="https://laonongmin.online/" target="_target"><i class="fa fa-group"> 看看</i></a><a href="https://love.xuehuayu.cn/" target="_target"><i class="fa fa-heart"> LOVE</i></a></div></div><div class="pure-g" id="layout"><div class="pure-u-1 pure-u-md-3-4"><div class="content_container"><div class="post"><h1 class="post-title c-post">高频面试题深入解析/ 周刊 03</h1><div class="post-meta"><span class="date">2019-10-03</span><span> | </span><span class="tag"><a href="/tags/%E8%BD%AC%E8%BD%BD/">转载 </a></span><span> | </span><span class="category"><a href="/categories/%E5%88%86%E4%BA%AB/">分享 </a></span><span id="busuanzi_container_page_pv"> | <span id="busuanzi_value_page_pv"><i class="fa fa-spinner"></i></span><span> 阅读</span></span><span class="post-time"><span class="post-meta-item-text"> | </span><span class="post-meta-item-icon"><i class="fa fa-keyboard-o"></i><span class="post-count"> 4k</span><span class="post-meta-item-text"> 字</span></span></span><span class="post-time"> | <span class="post-meta-item-icon"><i class="fa fa-hourglass-half"></i><span class="post-count"> 15</span><span class="post-meta-item-text"> 分钟</span></span></span></div><a class="disqus-comment-count" href="/article/38359.html#vcomment"><span class="waline-comment-count" data-path="/article/38359.html"></span><span> 条评论</span></a><div class="post-content"><p><code>原文地址:https://github.com/YvetteLau/Blog/issues/33</code></p>
20
- <span id="more"></span>
21
- <h3 id="关于【Step-By-Step】"><a href="#关于【Step-By-Step】" class="headerlink" title="关于【Step-By-Step】"></a>关于【Step-By-Step】</h3><blockquote>
22
- <p><a target="_blank" rel="noopener" href="https://github.com/YvetteLau/Step-By-Step">Step-By-Step</a> (点击进入项目) 是我于 <code>2019-05-20</code> 开始的一个项目,每个工作日发布一道面试题。<br>每个周末我会仔细阅读大家的答案,整理最一份较优答案出来,因本人水平有限,有误的地方,大家及时指正。</p>
23
- </blockquote>
24
- <hr>
25
- <blockquote>
26
- <p>本周面试题一览:</p>
27
- </blockquote>
28
- <ul>
29
- <li>什么是XSS攻击,XSS 攻击可以分为哪几类?我们如何防范XSS攻击?</li>
30
- <li>如何隐藏页面中的某个元素?</li>
31
- <li>浏览器事件代理机制的原理是什么?</li>
32
- <li>setTimeout 倒计时为什么会出现误差?</li>
33
- </ul>
34
- <h3 id="11-什么是XSS攻击,XSS攻击可以分为哪几类?我们如何防范XSS攻击?"><a href="#11-什么是XSS攻击,XSS攻击可以分为哪几类?我们如何防范XSS攻击?" class="headerlink" title="11. 什么是XSS攻击,XSS攻击可以分为哪几类?我们如何防范XSS攻击?"></a>11. 什么是XSS攻击,XSS攻击可以分为哪几类?我们如何防范XSS攻击?</h3><h4 id="1-XSS攻击"><a href="#1-XSS攻击" class="headerlink" title="1. XSS攻击"></a>1. XSS攻击</h4><p>XSS(Cross-Site Scripting,跨站脚本攻击)是一种代码注入攻击。攻击者在目标网站上注入恶意代码,当被攻击者登陆网站时就会执行这些恶意代码,这些脚本可以读取 cookie,session tokens,或者其它敏感的网站信息,对用户进行钓鱼欺诈,甚至发起蠕虫攻击等。</p>
35
- <p>XSS 的本质是:恶意代码未经过滤,与网站正常的代码混在一起;浏览器无法分辨哪些脚本是可信的,导致恶意脚本被执行。由于直接在用户的终端执行,恶意代码能够直接获取用户的信息,利用这些信息冒充用户向网站发起攻击者定义的请求。</p>
36
- <h4 id="XSS分类"><a href="#XSS分类" class="headerlink" title="XSS分类"></a>XSS分类</h4><p>根据攻击的来源,XSS攻击可以分为存储型(持久性)、反射型(非持久型)和DOM型三种。下面我们来详细了解一下这三种XSS攻击:</p>
37
- <blockquote>
38
- <h4 id="1-1-反射型XSS"><a href="#1-1-反射型XSS" class="headerlink" title="1.1 反射型XSS"></a>1.1 反射型XSS</h4></blockquote>
39
- <p>当用户点击一个恶意链接,或者提交一个表单,或者进入一个恶意网站时,注入脚本进入被攻击者的网站。Web服务器将注入脚本,比如一个错误信息,搜索结果等,未进行过滤直接返回到用户的浏览器上。</p>
40
- <blockquote>
41
- <p>反射型 XSS 的攻击步骤:</p>
42
- </blockquote>
43
- <ol>
44
- <li>攻击者构造出特殊的 <code>URL</code>,其中包含恶意代码。</li>
45
- <li>用户打开带有恶意代码的 <code>URL</code> 时,网站服务端将恶意代码从 <code>URL</code> 中取出,拼接在 HTML 中返回给浏览器。</li>
46
- <li>用户浏览器接收到响应后解析执行,混在其中的恶意代码也被执行。</li>
47
- <li>恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作。</li>
48
- </ol>
49
- <p>反射型 XSS 漏洞常见于通过 <code>URL</code> 传递参数的功能,如网站搜索、跳转等。由于需要用户主动打开恶意的 <code>URL</code> 才能生效,攻击者往往会结合多种手段诱导用户点击。</p>
50
- <p>POST 的内容也可以触发反射型 XSS,只不过其触发条件比较苛刻(需要构造表单提交页面,并引导用户点击),所以非常少见。</p>
51
- <p>如果不希望被前端拿到cookie,后端可以设置 <code>httpOnly</code> (不过这不是 <code>XSS攻击</code> 的解决方案,只能降低受损范围)</p>
52
- <blockquote>
53
- <p>如何防范反射型XSS攻击</p>
54
- </blockquote>
55
- <p><strong>对字符串进行编码。</strong></p>
56
- <p>对url的查询参数进行转义后再输出到页面。</p>
57
- <pre><code>app.get(&#39;/welcome&#39;, function(req, res) &#123;
58
- //对查询参数进行编码,避免反射型 XSS攻击res.send(`$&#123;encodeURIComponent(req.query.type)&#125;`);
59
- &#125;);
60
- </code></pre>
61
- <blockquote>
62
- <h4 id="1-2-DOM-型-XSS"><a href="#1-2-DOM-型-XSS" class="headerlink" title="1.2 DOM 型 XSS"></a>1.2 DOM 型 XSS</h4></blockquote>
63
- <p>DOM 型 XSS 攻击,实际上就是前端 <code>JavaScript</code> 代码不够严谨,把不可信的内容插入到了页面。在使用 <code>.innerHTML</code>、<code>.outerHTML</code>、<code>.appendChild</code>、<code>document.write()</code>等API时要特别小心,不要把不可信的数据作为 HTML 插到页面上,尽量使用 <code>.innerText</code>、<code>.textContent</code>、<code>.setAttribute()</code> 等。</p>
64
- <blockquote>
65
- <p>DOM 型 XSS 的攻击步骤:</p>
66
- </blockquote>
67
- <ol>
68
- <li>攻击者构造出特殊数据,其中包含恶意代码。</li>
69
- <li>用户浏览器执行了恶意代码。</li>
70
- <li>恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作。</li>
71
- </ol>
72
- <blockquote>
73
- <p>如何防范 DOM 型 XSS 攻击</p>
74
- </blockquote>
75
- <p>防范 DOM 型 XSS 攻击的核心就是对输入内容进行转义(DOM 中的内联事件监听器和链接跳转都能把字符串作为代码运行,需要对其内容进行检查)。</p>
76
- <p>1.对于<code>url</code>链接(例如图片的<code>src</code>属性),那么直接使用 <code>encodeURIComponent</code> 来转义。</p>
77
- <p>2.非<code>url</code>,我们可以这样进行编码:</p>
78
- <pre><code>functionencodeHtml(str) &#123;
79
- returnstr.replace(/&quot;/g, &#39;&amp;quot;&#39;)
80
- .replace(/&#39;/g, &#39;&amp;apos;&#39;)
81
- .replace(/&lt;/g, &#39;&amp;lt;&#39;)
82
- .replace(/&gt;/g, &#39;&amp;gt;&#39;);
83
- &#125;
84
- </code></pre>
85
- <p>DOM 型 XSS 攻击中,取出和执行恶意代码由浏览器端完成,属于前端 JavaScript 自身的安全漏洞。</p>
86
- <blockquote>
87
- <h4 id="1-3-存储型XSS"><a href="#1-3-存储型XSS" class="headerlink" title="1.3 存储型XSS"></a>1.3 存储型XSS</h4></blockquote>
88
- <p>恶意脚本永久存储在目标服务器上。当浏览器请求数据时,脚本从服务器传回并执行,影响范围比反射型和DOM型XSS更大。存储型XSS攻击的原因仍然是没有做好数据过滤:前端提交数据至服务端时,没有做好过滤;服务端在接受到数据时,在存储之前,没有做过滤;前端从服务端请求到数据,没有过滤输出。</p>
89
- <blockquote>
90
- <p>存储型 XSS 的攻击步骤:</p>
91
- </blockquote>
92
- <ol>
93
- <li>攻击者将恶意代码提交到目标网站的数据库中。</li>
94
- <li>用户打开目标网站时,网站服务端将恶意代码从数据库取出,拼接在 HTML 中返回给浏览器。</li>
95
- <li>用户浏览器接收到响应后解析执行,混在其中的恶意代码也被执行。</li>
96
- <li>恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作。</li>
97
- </ol>
98
- <p>这种攻击常见于带有用户保存数据的网站功能,如论坛发帖、商品评论、用户私信等。</p>
99
- <blockquote>
100
- <p>如何防范存储型XSS攻击:</p>
101
- </blockquote>
102
- <ol>
103
- <li>前端数据传递给服务器之前,先转义&#x2F;过滤(防范不了抓包修改数据的情况)</li>
104
- <li>服务器接收到数据,在存储到数据库之前,进行转义&#x2F;过滤</li>
105
- <li>前端接收到服务器传递过来的数据,在展示到页面前,先进行转义&#x2F;过滤</li>
106
- </ol>
107
- <p><strong>除了谨慎的转义,我们还需要其他一些手段来防范XSS攻击:</strong></p>
108
- <p><strong>1.Content Security Policy</strong></p>
109
- <p>在服务端使用 HTTP的 <code>Content-Security-Policy</code> 头部来指定策略,或者在前端设置 <code>meta</code> 标签。</p>
110
- <p>例如下面的配置只允许加载同域下的资源:</p>
111
- <pre><code>Content-Security-Policy: default-src &#39;self&#39;
112
-
113
- &lt;metahttp-equiv=&quot;Content-Security-Policy&quot;content=&quot;form-action &#39;self&#39;;&quot;&gt;
114
- </code></pre>
115
- <p>前端和服务端设置 CSP 的效果相同,但是<code>meta</code>无法使用<code>report</code></p>
116
- <p>严格的 CSP 在 XSS 的防范中可以起到以下的作用:</p>
117
- <ol>
118
- <li>禁止加载外域代码,防止复杂的攻击逻辑。</li>
119
- <li>禁止外域提交,网站被攻击后,用户的数据不会泄露到外域。</li>
120
- <li>禁止内联脚本执行(规则较严格,目前发现 GitHub 使用)。</li>
121
- <li>禁止未授权的脚本执行(新特性,Google Map 移动版在使用)。</li>
122
- <li>合理使用上报可以及时发现 XSS,利于尽快修复问题。</li>
123
- </ol>
124
- <p><strong>2.输入内容长度控制</strong></p>
125
- <p>对于不受信任的输入,都应该限定一个合理的长度。虽然无法完全防止 XSS 发生,但可以增加 XSS 攻击的难度。</p>
126
- <p><strong>3.输入内容限制</strong></p>
127
- <p>对于部分输入,可以限定不能包含特殊字符或者仅能输入数字等。</p>
128
- <p><strong>4.其他安全措施</strong></p>
129
- <ul>
130
- <li>HTTP-only Cookie: 禁止 JavaScript 读取某些敏感 Cookie,攻击者完成 XSS 注入后也无法窃取此 Cookie。</li>
131
- <li>验证码:防止脚本冒充用户提交危险操作。</li>
132
- </ul>
133
- <blockquote>
134
- <p><a target="_blank" rel="noopener" href="https://github.com/YvetteLau/Step-By-Step/issues/18">点击查看更多</a></p>
135
- </blockquote>
136
- <h3 id="12-如何隐藏页面中的某个元素?"><a href="#12-如何隐藏页面中的某个元素?" class="headerlink" title="12.如何隐藏页面中的某个元素?"></a>12.如何隐藏页面中的某个元素?</h3><h4 id="隐藏类型"><a href="#隐藏类型" class="headerlink" title="隐藏类型"></a>隐藏类型</h4><p>屏幕并不是唯一的输出机制,比如说屏幕上看不见的元素(隐藏的元素),其中一些依然能够被读屏软件阅读出来(因为读屏软件依赖于可访问性树来阐述)。为了消除它们之间的歧义,我们将其归为三大类:</p>
137
- <ul>
138
- <li>完全隐藏:元素从渲染树中消失,不占据空间。</li>
139
- <li>视觉上的隐藏:屏幕中不可见,占据空间。</li>
140
- <li>语义上的隐藏:读屏软件不可读,但正常占据空。</li>
141
- </ul>
142
- <h4 id="完全隐藏"><a href="#完全隐藏" class="headerlink" title="完全隐藏"></a>完全隐藏</h4><h4 id="1-display-属性-不占据空间"><a href="#1-display-属性-不占据空间" class="headerlink" title="1.display 属性(不占据空间)"></a>1.<code>display</code> 属性(不占据空间)</h4><pre><code>display: none;
143
- </code></pre>
144
- <h4 id="2-hidden-属性-不占据空间"><a href="#2-hidden-属性-不占据空间" class="headerlink" title="2.hidden 属性 (不占据空间)"></a>2.hidden 属性 (不占据空间)</h4><p>HTML5 新增属性,相当于 <code>display: none</code></p>
145
- <pre><code>&lt;divhidden&gt;
146
- &lt;/div&gt;
147
- </code></pre>
148
- <h4 id="视觉上的隐藏"><a href="#视觉上的隐藏" class="headerlink" title="视觉上的隐藏"></a>视觉上的隐藏</h4><h4 id="1-利用-position-和-盒模型-将元素移出可视区范围"><a href="#1-利用-position-和-盒模型-将元素移出可视区范围" class="headerlink" title="1.利用 position 和 盒模型 将元素移出可视区范围"></a>1.利用 <code>position</code> 和 盒模型 将元素移出可视区范围</h4><ol>
149
- <li><p>设置 <code>posoition</code> 为 <code>absolute</code> 或 <code>fixed</code>,�通过设置 <code>top</code>、<code>left</code> 等值,将其移出可视区域。(可视区域不占位)</p>
150
- <p> position:absolute;<br> left: -99999px;</p>
151
- </li>
152
- <li><p>设置 <code>position</code> 为 <code>relative</code>,通过设置 <code>top</code>、<code>left</code> 等值,将其移出可视区域。(可视区域占位)</p>
153
- <p> position: relative;<br> left: -99999px;</p>
154
- </li>
155
- </ol>
156
- <p>如希望其在可视区域不占位置,需同时设置 <code>height: 0</code>;</p>
157
- <ol>
158
- <li><p>设置 margin 值,将其移出可视区域范围(可视区域占位)。</p>
159
- <p> margin-left: -99999px;</p>
160
- </li>
161
- </ol>
162
- <p>如果希望其在可视区域不占位,需同时设置 <code>height: 0</code>;</p>
163
- <h4 id="2-利用-transfrom"><a href="#2-利用-transfrom" class="headerlink" title="2.利用 transfrom"></a>2.利用 transfrom</h4><ol>
164
- <li><p>缩放</p>
165
- <p> transform: scale(0);</p>
166
- </li>
167
- <li><p>移动 <code>translateX</code>, <code>translateY</code></p>
168
- <p> transform: translateX(-99999px);</p>
169
- </li>
170
- <li><p>旋转 <code>rotate</code></p>
171
- <p> transform: rotateY(90deg);</p>
172
- </li>
173
- </ol>
174
- <h4 id="3-设置其大小为0"><a href="#3-设置其大小为0" class="headerlink" title="3.设置其大小为0"></a>3.设置其大小为0</h4><p>宽高为0,字体大小为0:</p>
175
- <pre><code>height: 0;
176
- width: 0;
177
- font-size: 0;
178
- </code></pre>
179
- <p>宽高为0,超出隐藏:</p>
180
- <pre><code>height: 0;
181
- width: 0;
182
- overflow: hidden;
183
- </code></pre>
184
- <h4 id="4-设置透明度为0"><a href="#4-设置透明度为0" class="headerlink" title="4.设置透明度为0"></a>4.设置透明度为0</h4><pre><code>opacity: 0;
185
- </code></pre>
186
- <h4 id="5-visibility属性"><a href="#5-visibility属性" class="headerlink" title="5.visibility属性"></a>5.<code>visibility</code>属性</h4><pre><code>visibility: hidden
187
- </code></pre>
188
- <h4 id="6-层级覆盖,z-index-属性"><a href="#6-层级覆盖,z-index-属性" class="headerlink" title="6.层级覆盖,z-index 属性"></a>6.层级覆盖,<code>z-index</code> 属性</h4><pre><code>position: relative;
189
- z-index: -999;
190
- </code></pre>
191
- <p>再设置一个层级较高的元素覆盖在此元素上。</p>
192
- <h4 id="7-clip-path-裁剪"><a href="#7-clip-path-裁剪" class="headerlink" title="7.clip-path 裁剪"></a>7.clip-path 裁剪</h4><pre><code>clip-path: polygon(0 0, 0 0, 0 0, 0 0);
193
- </code></pre>
194
- <h4 id="语义上的隐藏"><a href="#语义上的隐藏" class="headerlink" title="语义上的隐藏"></a>语义上的隐藏</h4><h4 id="aria-hidden-属性"><a href="#aria-hidden-属性" class="headerlink" title="aria-hidden 属性"></a>aria-hidden 属性</h4><p>读屏软件不可读,占据空间,可见。</p>
195
- <pre><code>&lt;divaria-hidden=&quot;true&quot;&gt;
196
- &lt;/div&gt;
197
- </code></pre>
198
- <h4 id="11-使用JS将元素从页面中移除"><a href="#11-使用JS将元素从页面中移除" class="headerlink" title="11. 使用JS将元素从页面中移除"></a>11. 使用JS将元素从页面中移除</h4><blockquote>
199
- <p><a target="_blank" rel="noopener" href="https://github.com/YvetteLau/Step-By-Step/issues/19">点击查看更多</a></p>
200
- </blockquote>
201
- <h3 id="13-浏览器事件代理机制的原理是什么?"><a href="#13-浏览器事件代理机制的原理是什么?" class="headerlink" title="13.浏览器事件代理机制的原理是什么?"></a>13.浏览器事件代理机制的原理是什么?</h3><h4 id="事件流"><a href="#事件流" class="headerlink" title="事件流"></a>事件流</h4><p>在说浏览器事件代理机制原理之前,我们首先了解一下事件流的概念,早期浏览器,IE采用的是事件捕获事件流,而Netscape采用的则是事件冒泡。”DOM2级事件”把事件流分为三个阶段,捕获阶段、目标阶段、冒泡阶段。现代浏览器也都遵循此规范。</p>
202
- <p><a target="_blank" rel="noopener" href="https://camo.githubusercontent.com/abf7097bb936da3047debae1fd877cda1a69c1a5/68747470733a2f2f6d2e333630627579696d672e636f6d2f6e6a6d6f62696c65636d732f6a66732f74312f33323432392f33362f31333730312f37333438302f35636261613262344563613136613161632f646164376464333738316139636634372e6a7067"><img src="https://camo.githubusercontent.com/abf7097bb936da3047debae1fd877cda1a69c1a5/68747470733a2f2f6d2e333630627579696d672e636f6d2f6e6a6d6f62696c65636d732f6a66732f74312f33323432392f33362f31333730312f37333438302f35636261613262344563613136613161632f646164376464333738316139636634372e6a7067" alt="xuehuayu.cn"></a></p>
203
- <h4 id="事件代理机制的原理"><a href="#事件代理机制的原理" class="headerlink" title="事件代理机制的原理"></a>事件代理机制的原理</h4><p>事件代理又称为事件委托,在祖先级 DOM 元素绑定一个事件,当触发子孙级DOM元素的事件时,利用事件冒泡的原理来触发绑定在祖先级 DOM 的事件。因为事件会从目标元素一层层冒泡至 document 对象。</p>
204
- <h4 id="为什么要事件代理?"><a href="#为什么要事件代理?" class="headerlink" title="为什么要事件代理?"></a>为什么要事件代理?</h4><ol>
205
- <li><p>添加到页面上的事件数量会影响页面的运行性能,如果添加的事件过多,会导致网页的性能下降。采用事件代理的方式,可以大大减少注册事件的个数。</p>
206
- </li>
207
- <li><p>事件代理的当时,某个子孙元素是动态增加的,不需要再次对其进行事件绑定。</p>
208
- </li>
209
- <li><p>不用担心某个注册了事件的DOM元素被移除后,可能无法回收其事件处理程序,我们只要把事件处理程序委托给更高层级的元素,就可以避免此问题。</p>
210
- </li>
211
- <li><p>允许给一个事件注册多个监听。</p>
212
- </li>
213
- <li><p>提供了一种更精细的手段控制 <code>listener</code> 的触发阶段(可以选择捕获或者是冒泡)。</p>
214
- </li>
215
- <li><p>对任何 <code>DOM</code> 元素都是有效的,而不仅仅是对 <code>HTML</code> 元素有效。</p>
216
- </li>
217
- </ol>
218
- <h4 id="addEventListener"><a href="#addEventListener" class="headerlink" title="addEventListener"></a>addEventListener</h4><p>addEventListener 接受3个参数,分别是要处理的事件名、实现了 EventListener 接口的对象或者是一个函数、一个对象&#x2F;一个布尔值。</p>
219
- <pre><code>target.addEventListener(type, listener[, options]);
220
- target.addEventListener(type, listener[, useCapture]);
221
- </code></pre>
222
- <p><strong>options(对象) | 可选</strong></p>
223
- <ul>
224
- <li><p>capture: <code>Boolean</code>。true 表示在捕获阶段触发,false表示在冒泡阶段触发。默认是 false。</p>
225
- </li>
226
- <li><p>once:<code>Boolean</code>。true 表示listener 在添加之后最多只调用一次,listener 会在其被调用之后自动移除。默认是 false。</p>
227
- </li>
228
- <li><p>passive: <code>Boolean</code>。true 表示 listener 永远不会调用 <code>preventDefault()</code>。如果 listener 仍然调用了这个函数,客户端将会忽略它并抛出一个控制台警告。默认是 false。</p>
229
- </li>
230
- </ul>
231
- <p><strong>useCapture(Boolean) | 可选</strong></p>
232
- <p><code>useCapture</code> 默认为 false。表示冒泡阶段调用事件处理程序,若设置为 true,表示在捕获阶段调用事件处理程序。</p>
233
- <blockquote>
234
- <p>如将页面中的所有click事件都代理到document上:</p>
235
- </blockquote>
236
- <pre><code>document.addEventListener(&#39;click&#39;, function (e) &#123;
237
- console.log(e.target);
238
- /** * 捕获阶段调用调用事件处理程序,eventPhase是 1; * 处于目标,eventPhase是2 * 冒泡阶段调用事件处理程序,eventPhase是 3;*/console.log(e.eventPhase);
239
-
240
- &#125;, false);
241
- </code></pre>
242
- <p>与 <code>addEventListener</code> 相对应的是 <code>removeEventListener</code>,用于移除事件监听。</p>
243
- <blockquote>
244
- <p><a target="_blank" rel="noopener" href="https://github.com/YvetteLau/Step-By-Step/issues/20">点击查看更多</a></p>
245
- </blockquote>
246
- <h3 id="14-setTimeout-倒计时为什么会出现误差?"><a href="#14-setTimeout-倒计时为什么会出现误差?" class="headerlink" title="14. setTimeout 倒计时为什么会出现误差?"></a>14. setTimeout 倒计时为什么会出现误差?</h3><p><code>setTimeout</code> 只能保证延时或间隔不小于设定的时间。因为它实际上只是将回调添加到了宏任务队列中,但是如果主线程上有任务还没有执行完成,它必须要等待。</p>
247
- <p>如果你对前面这句话不是非常理解,那么有必要了解一下 JS的运行机制。</p>
248
- <h4 id="JS的运行机制"><a href="#JS的运行机制" class="headerlink" title="JS的运行机制"></a>JS的运行机制</h4><p>(1)所有同步任务都在主线程上执行,形成一个执行栈(execution context stack)。</p>
249
- <p>(2)主线程之外,还存在”任务队列”(task queue)。</p>
250
- <p>(3)一旦”执行栈”中的所有同步任务执行完毕,系统就会读取”任务队列”,看看里面有哪些事件。那些对应的异步任务,于是结束等待状态,进入执行栈,开始执行。</p>
251
- <p>(4)主线程不断重复上面的第三步。</p>
252
- <p>如 <code>setTimeout(()=&gt;&#123;callback();&#125;, 1000)</code> ,即表示在1s之后将 <code>callback</code> 放到宏任务队列中,当1s的时间到达时,如果主线程上有其它任务在执行,那么 <code>callback</code> 就必须要等待,另外 <code>callback</code> 的执行也需要时间,因此 <code>setTimeout</code> 的时间间隔是有误差的,它只能保证延时不小于设置的时间。</p>
253
- <h4 id="如何减少-setTimeout-的误差"><a href="#如何减少-setTimeout-的误差" class="headerlink" title="如何减少 setTimeout 的误差"></a>如何减少 <code>setTimeout</code> 的误差</h4><p>我们只能减少执行多次的 <code>setTimeout</code> 的误差,例如倒计时功能。</p>
254
- <p>倒计时的时间通常都是从服务端获取的。造成误差的原因:</p>
255
- <p>1.没有考虑误差时间(函数执行的时间&#x2F;其它代码的阻塞)</p>
256
- <p>2.没有考虑浏览器的“休眠”</p>
257
- <p>完全消除 <code>setTimeout</code>的误差是不可能的,但是我们减少 <code>setTimeout</code> 的误差。通过对下一次任务的调用时间进行修正,来减少误差。</p>
258
- <pre><code>let count =0;
259
- let countdown =5000; //服务器返回的倒计时时间let interval =1000;
260
- let startTime =newDate().getTime();
261
- let timer =setTimeout(countDownStart, interval); //首次执行//定时器测试functioncountDownStart() &#123;
262
- count++;
263
- constoffset=newDate().getTime() - (startTime + count *1000);
264
- constnextInterval= interval - offset; //修正后的延时时间if (nextInterval &lt;0) &#123;
265
- nextInterval =0;
266
- &#125;
267
- countdown -= interval;
268
- console.log(&quot;误差:&quot;+ offset +&quot;ms,下一次执行:&quot;+ nextInterval +&quot;ms后,离活动开始还有:&quot;+ countdown +&quot;ms&quot;);
269
- if (countdown &lt;=0) &#123;
270
- clearTimeout(timer);
271
- &#125; else &#123;
272
- timer =setTimeout(countDownStart, nextInterval);
273
- &#125;
274
- &#125;
275
- </code></pre>
276
- <p>如果当前页面是不可见的,那么倒计时会出现大于100ms的误差时间。因此在页面显示时,应该重新从服务端获取剩余时间进行倒计时。当然,为了更好的性能,当倒计时不可见(Tab页切换&#x2F;倒计时内容不在可视区时),可以选择停止倒计时。</p>
277
- <p>为此,我们可以监听 <code>visibityChange</code> 事件进行处理。</p>
278
- <blockquote>
279
- <p><a target="_blank" rel="noopener" href="https://github.com/YvetteLau/Step-By-Step/issues/21">点击查看更多</a></p>
280
- </blockquote>
281
- <h3 id="参考文章:"><a href="#参考文章:" class="headerlink" title="参考文章:"></a>参考文章:</h3><p>[1] <a target="_blank" rel="noopener" href="https://developer.mozilla.org/zh-CN/docs/Web/API/EventTarget/addEventListener">MDN addEventListener</a></p>
282
- <p>[2] <a target="_blank" rel="noopener" href="https://www.ecma-international.org/ecma-262/6.0/#sec-completion-record-specification-type">https://www.ecma-international.org/ecma-262/6.0/#sec-completion-record-specification-type</a></p>
283
- <p>[3] <a target="_blank" rel="noopener" href="http://www.xuanfengge.com/js-realizes-precise-countdown.html">http://www.xuanfengge.com/js-realizes-precise-countdown.html</a></p>
284
- <p>谢谢各位小伙伴愿意花费宝贵的时间阅读本文,如果本文给了您一点帮助或者是启发,请不要吝啬你的赞和Star,您的肯定是我前进的最大动力。<a target="_blank" rel="noopener" href="https://github.com/YvetteLau/Blog">https://github.com/YvetteLau/Blog</a></p>
285
- </div><div><ul class="post-copyright"><li class="post-copyright-author"><strong>本文作者:</strong>雪花雨</li><li class="post-copyright-link"><strong>本文链接:</strong><a href="/article/38359.html">https://xuehuayu.cn/article/38359.html</a></li><li class="post-copyright-license"><strong>版权声明:</strong>① 标为原创的文章为博主原创,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接。② 转载文章来自网络,已标明出处,<a href="mailto:cainiaoblog@126.com">侵删</a>。</li></ul></div><br><div class="tags"><a href="/tags/%E8%BD%AC%E8%BD%BD/">转载</a></div><div class="post-nav"><a class="pre" href="/article/22422.html">高频面试题深入解析/ 周刊 04</a><a class="next" href="/article/21782.html">高频面试题深入解析/ 周刊 02</a></div><div id="vcomment"></div><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@waline/client@v2/dist/waline.min.css"><script src="//cdn.jsdelivr.net/npm/@waline/client@v2/dist/waline.js"></script><script>const origin = window.location.origin
286
- const serverURL = origin.includes('cainiaoblog') ? 'https://cmts.cainiaoblog.cn' : 'https://cmts.xuehuayu.cn'
287
- const locale = {
288
- placeholder: '请正确填写昵称和邮箱,方便接收回复通知~',
289
- sofa: '沙发空缺中,还不快抢~',
290
- };
291
- Waline.init({
292
- el: '#vcomment',
293
- serverURL: serverURL,
294
- pageSize: '20',
295
- visitor: true, // 阅读量统计
296
- requiredMeta: ['nick', 'mail'],
297
- emoji: [
298
- 'https://cdn.jsdelivr.net/gh/walinejs/emojis@1.0.0/weibo',
299
- 'https://cdn.jsdelivr.net/gh/walinejs/emojis@1.0.0/qq',
300
- 'https://cdn.jsdelivr.net/gh/walinejs/emojis@1.0.0/tw-emoji',
301
- ],
302
- locale,
303
- pageview: true
304
- })
305
- </script></div></div></div><div class="pure-u-1 pure-u-md-1-4 fixed-search hidden_mid_and_down"><div id="sidebar"><script type="text/javascript" src="//cdn.jsdelivr.net/npm/cainiaoblog@latest/js/search.min.js"></script><div class="widget"><div class="widget-search"><input class="search" type="radio" name="search" value="baidu" id="baidu" checked="checked"/><label class="label" for="baidu" title="百度全站搜索">百度</label><input class="search" type="radio" name="search" value="google" id="google"/><label class="label" for="google" title="谷歌全站搜索">谷歌</label><input class="search" type="radio" name="search" value="self" id="self"/><label class="label" for="self" title="使用站内搜索">站内</label></div><div class="widget" id="search"><form class="search-form" action="//www.baidu.com/baidu" method="get" accept-charset="utf-8" target="_blank"><input type="search" name="word" maxlength="30" placeholder="百度全站搜索"/><input type="hidden" name="si" value="xuehuayu.cn"/><input type="hidden" name="cl" value="3"/><input type="hidden" name="ct" value="2097152"/><input type="hidden" name="s" value="on"/><input class="search-submit" type="submit" value=""/></form></div></div><script>$('input[type=radio][name=search]').change(function() {
306
- var val = $(this).val()
307
- var self = '<div class="search-form"><input id="local-search-input" placeholder="站内搜索,首次慢" type="search" name="q" results="0"><input class="search-submit" type="submit" value=""/><div id="local-search-result"></div></div>'
308
- var google = '<form class="search-form" action="//www.google.com/search" method="get" accept-charset="utf-8" target="_blank"><input type="search" name="q" maxlength="30" placeholder="谷歌全站搜索"><input type="hidden" name="sitesearch" value="xuehuayu.cn"><input class="search-submit" type="submit" value=""/></form>'
309
- var baidu = '<form class="search-form" action="//www.baidu.com/baidu" method="get" accept-charset="utf-8" target="_blank"><input type="search" name="word" maxlength="30" placeholder="百度全站搜索"><input type="hidden" name="si" value="xuehuayu.cn"><input type="hidden" name="cl" value="3"><input type="hidden" name="ct" value="2097152"><input type="hidden" name="s" value="on"><input class="search-submit" type="submit" value=""/></form>'
310
-
311
- if (val === 'self') {
312
- $('#search').html(self)
313
- var search_path = 'search.xml';
314
- if (search_path.length == 0) {
315
- search_path = 'search.xml';
316
- }
317
- var path = 'https://cdn.staticaly.com/gh/npljy/npljy.github.io/main/' + search_path;
318
- searchFunc(path, 'local-search-input', 'local-search-result');
319
- } else if (val === 'baidu') {
320
- $('#search').html(baidu)
321
- } else if (val === 'google') {
322
- $('#search').html(google)
323
- }
324
- })</script><div class="widget widget-wxmp"><img alt="微信公众号" width="100%" src="//cdn.staticaly.com/gh/npljy/npljy.github.io/main/img/mp-mini.jpg"/></div><div class="widget widget-categories"><div class="widget-title"><i class="fa fa-folder-o"> 分类</i></div><ul class="category-list"><li class="category-list-item"><a class="category-list-link" href="/categories/CDN/">CDN</a><span class="category-list-count">2</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/IDE/">IDE</a><span class="category-list-count">1</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/git/">git</a><span class="category-list-count">2</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/hexo/">hexo</a><span class="category-list-count">1</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E5%85%AC%E5%85%B1%E8%8A%82%E6%97%A5/">公共节日</a><span class="category-list-count">1</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E5%88%86%E4%BA%AB/">分享</a><span class="category-list-count">29</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E5%89%8D%E7%AB%AF/">前端</a><span class="category-list-count">190</span><ul class="category-list-child"><li class="category-list-item"><a class="category-list-link" href="/categories/%E5%89%8D%E7%AB%AF/%E6%B5%8F%E8%A7%88%E5%99%A8/">浏览器</a><span class="category-list-count">1</span><ul class="category-list-child"><li class="category-list-item"><a class="category-list-link" href="/categories/%E5%89%8D%E7%AB%AF/%E6%B5%8F%E8%A7%88%E5%99%A8/%E7%BD%91%E7%BB%9C%E5%8D%8F%E8%AE%AE/">网络协议</a><span class="category-list-count">1</span></li></ul></li></ul></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E5%8D%9A%E5%AE%A2/">博客</a><span class="category-list-count">3</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E5%B7%A5%E5%85%B7/">工具</a><span class="category-list-count">2</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E5%B9%BF%E5%91%8A%E8%BF%87%E6%BB%A4/">广告过滤</a><span class="category-list-count">8</span><ul class="category-list-child"><li class="category-list-item"><a class="category-list-link" href="/categories/%E5%B9%BF%E5%91%8A%E8%BF%87%E6%BB%A4/%E5%BD%B1%E8%A7%86%E7%94%B5%E8%A7%86%E5%B0%8F%E8%AF%B4%E6%BC%AB%E7%94%BB%E8%B5%84%E8%AE%AF%E9%9F%B3%E4%B9%90/">影视电视小说漫画资讯音乐</a><span class="category-list-count">1</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E5%B9%BF%E5%91%8A%E8%BF%87%E6%BB%A4/%E8%A7%86%E9%A2%91%E7%94%B5%E8%A7%86%E5%B0%8F%E8%AF%B4%E6%BC%AB%E7%94%BB%E8%B5%84%E8%AE%AF%E9%9F%B3%E4%B9%90/">视频电视小说漫画资讯音乐</a><span class="category-list-count">1</span></li></ul></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E6%AD%A3%E5%88%99/">正则</a><span class="category-list-count">5</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E6%B5%8F%E8%A7%88%E5%99%A8/">浏览器</a><span class="category-list-count">5</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E7%AE%97%E6%B3%95/">算法</a><span class="category-list-count">2</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E8%B5%84%E8%AE%AF/">资讯</a><span class="category-list-count">16</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E8%BD%BB%E6%9D%BE%E4%B8%80%E5%88%BB/">轻松一刻</a><span class="category-list-count">1</span></li></ul></div><div class="widget widget-tags"><div class="widget-title"><i class="fa fa-star-o"> 标签</i></div><div class="tagcloud"><a href="/tags/%E5%8E%9F%E5%88%9B/" style="font-size: 15px;">原创</a> <a href="/tags/%E8%BD%AC%E8%BD%BD/" style="font-size: 15px;">转载</a> <a href="/tags/%E6%89%8B%E5%86%99/" style="font-size: 15px;">手写</a> <a href="/tags/%E7%96%AB%E6%83%85/" style="font-size: 15px;">疫情</a> <a href="/tags/%E5%A8%B1%E4%B9%90/" style="font-size: 15px;">娱乐</a></div></div><div class="widget widget-recent-posts"><div class="widget-title"><i class="fa fa-file-o"> 最近文章</i></div><ul class="post-list"><li class="post-list-item"><a class="post-list-link" href="/article/9c3c56c.html">vue、react、webpack、babel</a></li><li class="post-list-item"><a class="post-list-link" href="/article/84c9ccd6.html">精读《SolidJS》</a></li><li class="post-list-item"><a class="post-list-link" href="/article/53803e6.html">git提交注释规范</a></li><li class="post-list-item"><a class="post-list-link" href="/article/a4145266.html">前端数组拍平flat一行代码</a></li><li class="post-list-item"><a class="post-list-link" href="/article/bedea419.html">一道前端this面试题</a></li><li class="post-list-item"><a class="post-list-link" href="/article/bf7e7421.html">git多账号配置</a></li></ul></div><div class="widget widget-links"><div class="widget-title"><i class="fa fa-external-link"> 友情链接</i></div><ul></ul><a href="https://github.com/npljy?utm_source=xuehuayu.cn" title="GitHub" target="_blank">GitHub</a><ul></ul><a href="https://laonongmin.online?utm_source=xuehuayu.cn" title="看看" target="_blank">看看</a><ul></ul><a href="https://cainiaoblog.cn?utm_source=xuehuayu.cn" title="菜鸟博客" target="_blank">菜鸟博客</a><ul></ul><a href="mailto:cainiaoblog@126.com" title="友链联系" target="_blank">友链联系</a></div></div></div><div class="pure-u-1 pure-u-md-3-4"><div id="footer"><div class="flex-block justify-center align-center flex-wrap"><a class="gxba-link" id="gxba" rel="nofollow" target="_blank" href="http://beian.miit.gov.cn/">京ICP备20007647号-2</a><a class="gaba-link" id="gaba-link" rel="nofollow" target="_blank" href="http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=11010802031264"><img class="nofancybox" src="//cdn.staticaly.com/gh/npljy/npljy.github.io/main/img/gaba.png" alt=""/><span id="gaba">京公网安备 11010802031264号</span><span style="padding-right: 10px;"></span></a><span>Copyright © 2023 </span><a href="/." rel="nofollow">前端壹菜鸟. </a><script>(function(){
325
- var cnb =window.location.origin.indexOf('cainiaoblog') !==-1
326
- if (cnb) {
327
- var gxba =document.getElementById('gxba')
328
- var gaba =document.getElementById('gaba')
329
- var gabaLink =document.getElementById('gaba-link')
330
- gxba.innerText ='京ICP备20007647号-1'
331
- gaba.innerText ='京公网安备 11010802031254号'
332
- gabaLink.setAttribute('href','http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=11010802031254')
333
- }
334
- })()</script></div><div class="flex-block justify-center align-center flex-wrap"><a rel="nofollow" target="_blank" href="https://v6.51.la/s/Guz3lwHCsVme9Cu"><div class="busuanzi_container" id="busuanzi_container"><span class="busuanzi_container_site_pv" id="busuanzi_container_site_pv">访问量:<span id="busuanzi_value_site_pv"><i class="fa fa-spinner"></i></span></span><span class="busuanzi_container_site_uv" id="busuanzi_container_site_uv">访客数:<span id="busuanzi_value_site_uv"><i class="fa fa-spinner"></i></span></span><span style="padding-right: 10px;"></span></div></a><a rel="nofollow" target="_blank" href="https://www.upyun.com/?utm_source=lianmeng&amp;utm_medium=referral"><span style="font-weight:bold;letter-spacing: 1px;">本网站由 </span><img class="nofancybox" height="32" style="vertical-align: middle" src="//cdn.staticaly.com/gh/npljy/npljy.github.io/main/img/upy_logo.min.svg" alt=""/><span style="font-weight:bold;letter-spacing: 1px;">提供CDN加速/云存储服务</span></a><span style="padding-right: 10px;"></span><a rel="nofollow" style="font-size:18px;font-weight:bold;vertical-align: middle" target="_blank" title="注册就送代金券可直接使用" href="https://console.upyun.com/register/?invite=HyDsjZHIL">注册</a></div></div></div></div><a class="show" id="rocket" href="#top"></a><div class="darkmode-toggle">🌓</div><script type="text/javascript" src="//cdn.jsdelivr.net/npm/cainiaoblog@latest/js/totop.min.js" async></script><script type="text/javascript" src="//cdn.jsdelivr.net/npm/cainiaoblog@latest/js/dark.min.js" async></script><script type="text/javascript" src="//cdn.jsdelivr.net/npm/cainiaoblog@latest/js/codeblock-resizer.min.js"></script><script type="text/javascript" src="//cdn.jsdelivr.net/npm/cainiaoblog@latest/js/smartresize.min.js"></script></div></body></html>