阿里云主机折上折
  • 微信号
您当前的位置:网站首页 > 前端冷知识:那些像“茶垢”一样被遗忘的 API

前端冷知识:那些像“茶垢”一样被遗忘的 API

作者:陈川 阅读数:41151人阅读 分类: 前端综合

那些像“茶垢”一样被遗忘的 API

前端开发就像泡茶,时间久了总会沉淀一些“茶垢”——那些曾经火热但逐渐被遗忘的 API。它们或许不再时髦,但在某些场景下依然能泡出令人惊喜的“茶香”。

document.designMode

// 开启整个文档的可编辑模式
document.designMode = 'on';
// 现在你可以像编辑Word文档一样修改页面内容

这个诞生于 IE 时代的 API 能让整个文档变成可编辑状态。虽然现代富文本编辑器都用 contenteditable 实现局部编辑,但在快速原型设计时,直接打开控制台输入这行代码,就能实时调整页面文案,比反复修改代码重新编译高效得多。

navigator.vibrate()

// 让手机振动200毫秒
navigator.vibrate(200);
// 复杂振动模式:振动300ms,暂停100ms,再振动500ms
navigator.vibrate([300, 100, 500]);

移动端特有的振动 API 常被用来做游戏反馈或重要通知。有趣的是,在 Chrome 桌面版调用它不会报错——只是静默失败,这种设计让代码可以跨平台运行而不必额外处理兼容性。

隐藏的 console 方法

console.table([
  { name: 'Alice', age: 25 },
  { name: 'Bob', age: 30 }
]);

// 输出带样式的日志
console.log('%c彩虹文字', 'background: linear-gradient(to right, red, orange); color: white; padding: 5px;');

除了常用的 log/warn/error,console 对象还藏着许多宝藏方法。console.table 用表格形式展示数组对象,console.dirxml 显示 DOM 节点树,甚至可以用 CSS 语法创建彩色日志。在调试复杂数据结构时,这些方法比单纯的 log 直观得多。

requestIdleCallback

function processData(data) {
  // 大数据处理逻辑
}

requestIdleCallback(deadline => {
  while (deadline.timeRemaining() > 0) {
    processData(nextChunk);
  }
});

这个 API 允许浏览器在空闲时期执行任务,避免阻塞关键渲染。与 setTimeout 不同,它会在帧渲染间隙自动调度,特别适合处理非紧急的后台任务。React 的 Fiber 架构就基于此实现任务分片。

被遗忘的 CSS 计数器

/* 自动编号章节标题 */
body {
  counter-reset: section;
}
h2::before {
  counter-increment: section;
  content: "第" counter(section) "章 ";
}

纯 CSS 实现的计数器系统可以自动生成目录编号、有序列表样式。更神奇的是它支持嵌套计数:

ol { counter-reset: item }
li { display: block }
li:before {
  counter-increment: item;
  content: counters(item, ".") " ";
}

details 元素的魔法

<details>
  <summary>点击查看答案</summary>
  <p>42 - 生命、宇宙及一切问题的答案</p>
</details>

这个原生 HTML 元素实现了手风琴效果,无需 JavaScript。通过 CSS 可以自定义箭头样式:

details summary::-webkit-details-marker {
  display: none;
}
details summary:after {
  content: "+";
}
details[open] summary:after {
  content: "-";
}

国际化的 Intl API

new Intl.RelativeTimeFormat('zh', { 
  numeric: 'auto' 
}).format(-1, 'day'); // 输出:"昨天"

new Intl.ListFormat('zh').format(['苹果', '香蕉']); // 输出:"苹果和香蕉"

处理日期、数字、列表格式时,Intl 系列 API 能自动适配本地化规则。相比自己写格式化函数,它支持 150+ 种语言环境,连复数规则都考虑周全:

// 俄语有特殊的复数规则
new Intl.PluralRules('ru').select(2); // 返回"few"

消失的 DOM 遍历 API

// 获取元素所有文本节点
function getTextNodes(el) {
  const walker = document.createTreeWalker(
    el, 
    NodeFilter.SHOW_TEXT, 
    null, 
    false
  );
  const nodes = [];
  while (walker.nextNode()) nodes.push(walker.currentNode);
  return nodes;
}

TreeWalker 和 NodeIterator 这两个古老的 DOM 遍历 API,在现代前端几乎被 querySelector 取代。但在需要精细控制节点遍历时(比如处理富文本编辑器内容),它们仍然无可替代。

地理围栏 API

const fence = new CircularGeofence({
  latitude: 39.9042,
  longitude: 116.4074,
  radius: 1000 // 1公里范围
});

fence.onenter = () => console.log('进入天安门广场区域');
fence.onexit = () => console.log('离开天安门广场区域');

虽然 Geolocation API 人尽皆知,但它的增强版 GeographicFencing 却鲜为人知。这个 API 可以在用户进入/离开特定地理区域时触发回调,非常适合位置敏感的应用程序(比如自动切换城市服务)。

被低估的 Web Animations API

const animation = element.animate([
  { transform: 'rotate(0deg)' },
  { transform: 'rotate(360deg)' }
], {
  duration: 1000,
  iterations: Infinity
});

// 精确控制动画
document.querySelector('button').onclick = () => {
  animation.pause();
  animation.currentTime = 500; // 跳转到中间帧
};

相比 CSS 动画,这个 API 提供了更精细的控制能力:动态修改关键帧、查询播放状态、无缝衔接动画序列。最惊艳的是它返回的 Animation 对象自带 Promise 支持:

await element.animate([...], 1000).finished;
console.log('动画完成!');

神奇的 Web Share API

// 调用系统原生分享对话框
navigator.share({
  title: '前端冷知识',
  url: 'https://example.com'
}).catch(e => {
  // 用户取消分享时触发
});

在移动设备上,这个 API 能唤起系统级分享面板,支持分享到任何已安装的应用。更棒的是它遵循“渐进增强”原则——在不支持的浏览器上调用不会报错,只需优雅降级:

if (navigator.share) {
  // 现代分享方式
} else {
  // 传统分享按钮
}

时间旅行者:console.timeTravel()

console.timeTravel(1000); // 回退1秒
console.log(new Date()); // 显示1秒前的时间

这个仅限 Firefox 开发者工具的私有 API 能修改页面感知的系统时间,测试时间相关逻辑时非常有用。虽然是非标准实现,但启发我们思考:调试时间敏感型应用时,控制“时间流速”可能比反复修改系统时钟更高效。

字体检测 API

document.fonts.ready.then(() => {
  console.log('所有字体加载完成');
});

// 检测特定字体是否可用
document.fonts.check('12px "思源黑体"');

FontFaceSet 接口提供了字体加载状态查询能力,对于需要精确控制文字渲染的场景(比如避免字体闪烁)特别有用。配合 CSS Font Loading API,可以实现更细致的字体加载策略:

const font = new FontFace('MyFont', 'url(myfont.woff2)');
await font.load();
document.fonts.add(font);

消失的 CSS 表达式

/* IE5时代的黑科技(已废弃) */
width: expression(document.body.clientWidth > 600 ? "600px" : "auto");

虽然已被现代浏览器禁用,但这种在 CSS 中直接写 JavaScript 的脑洞大开设计,某种程度上预示了后来的 CSS-in-JS 技术。它的废弃也提醒我们:强大的功能需要以性能为代价。

剪切板中的富文本

// 读取剪切板中的富文本
navigator.clipboard.read().then(data => {
  const html = data.find(item => item.type === 'text/html');
  console.log(html);
});

// 写入带样式的富文本
const item = new ClipboardItem({
  'text/html': new Blob(['<b>Hello</b>'], { type: 'text/html' })
});
navigator.clipboard.write([item]);

现代 Clipboard API 不仅能处理纯文本,还能操作富文本内容。这在需要保持粘贴内容格式的编辑器场景中非常实用,比如从 Word 文档复制带样式的文字到网页编辑器。

被忽视的 Performance API

// 测量函数执行时间
performance.mark('start');
expensiveOperation();
performance.mark('end');
performance.measure('耗时', 'start', 'end');

// 获取所有资源加载耗时
performance.getEntriesByType('resource').forEach(resource => {
  console.log(`${resource.name} 加载耗时: ${resource.duration}ms`);
});

这个 API 提供了纳秒级精度的时间测量能力,比手动用 Date.now() 计算更准确。特别是 performance.now() 不受系统时间调整影响,适合做动画帧率统计等精密计时场景。

浏览器“间谍”API

// 检测用户是否启用了减少动画偏好
const prefersReducedMotion = window.matchMedia(
  '(prefers-reduced-motion: reduce)'
).matches;

// 监听深色模式变化
window.matchMedia('(prefers-color-scheme: dark)')
  .addListener(e => {
    console.log(e.matches ? '深色模式' : '浅色模式');
  });

CSS 媒体查询的 JavaScript 版本不仅能读取设备特性,还能实时监听变化。从屏幕方向、内存大小到是否触控设备,这些信息帮助开发者打造更具适应性的界面。

元素尺寸观察者

const observer = new ResizeObserver(entries => {
  entries.forEach(entry => {
    console.log(`元素宽度变为: ${entry.contentRect.width}px`);
  });
});
observer.observe(document.getElementById('resizable'));

比起频繁轮询 offsetWidth,这个 API 能在元素尺寸变化时主动通知。结合 MutationObserver 和 IntersectionObserver,现代浏览器已经提供了完整的 DOM 变化监测体系。

本站部分内容来自互联网,一切版权均归源网站或源作者所有。

如果侵犯了你的权益请来信告知我们删除。邮箱:cc@cccx.cn

前端川

前端川,陈川的代码茶馆🍵,专治各种不服的Bug退散符💻,日常贩卖秃头警告级的开发心得🛠️,附赠一行代码笑十年的摸鱼宝典🐟,偶尔掉落咖啡杯里泡开的像素级浪漫☕。‌