N 个值得一看的前端代码片段
作者:晓得迷路了
原文:juejin.cn/post/7371312967781777418
在日常的开发过程中,我们都会有一些常用的代码片段,这些代码片段可以直接复制到各个项目中使用,非常方便。如果你有接手过别人的项目,就可以很明显感受到几个项目一般都会有一些相同的工具类方法,这些方法就是之前开发者的常用代码片段。
现在前端社区相当完善,有许多好用质量又有保证的库,如 lodash、dayjs、classnames、js-cookie 等,这些库基本能满足你开发中对数组、日期、类名、cookie 等的处理。
所以本文会尽量不重复介绍那些很常见的代码片段(顺带吆喝一句,技术大厂,前后端测试捞人)。
1. 检测元素之外的点击
在实现隐藏弹窗或收起下拉框时,如果你还在一层层判断是否点击了某个元素之外的区域,赶紧试试使用 contains
方法来实现。
document.addEventListener('click', function (evt) {
// isClickedOutside 为 true 如果点击的元素在 ele 之外
const isClickedOutside = !ele.contains(evt.target);
});
2. 快速打开官网
当你想查看第三方库的主页和代码仓库时,你可以使用一下命令快速打开:
// 打开主页
npm home PACKAGE_NAME
npm home react
// 打开代码仓库
npm repo PACKAGE_NAME
npm repo react
3. 一次性的事件监听
除了在监听的事件函数中移除当前的监听外,也可以使用 once
参数。
const handler = function (e) {};
ele.addEventListener('event-name', handler, { once: true });
4. 格式化时分秒
在展示音视频时长之类的场景时,需要把时长秒数格式为 HH:mm:ss 的格式。
const formatSeconds = (s) =>
[parseInt(s / 60 / 60), parseInt((s / 60) % 60), parseInt(s % 60)]
.join(':')
.replace(/\b(\d)\b/g, '0$1')
如果你想显示“刚刚”、“5分钟前”之类的内容,可以尝试 timeago.js 库。
5. URL 参数转化为对象
获取 url 参数有个热门的库 query-string,如果不想使用的话,可以通过 URLSearchParams
API 实现。
const getUrlParams = (query) =>
Array.from(new URLSearchParams(query)).reduce(
(p, [k, v]) =>
Object.assign({}, p, { [k]: p[k] ? (Array.isArray(p[k]) ? p[k] : [p[k]]).concat(v) : v }),
{}
)
// 获取 query 参数
getUrlParams(location.query)
// { a: ['1', '4'], b: '2', c: '3' }
getUrlParams('?a=1&b=2&c=3&a=4')
// 获取 hash 参数
getUrlParams(location.hash.split('?')[1])
6. 打开新页签
看似平平无奇的打开页签,但是需要关注下 rel
,如果要打开外链,建议设置为 noopener noreferrer
,避免一些恶意网站通过 window.opener.location
重定向你的网站地址。window.open
方法同理。
// 高版本浏览器 rel 默认为 noopener,不过建议显示设置,兼容低版本。
<a target="_blank" rel="noopener noreferrer">...</a>
// window.open rel 默认为 opener,需要自己设置
window.open('https://baidu.com', 'baidu', 'noopener,noreferrer')
// 以下有安全漏洞,打开的新页签可以通过 window.opener.location 重定向你的网站
<a target="_blank" rel="opener">...</a>
window.opener.location = 'http://fake.website.here';
7. 显示上传的图片
通过 fileReader
API 的 readAsDataURL
方法来显示上传图片
function readImage() {
const fileReader = new FileReader()
const file = document.getElementById('uploaded-file').files[0]
if (file) {
fileReader.readAsDataURL(file)
}
fileReader.addEventListener(
'load',
() => {
const result = fileReader.result
const resultContainer = document.getElementById('result')
const img = document.createElement('img')
img.src = result
resultContainer.append(img)
},
{ once: true }
)
}
8. 文件下载
使用 a
标签的 download
属性,同源才能触发下载,IE 不支持,移动端兼容性也不太好。
<a href="/path/to/file" download>Download</a>
// 或者 js 临时生成 a
function download(url) {
const link = document.createElement('a')
link.download = 'file name'
link.href = 'url'
document.body.appendChild(link)
link.click()
document.body.removeChild(link)
}
静态资源服务器设置响应头也能触发浏览器下载。
Content-Disposition: attachment; filename="filename.jpg"
除了在线文件下载,你还可以创建一个 text 或 json 文件,并下载,主要用到了 Blob
对象和 createObjectURL
方法。
const data = JSON.stringify({ 'message': 'Hello Word' });
const blob = new Blob([data], { type: 'application/json' });
// 创建一个 URL
const url = window.URL.createObjectURL(blob);
// 用上面的 download 方法下载这个 url
...
// 释放创建的 URL
window.URL.revokeObjectURL(url);
9. 缓存结果
缓存函数的结果,当计算比较复杂时可以使用。
const memoize = (fn) =>
(
(cache = Object.create(null)) =>
(arg) =>
cache[arg] || (cache[arg] = fn(arg))
)()
10. 多行省略号
单行或多行截断显示省略号,很常用的 CSS 片段。
.truncate {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.truncate {
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
overflow: hidden;
}
- 点赞
- 收藏
- 关注作者
评论(0)