- 防抖
- 节流
- 模拟 new 运算符
- 模拟 instanceof
- 模拟 Function.prototype.apply()
- 模拟 Function.prototype.call()
- 模拟 Function.prototype.bind()
- 模拟 Array.prototype.forEach()
- 模拟 Array.prototype.map()
- 模拟 Array.prototype.filter()
- 函数柯里化
- 类数组转数组
- 实现深拷贝
- 继承的实现
- 实现 AJAX
- 多维数组扁平化
- setTimeout 模拟 setInterval
- setInterval 模拟 setTimeout
- sleep
- 数组去重的多种实现方式
- 解析 URL 参数
- 斐波那契数列
- 发布订阅
- 带图带事件的 桌面通知
- 原生 30 行代码实现视频截图
- 基于 URLSearchParams 或 URL 获取 queryString 的值
- 基于 atob 和 btoa 的 base64 编码和解码
- 非正则替换 的 html 代码 encode 和 decode
- 相对地址转换为绝对地址
- 基于 URL 或者 Crypto.getRandomValues 生成 UUID
- 基于 Array.from 的序列生成器
- 基于 sendBeacon 的安全的数据上报
- 数字千分位
- 生成随机字符串 ID
- Promise 顺序执行
- 延时执行 delay
- 进度值映射
- 滑滚动页面到顶部
- 禁止选择和复制
- 禁止图片拖拽
- 浏览器操作相关 browser 工具函数
- 获取 url 参数(第一种)
- 获取 url 参数(第二种)
- 修改 url 中的参数
- 删除 url 中指定的参数
- 获取窗口可视范围的高度
- 获取窗口可视范围宽度
- 获取窗口宽度
- 获取窗口尺寸
- 获取滚动条距顶部高度
- 获取滚动条距左边的高度
- 开启全屏
- 关闭全屏
- 返回当前滚动条位置
- 滚动到指定元素区域
- 平滑滚动到页面顶部
- http 跳转 https
- 检查页面底部是否可见
- 打开一个窗口
- 自适应页面(rem)
- 日期工具 date 工具函数
- cookie 存贮
- cookie 获取
- cookie 删除
- 更多的工具函数
- 数字千分位
- 截取字符串并加身略号
- 获取文件 base64 编码
- B 转换到 KB,MB,GB 并保留两位小数
- base64 转 file
- base64 转 blob
- blob 转 file
- file 转 base64
- 递归生成树形结构
- 遍历树节点
- 追溯父节点
- 寻找所有子节点
- 根据 pid 生成树形结构
- 查询数组中是否存在某个元素并返回元素第一次出现的下标
- Windows 根据详细版本号判断当前系统名称
- 判断手机是 Andoird 还是 IOS
- 函数防抖
- 函数节流
- 判断数据类型
- 生成指定范围随机数
- 数组乱序
- 数组交集
- 数组中某元素出现的次数
- 加法函数(精度丢失问题)
- 减法函数(精度丢失问题)
- 除法函数(精度丢失问题)
- 乘法函数(精度丢失问题)
- 递归优化(尾递归)
- 生成随机整数
- 去除空格
- 大小写转换
- 随机 16 进制颜色 hexColor
- 转义 html(防 XSS 攻击)
- 检测移动/PC 设备
- 隐藏所有指定标签
- 返回指定元素的生效样式
- 检查是否包含子元素
- 数字超过规定大小加上加号 +,如数字超过 99 显示 99+
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
发布订阅
用过 Vue 的 eventBus
的同学应该很熟悉, $on
订阅事件, $emit
发布事件
class EventEmitter {
constructor() {
this.events = {}
}
// 订阅事件
on(event, callback) {
if(!this.events[event]) {
this.events[event] = []
}
// 将事件对应的回调放入该事件的事件队列中
this.events[event].push(callback)
return this
}
//发布事件
emit(event, args) {
const callbackList = this.events[event]
if(callbackList.length) {
callbackList.forEach(cb => cb.apply(this, args))
}
return this
}
// 删除订阅
off(event, callback) {
// event 没传,则删除所有订阅的事件
if (typeof event === 'undefined') {
delete this.events
} else if (typeof event === 'string') {
// 删除指定事件的回调
if (typeof callback === 'function') {
this.events[ event ] = this.events[ event ].filter((cb) => cb !== callback)
} else {
// 删除整个事件
delete this.events[ event ]
}
}
return this
}
// 只进行一次的事件订阅
once (event, callback, context) {
const proxyCallback = (...args) => {
callback.apply(context, args)
// 回调函数执行完成之后就删除事件订阅
this.off(event, proxyCallback)
}
this.on(event, proxyCallback, context)
}
}
// 写完测一把
const bus = new EventEmitter()
// 先订阅一个事件
bus.on('add', () => {
console.log('nanjiu')
})
// 发布事件
bus.emit('add') // nanjiu
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论