js原生工具库

  1. 1isStatic:检测数据是不是除了symbol外的原始数据
  2. */
  3. function isStatic(value) {
  4. return(
  5. typeof value === 'string' ||
  6. typeof value === 'number' ||
  7. typeof value === 'boolean' ||
  8. typeof value === 'undefined' ||
  9. value === null
  10. )
  11. }
  12. /**
  13. 2、isPrimitive:检测数据是不是原始数据
  14. */
  15. function isPrimitive(value) {
  16. return isStatic(value) || typeof value === 'symbol'
  17. }
  18. /**
  19. 3、isObject:判断数据是不是引用类型的数据 (例如: arrays, functions, objects, regexes, new Number(0),以及 new String(''))
  20. */
  21. function isObject(value) {
  22. let type = typeof value;
  23. return value != null && (type == 'object' || type == 'function');
  24. }
  25. /**
  26. 4、isObjectLike:检查 value 是否是 类对象。 如果一个值是类对象,那么它不应该是 null,而且 typeof 后的结果是 "object"
  27. */
  28. function isObjectLike(value) {
  29. return value != null && typeof value == 'object';
  30. }
  31. /*
  32. 5、getRawType:获取数据类型,返回结果为 Number、String、Object、Array等
  33. */
  34. function getRawType(value) {
  35. return Object.prototype.toString.call(value).slice(8, -1)
  36. }
  37. //getoRawType([]) ==> Array
  38. /**
  39. 6、isPlainObject:判断数据是不是Object类型的数据
  40. */
  41. function isPlainObject(obj) {
  42. return Object.prototype.toString.call(obj) === '[object Object]'
  43. }
  44. /**
  45. 7、isArray:判断数据是不是数组类型的数据
  46. */
  47. function isArray(arr) {
  48. return Object.prototype.toString.call(arr) === '[object Array]'
  49. }
  50. /*
  51. 将isArray挂载到Array上
  52. * */
  53. Array.isArray = Array.isArray || isArray;
  54. /**
  55. 8、isRegExp:判断数据是不是正则对象
  56. */
  57. function isRegExp(value) {
  58. return Object.prototype.toString.call(value) === '[object RegExp]'
  59. }
  60. /**
  61. 9、isDate:判断数据是不是时间对象
  62. */
  63. function isDate(value) {
  64. return Object.prototype.toString.call(value) === '[object Date]'
  65. }
  66. /*
  67. 10、isNative:判断 value 是不是浏览器内置函数
  68. 内置函数toString后的主体代码块为 [native code] ,而非内置函数则为相关代码,所以非内置函数可以进行拷贝(toString后掐头去尾再由Function转)
  69. * */
  70. function isNative(value) {
  71. return typeof value === 'function' && /native code/.test(value.toString())
  72. }
  73. /*
  74. 11、isFunction:检查 value 是不是函数
  75. * */
  76. function isFunction(value) {
  77. return Object.prototype.toString.call(value) === '[object Function]'
  78. }
  79. /*
  80. 12、isLength:检查 value 是否为有效的类数组长度。
  81. * */
  82. function isLength(value) {
  83. return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= Number.MAX_SAFE_INTEGER;
  84. }
  85. /*
  86. 13、isArrayLike:检查 value 是否是类数组。
  87. 如果一个值被认为是类数组,那么它不是一个函数,并且value.length是个整数,大于等于 0,小于或等于 Number.MAX_SAFE_INTEGER。
  88. 这里字符串也将被当作类数组
  89. * */
  90. function isArrayLike(value) {
  91. return value != null && isLength(value.length) && !isFunction(value);
  92. }
  93. /*
  94. 14、isEmpty:检查 value 是否为空
  95. 如果是null,直接返回true;如果是类数组,判断数据长度;如果是Object对象,判断是否具有属性;如果是其他数据,直接返回false(也可改为返回true)
  96. * */
  97. function isEmpty(value) {
  98. if (value == null) {
  99. return true;
  100. }
  101. if (isArrayLike(value)) {
  102. return !value.length;
  103. }else if(isPlainObject(value)){
  104. for (let key in value) {
  105. if (hasOwnProperty.call(value, key)) {
  106. return false;
  107. }
  108. }
  109. return true;
  110. }
  111. return false;
  112. }
  113. /**
  114. 15、cached:记忆函数:缓存函数的运算结果。
  115. */
  116. function cached(fn) {
  117. let cache = Object.create(null);
  118. return function cachedFn(str) {
  119. let hit = cache[str];
  120. return hit || (cache[str] = fn(str))
  121. }
  122. }
  123. /*
  124. 16、camelize:横线转驼峰命名
  125. * */
  126. let camelizeRE = /-(\w)/g;
  127. function camelize(str) {
  128. return str.replace(camelizeRE, function(_, c) {
  129. return c ? c.toUpperCase() : '';
  130. })
  131. }
  132. //ab-cd-ef ==> abCdEf
  133. //使用记忆函数
  134. let _camelize = cached(camelize)
  135. /**
  136. 17、hyphenate:驼峰命名转横线命名:拆分字符串,使用 - 相连,并且转换为小写
  137. */
  138. let hyphenateRE = /\B([A-Z])/g;
  139. function hyphenate(str){
  140. return str.replace(hyphenateRE, '-$1').toLowerCase()
  141. }
  142. //abCd ==> ab-cd
  143. //使用记忆函数
  144. let _hyphenate = cached(hyphenate);
  145. /**
  146. 18、capitalize:字符串首位大写
  147. */
  148. function capitalize(str){
  149. return str.charAt(0).toUpperCase() + str.slice(1)
  150. }
  151. // abc ==> Abc
  152. //使用记忆函数
  153. let _capitalize = cached(capitalize)
  154. /**
  155. 19、extend:将属性混合到目标对象中
  156. */
  157. function extend(to, _from) {
  158. for(let key in _from) {
  159. to[key] = _from[key];
  160. }
  161. return to
  162. }
  163. /*
  164. 20、Object.assign:对象属性复制,浅拷贝
  165. * */
  166. Object.assign = Object.assign || function(){
  167. if(arguments.length == 0) throw new TypeError('Cannot convert undefined or null to object');
  168. let target = arguments[0],
  169. args = Array.prototype.slice.call(arguments, 1),
  170. key
  171. args.forEach(function(item){
  172. for(key in item){
  173. item.hasOwnProperty(key) && ( target[key] = item[key] )
  174. }
  175. })
  176. return target
  177. }
  178. /*
  179. 使用Object.assign可以浅克隆一个对象:let clone = Object.assign({}, target)
  180. 简单的深克隆可以使用JSON.parse()和JSON.stringify(),这两个api是解析json数据的,所以只能解析除symbol外的原始类型及数组和对象
  181. let clone = JSON.parse( JSON.stringify(target) )
  182. * */
  183. /*
  184. 21、clone:克隆数据,可深度克隆
  185. 这里列出了原始类型,时间、正则、错误、数组、对象的克隆规则,其他的可自行补充
  186. * */
  187. function clone(value, deep){
  188. if(isPrimitive(value)){
  189. return value
  190. }
  191. if (isArrayLike(value)) { //是类数组
  192. value = Array.prototype.slice.call(value)
  193. return value.map(item => deep ? clone(item, deep) : item)
  194. }else if(isPlainObject(value)){ //是对象
  195. let target = {}, key;
  196. for (key in value) {
  197. value.hasOwnProperty(key) && ( target[key] = deep ? clone(value[key], deep) : value[key] )
  198. }
  199. }
  200. let type = getRawType(value)
  201. switch(type){
  202. case 'Date':
  203. case 'RegExp':
  204. case 'Error': value = new window[type](value); break;
  205. }
  206. return value
  207. }
  208. /*
  209. 22、识别各种浏览器及平台
  210. * */
  211. //运行环境是浏览器
  212. let inBrowser = typeof window !== 'undefined';
  213. //运行环境是微信
  214. let inWeex = typeof WXEnvironment !== 'undefined' && !!WXEnvironment.platform;
  215. let weexPlatform = inWeex && WXEnvironment.platform.toLowerCase();
  216. //浏览器 UA 判断
  217. let UA = inBrowser && window.navigator.userAgent.toLowerCase();
  218. let isIE = UA && /msie|trident/.test(UA);
  219. let isIE9 = UA && UA.indexOf('msie 9.0') > 0;
  220. let isEdge = UA && UA.indexOf('edge/') > 0;
  221. let isAndroid = (UA && UA.indexOf('android') > 0) || (weexPlatform === 'android');
  222. let isIOS = (UA && /iphone|ipad|ipod|ios/.test(UA)) || (weexPlatform === 'ios');
  223. let isChrome = UA && /chrome\/\d+/.test(UA) && !isEdge;
  224. /*
  225. 23、getExplorerInfo:获取浏览器信息
  226. * */
  227. function getExplorerInfo() {
  228. let t = navigator.userAgent.toLowerCase();
  229. return 0 <= t.indexOf("msie") ? { //ie < 11
  230. type: "IE",
  231. version: Number(t.match(/msie ([\d]+)/)[1])
  232. } : !!t.match(/trident\/.+?rv:(([\d.]+))/) ? { // ie 11
  233. type: "IE",
  234. version: 11
  235. } : 0 <= t.indexOf("edge") ? {
  236. type: "Edge",
  237. version: Number(t.match(/edge\/([\d]+)/)[1])
  238. } : 0 <= t.indexOf("firefox") ? {
  239. type: "Firefox",
  240. version: Number(t.match(/firefox\/([\d]+)/)[1])
  241. } : 0 <= t.indexOf("chrome") ? {
  242. type: "Chrome",
  243. version: Number(t.match(/chrome\/([\d]+)/)[1])
  244. } : 0 <= t.indexOf("opera") ? {
  245. type: "Opera",
  246. version: Number(t.match(/opera.([\d]+)/)[1])
  247. } : 0 <= t.indexOf("Safari") ? {
  248. type: "Safari",
  249. version: Number(t.match(/version\/([\d]+)/)[1])
  250. } : {
  251. type: t,
  252. version: -1
  253. }
  254. }
  255. /*
  256. 24、isPCBroswer:检测是否为PC端浏览器模式
  257. * */
  258. function isPCBroswer() {
  259. let e = navigator.userAgent.toLowerCase()
  260. , t = "ipad" == e.match(/ipad/i)
  261. , i = "iphone" == e.match(/iphone/i)
  262. , r = "midp" == e.match(/midp/i)
  263. , n = "rv:1.2.3.4" == e.match(/rv:1.2.3.4/i)
  264. , a = "ucweb" == e.match(/ucweb/i)
  265. , o = "android" == e.match(/android/i)
  266. , s = "windows ce" == e.match(/windows ce/i)
  267. , l = "windows mobile" == e.match(/windows mobile/i);
  268. return !(t || i || r || n || a || o || s || l)
  269. }
  270. /*
  271. 25、unique:数组去重,返回一个新数组
  272. * */
  273. function unique(arr){
  274. if(!isArrayLink(arr)){ //不是类数组对象
  275. return arr
  276. }
  277. let result = []
  278. let objarr = []
  279. let obj = Object.create(null)
  280. arr.forEach(item => {
  281. if(isStatic(item)){//是除了symbol外的原始数据
  282. let key = item + '_' + getRawType(item);
  283. if(!obj[key]){
  284. obj[key] = true
  285. result.push(item)
  286. }
  287. }else{//引用类型及symbol
  288. if(!objarr.includes(item)){
  289. objarr.push(item)
  290. result.push(item)
  291. }
  292. }
  293. })
  294. return resulte
  295. }
  296. /*
  297. 26、Set简单实现
  298. * */
  299. window.Set = window.Set || (function () {
  300. function Set(arr) {
  301. this.items = arr ? unique(arr) : [];
  302. this.size = this.items.length; // Array的大小
  303. }
  304. Set.prototype = {
  305. add: function (value) {
  306. // 添加元素,若元素已存在,则跳过,返回 Set 结构本身。
  307. if (!this.has(value)) {
  308. this.items.push(value);
  309. this.size++;
  310. }
  311. return this;
  312. },
  313. clear: function () {
  314. //清除所有成员,没有返回值。
  315. this.items = []
  316. this.size = 0
  317. },
  318. delete: function (value) {
  319. //删除某个值,返回一个布尔值,表示删除是否成功。
  320. return this.items.some((v, i) => {
  321. if(v === value){
  322. this.items.splice(i,1)
  323. return true
  324. }
  325. return false
  326. })
  327. },
  328. has: function (value) {
  329. //返回一个布尔值,表示该值是否为Set的成员。
  330. return this.items.some(v => v === value)
  331. },
  332. values: function () {
  333. return this.items
  334. },
  335. }
  336. return Set;
  337. }());
  338. /*
  339. 27、repeat:生成一个重复的字符串,有n个str组成,可修改为填充为数组等
  340. * */
  341. function repeat(str, n) {
  342. let res = '';
  343. while(n) {
  344. if(n % 2 === 1) {
  345. res += str;
  346. }
  347. if(n > 1) {
  348. str += str;
  349. }
  350. n >>= 1;
  351. }
  352. return res
  353. };
  354. //repeat('123',3) ==> 123123123
  355. /*
  356. 28、dateFormater:格式化时间
  357. * */
  358. function dateFormater(formater, t){
  359. let date = t ? new Date(t) : new Date(),
  360. Y = date.getFullYear() + '',
  361. M = date.getMonth() + 1,
  362. D = date.getDate(),
  363. H = date.getHours(),
  364. m = date.getMinutes(),
  365. s = date.getSeconds();
  366. return formater.replace(/YYYY|yyyy/g,Y)
  367. .replace(/YY|yy/g,Y.substr(2,2))
  368. .replace(/MM/g,(M<10?'0':'') + M)
  369. .replace(/DD/g,(D<10?'0':'') + D)
  370. .replace(/HH|hh/g,(H<10?'0':'') + H)
  371. .replace(/mm/g,(m<10?'0':'') + m)
  372. .replace(/ss/g,(s<10?'0':'') + s)
  373. }
  374. // dateFormater('YYYY-MM-DD HH:mm', t) ==> 2019-06-26 18:30
  375. // dateFormater('YYYYMMDDHHmm', t) ==> 201906261830
  376. /*
  377. 29、dateStrForma:将指定字符串由一种时间格式转化为另一种
  378. from的格式应对应str的位置
  379. * */
  380. function dateStrForma(str, from, to){
  381. //'20190626' 'YYYYMMDD' 'YYYY年MM月DD日'
  382. str += ''
  383. let Y = ''
  384. if(~(Y = from.indexOf('YYYY'))){
  385. Y = str.substr(Y, 4)
  386. to = to.replace(/YYYY|yyyy/g,Y)
  387. }else if(~(Y = from.indexOf('YY'))){
  388. Y = str.substr(Y, 2)
  389. to = to.replace(/YY|yy/g,Y)
  390. }
  391. let k,i
  392. ['M','D','H','h','m','s'].forEach(s =>{
  393. i = from.indexOf(s+s)
  394. k = ~i ? str.substr(i, 2) : ''
  395. to = to.replace(s+s, k)
  396. })
  397. return to
  398. }
  399. // dateStrForma('20190626', 'YYYYMMDD', 'YYYY年MM月DD日') ==> 2019年06月26日
  400. // dateStrForma('121220190626', '----YYYYMMDD', 'YYYY年MM月DD日') ==> 2019年06月26日
  401. // dateStrForma('2019年06月26日', 'YYYY年MM月DD日', 'YYYYMMDD') ==> 20190626
  402. // 一般的也可以使用正则来实现
  403. //'2019年06月26日'.replace(/(\d{4})年(\d{2})月(\d{2})日/, '$1-$2-$3') ==> 2019-06-26
  404. /*
  405. 30、getPropByPath:根据字符串路径获取对象属性 : 'dcjgs[0].count'
  406. * */
  407. function getPropByPath(obj, path, strict) {
  408. let tempObj = obj;
  409. path = path.replace(/\[(\w+)\]/g, '.$1'); //将[0]转化为.0
  410. path = path.replace(/^\./, ''); //去除开头的.
  411. let keyArr = path.split('.'); //根据.切割
  412. let i = 0;
  413. for (let len = keyArr.length; i < len - 1; ++i) {
  414. if (!tempObj && !strict) break;
  415. let key = keyArr[i];
  416. if (key in tempObj) {
  417. tempObj = tempObj[key];
  418. } else {
  419. if (strict) {//开启严格模式,没找到对应key值,抛出错误
  420. throw new Error('please transfer a valid prop path to form item!');
  421. }
  422. break;
  423. }
  424. }
  425. return {
  426. o: tempObj, //原始数据
  427. k: keyArr[i], //key值
  428. v: tempObj ? tempObj[keyArr[i]] : null // key值对应的值
  429. };
  430. };
  431. /*
  432. 31、GetUrlParam:获取Url参数,返回一个对象
  433. * */
  434. function GetUrlParam(){
  435. let url = document.location.toString();
  436. let arrObj = url.split("?");
  437. let params = Object.create(null)
  438. if (arrObj.length > 1){
  439. arrObj = arrObj[1].split("&");
  440. arrObj.forEach(item=>{
  441. item = item.split("=");
  442. params[item[0]] = item[1]
  443. })
  444. }
  445. return params;
  446. }
  447. // ?a=1&b=2&c=3 ==> {a: "1", b: "2", c: "3"}
  448. /*
  449. 32、downloadFile:base64数据导出文件,文件下载
  450. * */
  451. function downloadFile(filename, data){
  452. let DownloadLink = document.createElement('a');
  453. if ( DownloadLink ){
  454. document.body.appendChild(DownloadLink);
  455. DownloadLink.style = 'display: none';
  456. DownloadLink.download = filename;
  457. DownloadLink.href = data;
  458. if ( document.createEvent ){
  459. let DownloadEvt = document.createEvent('MouseEvents');
  460. DownloadEvt.initEvent('click', true, false);
  461. DownloadLink.dispatchEvent(DownloadEvt);
  462. }
  463. else if ( document.createEventObject )
  464. DownloadLink.fireEvent('onclick');
  465. else if (typeof DownloadLink.onclick == 'function' )
  466. DownloadLink.onclick();
  467. document.body.removeChild(DownloadLink);
  468. }
  469. }
  470. //33、toFullScreen:全屏
  471. function toFullScreen(){
  472. let elem = document.body;
  473. elem.webkitRequestFullScreen
  474. ? elem.webkitRequestFullScreen()
  475. : elem.mozRequestFullScreen
  476. ? elem.mozRequestFullScreen()
  477. : elem.msRequestFullscreen
  478. ? elem.msRequestFullscreen()
  479. : elem.requestFullScreen
  480. ? elem.requestFullScreen()
  481. : alert("浏览器不支持全屏");
  482. }
  483. //34、exitFullscreen:退出全屏
  484. function exitFullscreen(){
  485. let elem = parent.document;
  486. elem.webkitCancelFullScreen
  487. ? elem.webkitCancelFullScreen()
  488. : elem.mozCancelFullScreen
  489. ? elem.mozCancelFullScreen()
  490. : elem.cancelFullScreen
  491. ? elem.cancelFullScreen()
  492. : elem.msExitFullscreen
  493. ? elem.msExitFullscreen()
  494. : elem.exitFullscreen
  495. ? elem.exitFullscreen()
  496. : alert("切换失败,可尝试Esc退出");
  497. }
  498. //35、requestAnimationFrame:window动画
  499. window.requestAnimationFrame = window.requestAnimationFrame ||
  500. window.webkitRequestAnimationFrame ||
  501. window.mozRequestAnimationFrame ||
  502. window.msRequestAnimationFrame ||
  503. window.oRequestAnimationFrame ||
  504. function (callback) {
  505. //为了使setTimteout的尽可能的接近每秒60帧的效果
  506. window.setTimeout(callback, 1000 / 60);
  507. };
  508. window.cancelAnimationFrame = window.cancelAnimationFrame ||
  509. Window.webkitCancelAnimationFrame ||
  510. window.mozCancelAnimationFrame ||
  511. window.msCancelAnimationFrame ||
  512. window.oCancelAnimationFrame ||
  513. function (id) {
  514. //为了使setTimteout的尽可能的接近每秒60帧的效果
  515. window.clearTimeout(id);
  516. }
  517. /*
  518. 36、_isNaN:检查数据是否是非数字值
  519. 原生的isNaN会把参数转换成数字(valueof),而null、true、false以及长度小于等于1的数组(元素为非NaN数据)会被转换成数字,这不是我想要的
  520. Symbol类型的数据不具有valueof接口,所以isNaN会抛出错误,这里放在后面,可避免错误
  521. * */
  522. function _isNaN(v){
  523. return !(typeof v === 'string' || typeof v === 'number') || isNaN(v)
  524. }
  525. /*
  526. 37、max:求取数组中非NaN数据中的最大值
  527. * */
  528. function max(arr){
  529. arr = arr.filter(item => !_isNaN(item))
  530. return arr.length ? Math.max.apply(null, arr) : undefined
  531. }
  532. //max([1, 2, '11', null, 'fdf', []]) ==> 11
  533. /*
  534. 38、min:求取数组中非NaN数据中的最小值
  535. * */
  536. function min(arr){
  537. arr = arr.filter(item => !_isNaN(item))
  538. return arr.length ? Math.min.apply(null, arr) : undefined
  539. }
  540. //min([1, 2, '11', null, 'fdf', []]) ==> 1
  541. /*
  542. 39、random:返回一个lower - upper之间的随机数
  543. lower、upper无论正负与大小,但必须是非NaN的数据
  544. * */
  545. function random(lower, upper){
  546. lower = +lower || 0
  547. upper = +upper || 0
  548. return Math.random() * (upper - lower) + lower;
  549. }
  550. //random(0, 0.5) ==> 0.3567039135734613
  551. //random(2, 1) ===> 1.6718418553475423
  552. //random(-2, -1) ==> -1.4474325452361945
  553. /*
  554. 40、Object.keys:返回一个由一个给定对象的自身可枚举属性组成的数组
  555. * */
  556. Object.keys = Object.keys || function keys(object) {
  557. if(object === null || object === undefined){
  558. throw new TypeError('Cannot convert undefined or null to object');
  559. }
  560. let result = []
  561. if(isArrayLike(object) || isPlainObject(object)){
  562. for (let key in object) {
  563. object.hasOwnProperty(key) && ( result.push(key) )
  564. }
  565. }
  566. return result
  567. }
  568. /*
  569. 41、Object.values:返回一个给定对象自身的所有可枚举属性值的数组
  570. * */
  571. Object.values = Object.values || function values(object) {
  572. if(object === null || object === undefined){
  573. throw new TypeError('Cannot convert undefined or null to object');
  574. }
  575. let result = []
  576. if(isArrayLike(object) || isPlainObject(object)){
  577. for (let key in object) {
  578. object.hasOwnProperty(key) && ( result.push(object[key]) )
  579. }
  580. }
  581. return result
  582. }
  583. /*
  584. 42、arr.fill:使用 value 值来填充 array,从start位置开始, 到end位置结束(但不包含end位置),返回原数组
  585. * */
  586. Array.prototype.fill = Array.prototype.fill || function fill(value, start, end) {
  587. let ctx = this
  588. let length = ctx.length;
  589. start = parseInt(start)
  590. if(isNaN(start)){
  591. start = 0
  592. }else if (start < 0) {
  593. start = -start > length ? 0 : (length + start);
  594. }
  595. end = parseInt(end)
  596. if(isNaN(end) || end > length){
  597. end = length
  598. }else if (end < 0) {
  599. end += length;
  600. }
  601. while (start < end) {
  602. ctx[start++] = value;
  603. }
  604. return ctx;
  605. }
  606. //Array(3).fill(2) ===> [2, 2, 2]
  607. /*
  608. 43、arr.includes:用来判断一个数组是否包含一个指定的值,如果是返回 true,否则false,可指定开始查询的位置
  609. * */
  610. Array.prototype.includes = Array.prototype.includes || function includes(value, start){
  611. let ctx = this
  612. let length = ctx.length;
  613. start = parseInt(start)
  614. if(isNaN(start)){
  615. start = 0
  616. }else if (start < 0) {
  617. start = -start > length ? 0 : (length + start);
  618. }
  619. let index = ctx.indexOf(value)
  620. return index >= start;
  621. }
  622. /*
  623. 44、arr.find:返回数组中通过测试(函数fn内判断)的第一个元素的值
  624. * */
  625. Array.prototype.find = Array.prototype.find || function find(fn, ctx){
  626. fn = fn.bind(ctx)
  627. let result;
  628. this.some((value, index, arr) => {
  629. return fn(value, index, arr) ? (result = value, true) : false
  630. })
  631. return result
  632. }
  633. /*
  634. 45、arr.findIndex:返回数组中通过测试(函数fn内判断)的第一个元素的下标
  635. * */
  636. Array.prototype.findIndex = Array.prototype.findIndex || function findIndex(fn, ctx){
  637. fn = fn.bind(ctx)
  638. let result;
  639. this.some((value, index, arr) => {
  640. return fn(value, index, arr) ? (result = index, true) : false
  641. })
  642. return result
  643. }
  644. /*
  645. 46、performance.timing:利用performance.timing进行性能分析
  646. * */
  647. window.onload = function(){
  648. setTimeout(function(){
  649. let t = performance.timing
  650. console.log('DNS查询耗时 :' + (t.domainLookupEnd - t.domainLookupStart).toFixed(0))
  651. console.log('TCP链接耗时 :' + (t.connectEnd - t.connectStart).toFixed(0))
  652. console.log('request请求耗时 :' + (t.responseEnd - t.responseStart).toFixed(0))
  653. console.log('解析dom树耗时 :' + (t.domComplete - t.domInteractive).toFixed(0))
  654. console.log('白屏时间 :' + (t.responseStart - t.navigationStart).toFixed(0))
  655. console.log('domready时间 :' + (t.domContentLoadedEventEnd - t.navigationStart).toFixed(0))
  656. console.log('onload时间 :' + (t.loadEventEnd - t.navigationStart).toFixed(0))
  657. if(t = performance.memory){
  658. console.log('js内存使用占比 :' + (t.usedJSHeapSize / t.totalJSHeapSize * 100).toFixed(2) + '%')
  659. }
  660. })
  661. }
  662. //47、禁止某些键盘事件
  663. document.addEventListener('keydown', function(event){
  664. return !(
  665. 112 == event.keyCode || //F1
  666. 123 == event.keyCode || //F12
  667. event.ctrlKey && 82 == event.keyCode || //ctrl + R
  668. event.ctrlKey && 78 == event.keyCode || //ctrl + N
  669. event.shiftKey && 121 == event.keyCode || //shift + F10
  670. event.altKey && 115 == event.keyCode || //alt + F4
  671. "A" == event.srcElement.tagName && event.shiftKey //shift + 点击a标签
  672. ) || (event.returnValue = false)
  673. });
  674. //48、禁止右键、选择、复制
  675. ['contextmenu', 'selectstart', 'copy'].forEach(function(ev){
  676. document.addEventListener(ev, function(event){
  677. return event.returnValue = false
  678. })
  679. });

JS开发常用工具函数 总结的更多相关文章

  1. JS开发常用工具函数

    1.isStatic:检测数据是不是除了symbol外的原始数据 function isStatic(value) { return ( typeof value === 'string' || ty ...

  2. Node.js:常用工具util

    概要:本篇博客的主要内容是介绍node.js的常用工具util. 1.util.inherits util.inherits(constructor,superConstructor)是一个实现对象间 ...

  3. Node.js:常用工具

    ylbtech-Node.js:常用工具 1.返回顶部 1. Node.js 常用工具 util 是一个Node.js 核心模块,提供常用函数的集合,用于弥补核心JavaScript 的功能 过于精简 ...

  4. 学习游戏服务器开发必看,C++游戏服务器开发常用工具介绍

    C++游戏服务器开发常用工具介绍 在软件开发过程中需要使用的工具类型实属众多,从需求建模到软件测试,从代码编译到工程管理,这些工具都对项目有着不可替代的作用.庄子有云,"吾生也有涯,而知也无 ...

  5. C#(Net)软件开发常用工具汇总,提高你的开发效率

    C#(Net)软件开发常用工具汇总,提高你的开发效率 写代码也要读书,爱全栈,更爱生活.每日更新原创IT编程技术及日常实用技术文章. 我们的目标是:玩得转服务器Web开发,搞得懂移动端,电脑客户端更是 ...

  6. Android开发常用工具汇总

    Android开发常用工具汇总,本文章不断更新完善 一.数据库小工具Sqlite Developer  SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它的设计目标是嵌入式的, ...

  7. Java后端开发常用工具

    Java后端开发常用工具推荐: 俗话说,工欲善其事,必先利其器.不过初学时候不大建议过度依赖IDE等过多工具,这会让自己的编程基础功变得很差,比如各种语法的不熟悉,各种关键字比如synchronize ...

  8. numpy 常用工具函数 —— np.bincount/np.average

    numpy 常用工具函数 —— np.bincount/np.average numpy 常用api(一) numpy 常用api(二) 一个函数提供 random_state 的关键字参数(keyw ...

  9. Node.js:常用工具、路由

    一.常用工具util util 是一个Node.js 核心模块,提供常用函数的集合,用于弥补核心JavaScript 的功能 过于精简的不足. 1.util.inherits util.inherit ...

随机推荐

  1. 如何设置单个 Git 仓库的代理从而提高更新速度

    如何设置单个 Git 仓库的代理从而提高更新速度 因为特殊原因,需要单独对 Git 仓库设置远程代理,从而提高更新速度. 主要原因是因为有一些远程 Git 仓库比较慢. 最初的想法是系统全局代理,但是 ...

  2. Leetcode766.Toeplitz Matrix托普利茨矩阵

    如果一个矩阵的每一方向由左上到右下的对角线上具有相同元素,那么这个矩阵是托普利茨矩阵. 给定一个 M x N 的矩阵,当且仅当它是托普利茨矩阵时返回 True. 示例 1: 输入: matrix = ...

  3. svn upgrade

    在我们把我们服务器上的svn 版本号升级以后,我们之前的代码再执行svn命令时,会提示需要执行svn upgrade命令把当前的代码由低版本的svn 上迁移到高版本的svn 上去. 直接执行svn u ...

  4. 足迹地图 搜索jvectormap

    https://blog.wangjunfeng.com/foot_print/

  5. epiinfo是美国CDC开发维护的流行病学数据录入和分析软件,在DOS时代占主流,随着Windows的普及用的人越来越少了,epiinfo重新开发Windows版本后,体积庞大且不好用。在数据录入方面已被EpiData取代,不过epiinfo的分析模块,比如地理信息系统某些情况下还是挺有用的。

    Manual: https://www.cdc.gov/epiinfo/support/userguide.html https://en.wikipedia.org/wiki/Epi_Info 教程 ...

  6. Hibernate 数据库方言配置;no dialect mapping for jdbc type:-9;生僻字

    最近因为生僻字在界面上显示为?: 主要原因是该字段在数据库中就是varchar类型,显示的就是?:如䶮(yan):现把varchar类型改为nvarchar类型:数据中能够正常显示: 但是Spring ...

  7. oracle 共享服务器监控

    1.   观察sga的使用情况 select * from v$sgastat where pool=’large pool’; 2.   观察调度程序是否充足: 首先看每个调度程序的忙闲: sele ...

  8. 序列化类型为“System.Data.Entity.DynamicProxies..."对象时检测到循环引用

    这是因为EF外键引起的序列化问题. 解决方案: context.Configuration.ProxyCreationEnabled = false; 这里我用的是一个基类控制器用于被继承 返回EF实 ...

  9. windows10环境运用SSH和SwitchySharp自由翱翔

    以下纯干货: 安装篇: 安装git bash(自行去找下载包) 安装xshell(开始想用它,后来直接在git bash里用命令搞定了,安装它SSH Server就可用了可能) 安装Chrome的插件 ...

  10. @loj - 2507@ 「CEOI2011」Matching

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 对于整数序列 \((a_1, a_2, ..., a_n)\) ...