分享18个常用的ECMAScript 6代码片段

简介: 最近在整理电脑的项目,总结了一些常见的小功能(获取URL、URL参数解析、Form表单数据解析等),特别的reduce方法的妙用。

最近在整理电脑的项目,总结了一些常见的小功能(获取URL、URL参数解析、Form表单数据解析等),特别的reduce方法的妙用。

image.png

1.如何批量隐藏指定的元素?

const hide = (...el) => [...el].forEach((e) => (e.style.display = "none"));
// 调用示例
hide(document.querySelectorAll("img"));

2.如何检查元素是否具有指定的类?

const hasClass = (el, className) => el.classList.contains(className);
// 调用示例
hasClass(document.querySelector("p.special"), "special"); // true

3.如何切换元素的样式类?

const toggleClass = (el, className) => el.classList.toggle(className);
// 调用示例
toggleClass(document.querySelector("p.special"), "special");

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

const getScrollPosition = (el = window) => ({
    x: el.pageXOffset !== undefined ? el.pageXOffset : el.scrollLeft,
    y: el.pageYOffset !== undefined ? el.pageYOffset : el.scrollTop,
});
// 调用示例
getScrollPosition(); // {x: 0, y: 100}

5.如何平滑滚动到页面顶部?

const scrollToTop = () => {
    const scrollTop =
        document.documentElement.scrollTop || document.body.scrollTop;
    if (scrollTop > 0) {
        window.requestAnimationFrame(scrollToTop);
        window.scrollTo(0, scrollTop - scrollTop / 8);
    }
};
// 调用示例
scrollToTop();

6.如何检查父元素是否包含子元素?

const elementContains = (parent, child) =>
    parent !== child && parent.contains(child);
// 调用示例
elementContains(
    document.querySelector("head"),
    document.querySelector("title")
);
// true
elementContains(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;
};
// 调用示例
elementIsVisibleInViewport(el); // 不完全可见
elementIsVisibleInViewport(el, true); // 部分可见

8.如何获取元素中的所有图像?

const getImages = (el, includeDuplicates = false) => {
    const images = [...el.getElementsByTagName("img")].map((img) =>
        img.getAttribute("src")
    );
    return includeDuplicates ? images : [...new Set(images)];
};
// 调用示例
getImages(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";
// 调用示例
detectDeviceType(); // "移动端" or "桌面"

10.如何获取当前URL?

const currentURL = () => window.location.href;
// 调用示例
currentURL();

11.将URL参数解析为对象?

const getURLParameters = (url) =>
    (url.match(/([^?=&]+)(=([^&]*))/g) || []).reduce(
        (a, v) => (
            (a[v.slice(0, v.indexOf("="))] = v.slice(v.indexOf("=") + 1)), a
        ),
        {}
    );
// 调用示例
getURLParameters("http://url.com/page?n=DevPoint&s=Shenzhen"); // {n: 'DevPoint', s: 'Shenzhen'}
getURLParameters("baidu.com"); // {}

12.如何将Form表单数据转为对象?

const formToObject = (form) =>
    Array.from(new FormData(form)).reduce(
        (account, [key, value]) => ({
            ...account,
            [key]: value,
        }),
        {}
    );
// 调用示例
formToObject(document.querySelector("#form")); // { city: 'Shenzhen', name: 'DevPoint' }

13.延迟执行函数(毫秒)?

const delay = (fn, wait, ...args) => setTimeout(fn, wait, ...args);
delay(
    (text) => {
        console.log(text);
    },
    1000,
    "later"
);

14.如何删除DOM事件?

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);

15.如何将时间戳转为直观的时间格式?

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,
    };
    const timeZh = {
        day: "天",
        hour: "小时",
        minute: "分钟",
        second: "秒",
        millisecond: "毫秒",
    };
    return Object.entries(time)
        .filter((val) => val[1] !== 0)
        .map(([key, val]) => `${val} ${timeZh[key]}`)
        .join(",");
};
// 调用示例
formatDuration(1001); // 1 秒,1 毫秒
formatDuration(34325055574); // 397 天,6 小时,44 分钟,15 秒,574 毫秒

16.如何获得两个日期的时间差?

const getDaysDiffBetweenDates = (dateInitial, dateFinal) =>
    (dateFinal - dateInitial) / (1000 * 3600 * 24);
// 调用示例,以天计算
getDaysDiffBetweenDates(new Date("2021-03-20"), new Date("2021-04-03")); // 14

17.如何将字符串复制到剪贴板?

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);
    }
};
// 调用示例
copyToClipboard("DevPoint"); // 'DevPoint' copied to clipboard.

18.如何创建一个计数器?

指定一个DOM id,创建一个计数器,指定步长,结束数值,按照同样的频率计数。

const counter = (selector, start, end, step = 1, duration = 2000) => {
    let current = start;
    const _step = (end - start) * step < 0 ? -step : step;
    const 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;
};
// Example
counter("#counter", 1, 1000, 5, 2000); // 创建一个计数器,从1开始,步长为5,计数到1000结束



相关文章
|
3月前
|
JSON JavaScript 前端开发
如何使用代码注释:关于JavaScript与TypeScript
TSDoc是一种标准化TypeScript代码文档注释的规范,使不同工具能无干扰地提取内容。它包括多种标记,如@alpha、@beta等发布阶段标记;@decorator、@deprecated等功能标记;@defaultValue、@eventProperty等描述标记;@example、@experimental等示例与实验性标记;@inheritDoc、@internal等引用与内部标记;@label、@link等链接标记;@override、@sealed等修饰符标记;以及@packageDocumentation、@param、
58 5
|
7月前
|
JavaScript 前端开发
js开发:请解释this关键字在JavaScript中的用法。
【4月更文挑战第23天】JavaScript的this关键字根据执行环境指向不同对象:全局中指向全局对象(如window),普通函数中默认指向全局对象,作为方法调用时指向调用对象;构造函数中指向新实例,箭头函数继承所在上下文的this。可通过call、apply、bind方法显式改变this指向。
35 1
|
JavaScript 前端开发 安全
TypeScript 是 JavaScript 的超集,如何理解
TypeScript 是 JavaScript 的超集,如何理解
74 0
|
JavaScript 前端开发
JavaScript的命名规范是怎样的?底层原理是什么?
JavaScript的命名规范是怎样的?底层原理是什么?
|
JavaScript 前端开发 Java
ECMAScript6新语法(javaScript)
🍅程序员小王的博客:程序员小王的博客 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 🍅 如有编辑错误联系作者,如果有比较好的文章欢迎分享给我,我会取其精华去其糟粕 🍅java自学的学习路线:java自学的学习路线
85 0
ECMAScript6新语法(javaScript)
|
JavaScript 前端开发
JavaScript的部分命名规范
JavaScript的部分命名规范
|
JavaScript 前端开发
JavaScript基本的的语法规则
JavaScript基本的的语法规则
|
JavaScript 前端开发 数据处理
JavaScript 基础(一):语法和程序结构
JavaScript 是 Web 开发需要掌握的一种编程语言,它创建于 1995 年,用于在网景(Netscape) Navigator 浏览器中将程序添加到网页中。今天,该语言已被所有其他主要网络浏览器支持。
135 0
JavaScript 基础(一):语法和程序结构
|
存储 移动开发 前端开发
每天学习10个实用Javascript代码片段(一)
随着 Javascript 越来越流行,使其应用的场景越来越多,不仅限于前端,可以是后端、混合应用程序、嵌入式设备等等,于是就有了大前端的叫法。现代前端开发有大量的框架和代码库来帮助实现各种复杂的需求,导致让很多人认为前端开发很简单,如切页面、组框架、网页制作等等。一个前端工程师如果需要提升技能,必然要经历原生代码的编写,代码片段可以加深对 Javascript 基础语法的理解,同时还能增加编码水平。
125 0
每天学习10个实用Javascript代码片段(一)