stopPropagation()
e.stopPropagation()的作用是 阻止事件继续冒泡(Propagation)。
也就是说:
- 当前元素的父元素不会再收到这个事件
- 祖先元素也不会收到这个事件
- 其他监听器(在冒泡阶段)不会被触发
catch (_)
catch (_) 中的 下划线 _ 只是一个变量名,表示“我不关心这个错误对象”。
在 JavaScript 中:
try {
// 可能会抛出错误的代码
} catch (err) {
// err 是错误对象
}
但如果你 不需要使用错误对象(比如只想吞掉错误,不做处理),你可以写成:
catch (_) {}
为什么用 _?
因为:
- catch 后面必须写一个“接收错误对象的变量名”
- 但你又不想使用它
- 使用 _ 表示“这个变量不会被用到”,是一种常见约定写法(语义等同于“忽略这个值”)
与 catch {} 的区别?
在 较新版本的 JavaScript(ES2019/ES10)中,可以写:
catch {}
这是“可选 catch 绑定”语法,不需要变量名。
但如果为了兼容旧浏览器(特别是 Chrome 扩展很多人要求更广兼容性),开发者可能仍然写:
catch (_) {}
定位属性
left: 50%:把这个元素的左边界放到父容器宽度的 50% 位置
只在元素是 position: absolute 或 position: relative 或 position: fixed 时才生效。
chrome.runtime.getURL
chrome.runtime.getURL() 是 Chrome 扩展(Chrome Extension)专用 API,用于 根据扩展内的相对路径,生成一个可在网页 / 扩展脚本中使用的绝对 URL。
这是扩展开发中常用的一个函数,尤其在加载静态资源(图片、脚本、样式、模型文件等)时用得特别多。
作用
把扩展内的文件路径转换成可访问的完整 URL
扩展的资源文件不能直接用相对路径访问,比如:
assets/icon.png
在扩展运行时,Chrome 会把这些文件映射到一个特殊的扩展 URL,例如:
chrome-extension://abcdefghijklmno/assets/icon.png
但你 不能直接写死这个扩展 ID。
所以就需要用:
chrome.runtime.getURL('assets/icon.png');
它会自动根据当前扩展的 ID 生成真正可访问的链接。
能够获取的文件
只能获取 manifest.json 中声明为可访问的文件,包括:
- action.default_icon
- content_scripts.js/css
- web_accessible_resources 中列出的文件
- 扩展包内任何资源(但如果要给网页访问,需要放进 web_accessible_resources)
常见用途
| 用途 | 示例 |
|---|---|
| 给 content script 注入图片 | 挂 UI 图标、按钮 |
| 注入 JS/CSS | 在网页动态加载扩展自己的脚本、样式 |
| Web Worker 加载脚本 | new Worker(chrome.runtime.getURL('worker.js')) |
| Three.js / AR / 模型加载 | loader.load(chrome.runtime.getURL('Duck.glb')) |
| 读取扩展资源 | JSON、配置文件、模型文件等 |
requestAnimationFrame()
requestAnimationFrame()(简称 rAF)是浏览器提供的一个用于 高性能动画 的 API。它让你可以在浏览器下一次重绘(render)前执行一个回调函数,用来实现 流畅、节能、同步刷新率 的动画。
这是前端中做动画、游戏、粒子效果、涟漪效果、Canvas 渲染等场景的标准方式。
基本用法
function loop(timestamp) {
console.log(timestamp); // 当前帧的时刻(毫秒)
// 下一帧继续
requestAnimationFrame(loop);
}
// 启动动画循环
requestAnimationFrame(loop);
作用
在浏览器每一帧渲染前自动执行你的回调,让动画紧跟屏幕刷新率(通常 60fps)。
比 setInterval() / setTimeout() 更流畅且不会无意义占用 CPU。
为什么不用 setInterval 做动画?
| 对比项 | requestAnimationFrame | setInterval / setTimeout |
|---|---|---|
| 刷新同步 | ✔ 自动与屏幕刷新同步(一般 60fps | ✘ 时间固定,不跟屏幕同步 |
| 流畅度 | ✔ 更流畅,无撕裂卡顿 | ✘ 偶尔掉帧、卡顿 |
| CPU 节能 | ✔ Tab 不可见自动暂停动画 | ✘ 即使页面隐藏也继续运行 |
| 延迟 | ✔ 更低 | ✘ setTimeout 最低 4ms(甚至更高) |
停止动画
requestAnimationFrame() 会返回 ID:
const id = requestAnimationFrame(loop);
停止方式:
cancelAnimationFrame(id);
常见用途
- DOM/CSS 动画(手写):例如元素淡出、移动、缩放。
- Canvas 动画:涟漪效果就可以用它实现。
- 游戏循环(Game Loop):比如 2D/3D 游戏引擎 (Three.js, Phaser) 都用它做渲染循环。
- 粒子动画:烟花、烟雾、下雨、波纹等。
- 物理动画:利用 timestamp 做速度、加速度模拟。
Top comments (0)