24 个解决JavaScript实际问题的 ES6 代码片段

我从 30 seconds of code 网站中挑选了一些我认为有用的短代码片段,这是一个很棒的学习资源,有兴趣的话,可以多上去看看。

在今天的内容中,我尝试根据它们的实际用途对它们进行排序,解决我们在项目中可能遇到的常见问题:

1、隐藏指定的所有元素

const hide = (...el) => [...el].forEach(e => (e.style.display = 'none'));
// Examplehide(document.querySelectorAll('img')); // Hides all <img> elements on the page

2、检查元素是否有指定的类

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'); // The paragraph will not have the 'special' class anymore

4、如何获取当前页面的滚动位置

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、如何检查父元素是否包含子元素

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、如何检查指定的元素在视口中是否可见

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); // (not fully visible)elementIsVisibleInViewport(el, true); // (partially visible)

8、如何获取元素内的所有图像

const getImages = (el, includeDuplicates = false) => {  const images = [...el.getElementsByTagName('img')].map(img => img.getAttribute('src'));  return includeDuplicates ? images : [...new Set(images)];};
// ExamplesgetImages(document, true); // ['image1.jpg', 'image2.png', 'image1.png', '...']getImages(document, false); // ['image1.jpg', 'image2.png', '...']

9、如何判断设备是移动设备还是台式机/笔记本电脑

const detectDeviceType = () =>  /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)    ? 'Mobile'    : 'Desktop';
// ExampledetectDeviceType(); // "Mobile" or "Desktop"

10、如何获取当前网址

const currentURL = () => window.location.href;
// ExamplecurrentURL(); // 'https://google.com'

11、如何创建一个包含当前URL参数的对象

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: 'test@email.com', 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、wait(毫秒)后如何调用提供的函数

const delay = (fn, wait, ...args) => setTimeout(fn, wait, ...args);delay(  function(text) {    console.log(text);  },  1000,  'later'); 
// Logs 'later' after one second.

15、如何在给定元素上触发特定事件,可选择传递自定义数据

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、如何获取给定毫秒数的可读格式

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、如何获得两个日期之间的差异(以天为单位)

const getDaysDiffBetweenDates = (dateInitial, dateFinal) =>  (dateFinal - dateInitial) / (1000 * 3600 * 24);
// ExamplegetDaysDiffBetweenDates(new Date('2017-12-13'), new Date('2017-12-22')); // 9

19、如何向传递的URL发起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发起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、如何为指定的选择器创建一个指定范围、步长和持续时间的计数器

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); // Creates a 2-second timer for the element with id="my-id"

22、如何将字符串复制到剪贴板

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、如何判断页面的浏览器标签是否有焦点

const isBrowserTabFocused = () => !document.hidden;
// ExampleisBrowserTabFocused(); // true

24、如果目录不存在,如何创建

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

写在最后

以上就是我在工作与学习中收集整理下来的24个代码片段,对我来讲,还是非常有用的,因此,我将它分享出来,也希望对您有所帮助。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cheng-Dashi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值