24個解決實(shí)際問題的ES6代碼段

英文 |?https://madza.hashnode.dev/24-modern-es6-code-snippets-to-solve-practical-js-problems
作者 | Madza 譯者 | 王強(qiáng) 策劃 | 李俊辰
這篇文章基于實(shí)際使用場景總結(jié)了 24 個 ES6 代碼段,可用來解決項(xiàng)目中可能遇到的一系列問題。
1、如何隱藏所有指定元素?
const hide = (...el) => [...el].forEach(e => (e.style.display = 'none'));// Examplehide(document.querySelectorAll('img')); // 隱藏頁面上的所有 元素
2、 如何確認(rèn)元素是否具有指定的類?
const hasClass = (el, className) => el.classList.contains(className);// ExamplehasClass(document.querySelector('p.special'), 'special'); // true
3、 如何切換元素的類?
const toggleClass = (el, className) => el.classList.toggle(className);// ExampletoggleClass(document.querySelector('p.special'), 'special');// 該段不再有 'special' 類
4、如何獲取當(dāng)前頁面的滾動位置?
const getScrollPosition = (el = window) => ({x: el.pageXOffset !== undefined ? el.pageXOffset : el.scrollLeft,y: el.pageYOffset !== undefined ? el.pageYOffset : el.scrollTop});// ExamplegetScrollPosition(); // {x: 0, y: 200}
5、如何平滑滾動到頁面頂部?
const scrollToTop = () => {const c = document.documentElement.scrollTop || document.body.scrollTop;if (c > 0) {window.requestAnimationFrame(scrollToTop);window.scrollTo(0, c - c / 8);}};// ExamplescrollToTop();
6、 如何確認(rèn)父元素是否包含子元素?
const elementContains = (parent, child) => parent !== child && parent.contains(child);// ExampleselementContains(document.querySelector('head'), document.querySelector('title'));// trueelementContains(document.querySelector('body'), document.querySelector('body')); // false
7、如何確認(rèn)指定元素是否在視口可見?
const elementIsVisibleInViewport = (el, partiallyVisible = false) => {const { top, left, bottom, right } = el.getBoundingClientRect();const { innerHeight, innerWidth } = window;return partiallyVisible? ((top > 0 && top < innerHeight) || (bottom > 0 && bottom < innerHeight)) &&((left > 0 && left < innerWidth) || (right > 0 && right < innerWidth)): top >= 0 && left >= 0 && bottom <= innerHeight && right <= innerWidth;};// ExampleselementIsVisibleInViewport(el); // (不完全可見)elementIsVisibleInViewport(el, true); // (部分可見)
8、如何獲取一個元素內(nèi)的所有圖像?
const getImages = (el, includeDuplicates = false) => {const images = [...el.getElementsByTagName('img')].map(img => img.getAttribute('hide'));return includeDuplicates ? images : [...new Set(images)];};// ExamplesgetImages(document, true); // ['image1.jpg', 'image2.png', 'image1.png', '...']getImages(document, false); // ['image1.jpg', 'image2.png', '...']
9、如何分辨設(shè)備是移動設(shè)備還是桌面設(shè)備?
const detectDeviceType = () =>/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)? 'Mobile': 'Desktop';// ExampledetectDeviceType(); // "Mobile" or "Desktop"
10、 如何獲取當(dāng)前 URL?
const currentURL = () => window.location.href;// ExamplecurrentURL(); // 'https://google.com'
11、 如何創(chuàng)建一個包含當(dāng)前 URL 參數(shù)的對象?
const getURLParameters = url =>(url.match(/([^?=&]+)(=([^&]*))/g) || []).reduce((a, v) => ((a[v.slice(0, v.indexOf('='))] = v.slice(v.indexOf('=') + 1)), a),{});// ExamplesgetURLParameters('http://url.com/page?n=Adam&s;=Smith'); // {n: 'Adam', s: 'Smith'}getURLParameters('google.com'); // {}
12、如何將一組表單元素編碼為一個對象?
const formToObject = form =>Array.from(new FormData(form)).reduce((acc, [key, value]) => ({...acc,[key]: value}),{});// ExampleformToObject(document.querySelector('#form')); // { email: '[email protected]', name: 'Test Name' }
13、 如何從對象中檢索給定選擇器指示的一組屬性?
const get = (from, ...selectors) =>[...selectors].map(s =>s.replace(/\[([^\[\]]*)\]/g, '.$1.').split('.').filter(t => t !== '').reduce((prev, cur) => prev && prev[cur], from));const obj = { selector: { to: { val: 'val to select' } }, target: [1, 2, { a: 'test' }] };// Exampleget(obj, 'selector.to.val', 'target[0]', 'target[2].a'); // ['val to select', 1, 'test']
14、 如何在等待一定時間后調(diào)用提供的函數(shù)(單位毫秒)?
const delay = (fn, wait, ...args) => setTimeout(fn, wait, ...args);delay(function(text) {console.log(text);},1000,'later');// 一秒后記錄 'later' 。
15、如何在給定元素上觸發(fā)特定事件,且可選傳遞自定義數(shù)據(jù)?
const triggerEvent = (el, eventType, detail) =>el.dispatchEvent(new CustomEvent(eventType, { detail }));// ExamplestriggerEvent(document.getElementById('myId'), 'click');triggerEvent(document.getElementById('myId'), 'click', { username: 'bob' });
16、 如何移除一個元素的事件偵聽器?
const off = (el, evt, fn, opts = false) => el.removeEventListener(evt, fn, opts);const fn = () => console.log('!');document.body.addEventListener('click', fn);off(document.body, 'click', fn); // no longer logs '!' upon clicking on the page
17、 如何獲得給定毫秒數(shù)的可讀格式?
const formatDuration = ms => {if (ms < 0) ms = -ms;const time = {day: Math.floor(ms / 86400000),hour: Math.floor(ms / 3600000) % 24,minute: Math.floor(ms / 60000) % 60,second: Math.floor(ms / 1000) % 60,millisecond: Math.floor(ms) % 1000};return Object.entries(time).filter(val => val[1] !== 0).map(([key, val]) => `${val} ${key}${val !== 1 ? 's' : ''}`).join(', ');};// ExamplesformatDuration(1001); // '1 second, 1 millisecond'formatDuration(34325055574); // '397 days, 6 hours, 44 minutes, 15 seconds, 574 milliseconds'
18、 如何獲取兩個日期之間的天數(shù)間隔?
const getDaysDiffBetweenDates = (dateInitial, dateFinal) =>(dateFinal - dateInitial) / (1000 * 3600 * 24);// ExamplegetDaysDiffBetweenDates(new Date('2017-12-13'), new Date('2017-12-22')); // 9
19、 如何對傳遞的 URL 進(jìn)行 GET 請求?
const httpGet = (url, callback, err = console.error) => {const request = new XMLHttpRequest();request.open('GET', url, true);request.onload = () => callback(request.responseText);request.onerror = () => err(request);request.send();};httpGet('https://jsonplaceholder.typicode.com/posts/1',console.log);// Logs: {"userId": 1, "id": 1, "title": "sample title", "body": "my text"}
20、 如何對傳遞的 URL 進(jìn)行 POST 請求?
const httpPost = (url, data, callback, err = console.error) => {const request = new XMLHttpRequest();request.open('POST', url, true);request.setRequestHeader('Content-type', 'application/json; charset=utf-8');request.onload = () => callback(request.responseText);request.onerror = () => err(request);request.send(data);};const newPost = {userId: 1,id: 1337,title: 'Foo',body: 'bar bar bar'};const data = JSON.stringify(newPost);httpPost('https://jsonplaceholder.typicode.com/posts',data,console.log);// Logs: {"userId": 1, "id": 1337, "title": "Foo", "body": "bar bar bar"}
21、 如何為指定選擇器創(chuàng)建具有指定范圍、步長和持續(xù)時間的計(jì)時器?
const counter = (selector, start, end, step = 1, duration = 2000) => {let current = start,_step = (end - start) * step < 0 ? -step : step,timer = setInterval(() => {current += _step;document.querySelector(selector).innerHTML = current;if (current >= end) document.querySelector(selector).innerHTML = end;if (current >= end) clearInterval(timer);}, Math.abs(Math.floor(duration / (end - start))));return timer;};// Examplecounter('#my-id', 1, 1000, 5, 2000); // 為 id="my-id" 的元素創(chuàng)建一個兩秒的計(jì)時器
22、 如何將一個字符串復(fù)制到剪貼板?
const copyToClipboard = str => {const el = document.createElement('textarea');el.value = str;el.setAttribute('readonly', '');el.style.position = 'absolute';el.style.left = '-9999px';document.body.appendChild(el);const selected =document.getSelection().rangeCount > 0 ? document.getSelection().getRangeAt(0) : false;el.select();document.execCommand('copy');document.body.removeChild(el);if (selected) {document.getSelection().removeAllRanges();document.getSelection().addRange(selected);}};// ExamplecopyToClipboard('Lorem ipsum'); // 'Lorem ipsum' copied to clipboard.
23、 如何確定頁面的瀏覽器選項(xiàng)卡是否處于前臺活躍狀態(tài)?
const isBrowserTabFocused = () => !document.hidden;// ExampleisBrowserTabFocused(); // true
24、如果一個目錄不存在,如何創(chuàng)建它?
const fs = require('fs');const createDirIfNotExists = dir => (!fs.existsSync(dir) ? fs.mkdirSync(dir) : undefined);// ExamplecreateDirIfNotExists('test'); // creates the directory 'test', if it doesn't exist
本文完~

