`。但是这种实践是问题丛生的,因为没有简单的方法可以轻松地用可编程的方法找到特定页面功能,例如主导航。
+例如,HTML5 提出了几种语义化标签用于定义常规页面的特性(例如 nav、footer 等等)。在这些标签可用之前,我们一般简单地用 div 带上 ID 抑或是 class 来解决问题,例如:`
`。但是这种实践是问题丛生的,因为没有简单的方法可以轻松地用可编程的方法找到特定页面功能,例如主导航。
最早的解决方案是加一个或者多个隐藏的链接来跳转到我们想要的位置,例如(这里用导航举例):
@@ -214,20 +214,20 @@ WAI-ARIA 给浏览器增加了 [`role`](https://www.w3.org/TR/wai-aria-1.1/#role
```
-我们的 JavaScript 从 [`XMLHttpRequest`](/zh-CN/docs/Web/API/XMLHttpRequest) 加载一个 JSON 文件里头包含了一系列的名人名言,一旦完成我们就开始用一个 [`setInterval()`](/zh-CN/docs/Web/API/WindowTimers/setInterval) 循环以十秒一次的频率显示出来。
+我们的 JavaScript 使用 {{domxref("Window.fetch", "fetch()")}} API 加载一个 JSON 文件(里头包含了一系列的名人名言),一旦完成我们就开始用一个 {{domxref("Window.setInterval", "setInterval()")}} 循环以十秒一次的频率显示出来。
```js
-var intervalID = window.setInterval(showQuote, 10000);
+const intervalID = setInterval(showQuote, 10000);
```
这当然是可行的,但是对于无障碍可不友善——这种内容变化是不会被屏幕阅读器察觉到的,所以用户不会发现发生了什么。这是一个简单的例子,但你可以想象一下:如果你开发的一个复杂 UI 而且内容频繁变化的应用,例如聊天室,或者一个策略游戏的界面,或者一个实时更新的购物车展示。如果没有某种方式提示用户有内容更新,那就不可能以任何有效的方式来使用应用。
幸运的是,WAI-ARIA 提供了一种有效的机制来发起提示——[`aria-live`](https://www.w3.org/TR/wai-aria-1.1/#aria-live)。将此应用于元素会让屏幕阅读器读出更新的内容。读取内容的紧急程度取决于属性值:
-- `off`: 默认值,更新不会提醒。
-- `polite`: 只有用户空闲的情况下提醒。
-- `assertive`: 尽快提醒。
-- `rude`: 会以打断用户操作的方式直接提醒。
+- `off`:默认值,更新不会提醒。
+- `polite`:只有用户空闲的情况下提醒。
+- `assertive`:尽快提醒。
+- `rude`:会以打断用户操作的方式直接提醒。
通常来说 `assertive` 设置足以让你的更新在显示时按时序读出,因此,如果改变多次,那么他只会念出最后一个改变。除非紧急程度高到需要覆盖其他的更新才选择使用 `rude` 。
@@ -333,7 +333,7 @@ var intervalID = window.setInterval(showQuote, 10000);
```js
function toggleMusician(bool) {
- var instruItem = formItems[formItems.length - 1];
+ const instruItem = formItems[formItems.length - 1];
if (bool) {
instruItem.input.disabled = false;
instruItem.label.style.color = "#000";
diff --git a/files/zh-cn/learn/javascript/client-side_web_apis/video_and_audio_apis/index.md b/files/zh-cn/learn/javascript/client-side_web_apis/video_and_audio_apis/index.md
index 5f5285c0c971d2..51792b33468f66 100644
--- a/files/zh-cn/learn/javascript/client-side_web_apis/video_and_audio_apis/index.md
+++ b/files/zh-cn/learn/javascript/client-side_web_apis/video_and_audio_apis/index.md
@@ -349,7 +349,7 @@ button:before {
1. 我们清除在快进功能上设置的所有类和时间间隔。这样做是因为如果我们在按下 `fwd`(快进)按钮后再按下 `rwd`(快退)按钮,就可以取消任何快进的功能并将其替换为快退功能。如果我们试图同时做到这两点,播放器就会暂停。
2. 使用 `if` 语句检查是否已在 `rwd` 按钮上设置了用来指示它已被按下的 `active` 类。{{domxref("classList")}} 是一个存在于每个元素上的非常方便的属性。它包含元素上设置的所有类的列表,以及添加/删除类的方法等。使用 `classList.contains()` 方法检查列表是否包含 `active` 类,将返回布尔值 `true`/`false` 结果。
3. 如果在 `rwd` 按钮上设置了 `active`,我们将使用 `classList.remove()` 删除它,清除第一次按下按钮时设置的时间间隔(参见下面的更多解释),并调用 {{domxref("HTMLMediaElement.play()")}} 取消快退并开始正常播放视频。
- 4. 如果尚未设置,使用 `classList.add()` 将 `active` 类添加到 `rwd` 按钮,调用 {{domxref("HTMLMediaElement.pause()")}} 暂停视频,然后设置 `intervalRwd` 变量为 {{domxref("setInterval()")}} 的调用结果。调用时,`setInterval()` 会创建一个时间间隔。这意味着它每隔 x 毫秒运行一个作为第一个参数给出的函数,其中 x 是第二个参数的值。所以这里我们每 200 毫秒运行一次 `windBackward()` 函数——我们将使用此函数不断快退视频。要停止 {{domxref("setInterval()")}} 运行,你必须调用 {{domxref("clearInterval()")}},并给出要清除的时间间隔的标识名,在本例中是变量名称 `intervalRwd`(请参阅函数中较早的一个 `clearInterval()` 调用)。
+ 4. 如果尚未设置,使用 `classList.add()` 将 `active` 类添加到 `rwd` 按钮,调用 {{domxref("HTMLMediaElement.pause()")}} 暂停视频,然后设置 `intervalRwd` 变量为 {{domxref("Window.setInterval", "setInterval()")}} 的调用结果。调用时,`setInterval()` 会创建一个时间间隔。这意味着它每隔 x 毫秒运行一个作为第一个参数给出的函数,其中 x 是第二个参数的值。所以这里我们每 200 毫秒运行一次 `windBackward()` 函数——我们将使用此函数不断快退视频。要停止 {{domxref("Window.setInterval", "setInterval()")}} 运行,你必须调用 {{domxref("Window.clearInterval", "clearInterval()")}},并给出要清除的时间间隔的标识名,在本例中是变量名称 `intervalRwd`(请参阅函数中较早的一个 `clearInterval()` 调用)。
3. 最后,对于本节,定义在 `setInterval()` 调用中需要调用的 `windBackward()` 和 `windForward()` 函数。在以上两个函数下面添加以下内容:
diff --git a/files/zh-cn/learn/performance/javascript/index.md b/files/zh-cn/learn/performance/javascript/index.md
index ac66ac02799ef9..47327bc3d9f3ac 100644
--- a/files/zh-cn/learn/performance/javascript/index.md
+++ b/files/zh-cn/learn/performance/javascript/index.md
@@ -239,7 +239,7 @@ async function main() {
对于关键的 DOM 动画,建议尽可能使用 [CSS 动画](/zh-CN/docs/Web/CSS/CSS_animations/Using_CSS_animations),而不是 JavaScript 动画([Web 动画 API](/zh-CN/docs/Web/API/Web_Animations_API) 提供了一种通过 JavaScript 直接连接到 CSS 动画的方式)。直接使用浏览器执行 DOM 动画而不是使用 JavaScript 操纵内联样式表的效率更高。另请参阅 [CSS 性能优化 > 处理动画](/zh-CN/docs/Learn/Performance/CSS#处理动画)。
-对于无法在 JavaScript 中处理的动画,例如在 HTML {{htmlelement("canvas")}} 上创建动画,建议使用 {{domxref("Window.requestAnimationFrame()")}} 而不是旧的选项,例如 {{domxref("setInterval()")}}。`requestAnimationFrame()` 方法专门设计用于高效、一致地处理动画帧,以获得流畅的用户体验。基本模式如下所示:
+对于无法在 JavaScript 中处理的动画,例如在 HTML {{htmlelement("canvas")}} 上创建动画,建议使用 {{domxref("Window.requestAnimationFrame()")}} 而不是旧的选项,例如 {{domxref("Window.setInterval()")}}。`requestAnimationFrame()` 方法专门设计用于高效、一致地处理动画帧,以获得流畅的用户体验。基本模式如下所示:
```js
function loop() {
diff --git a/files/zh-cn/mozilla/add-ons/webextensions/api/alarms/index.md b/files/zh-cn/mozilla/add-ons/webextensions/api/alarms/index.md
index ff1d1a381ed780..b0b43cba0c5c10 100644
--- a/files/zh-cn/mozilla/add-ons/webextensions/api/alarms/index.md
+++ b/files/zh-cn/mozilla/add-ons/webextensions/api/alarms/index.md
@@ -2,12 +2,12 @@
title: alarms
slug: Mozilla/Add-ons/WebExtensions/API/alarms
l10n:
- sourceCommit: eec174a08a5003da32f53e694c45eda3377b4d18
+ sourceCommit: b795bc99fc5c5d8a96c1b202a12750404085c28a
---
{{AddonSidebar}}
-在未来一个特定的时间运行的计划任务代码。这很像 [`setTimeout()`](/zh-CN/docs/Web/API/WindowTimers/setTimeout) 和 [`setInterval()`](/zh-CN/docs/Web/API/WindowTimers/setInterval),不过这些函数仅可以按需使用而不能在后台页面工作。
+在未来一个特定的时间运行的计划任务代码。这很像 [`setTimeout()`](/zh-CN/docs/Web/API/WindowTimers/setTimeout)、{{domxref("Window.setInterval()")}} 和 {{domxref("WorkerGlobalScope.setInterval()")}},不过这些函数仅可以按需使用而不能在后台页面工作。
闹钟不会在浏览器会话之间持续存在。它们在单个扩展的所有上下文中全局创建。例如,在后台脚本中创建的闹钟将在后台脚本、选项页面、弹出页面和扩展标签页中触发 [`onAlarm`](/zh-CN/docs/Mozilla/Add-ons/WebExtensions/API/alarms/onAlarm) 事件(反之亦然)。闹钟 API 在[内容脚本](/zh-CN/docs/Mozilla/Add-ons/WebExtensions/Content_scripts#webextension_apis)中不可用。
diff --git a/files/zh-cn/mozilla/add-ons/webextensions/content_scripts/index.md b/files/zh-cn/mozilla/add-ons/webextensions/content_scripts/index.md
index 10a8953ebd8b9d..cd371430a14a9c 100644
--- a/files/zh-cn/mozilla/add-ons/webextensions/content_scripts/index.md
+++ b/files/zh-cn/mozilla/add-ons/webextensions/content_scripts/index.md
@@ -600,22 +600,25 @@ In page script, window.x: 1
In page script, window.y: undefined
```
-上述内容同样适用于 [`setTimeout()`](/zh-CN/docs/Web/API/setTimeout), [`setInterval()`](/zh-CN/docs/Web/API/setInterval), and [`Function()`](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Function).
+上述内容同样适用于 [`setTimeout()`](/zh-CN/docs/Web/API/setTimeout)、{{domxref("Window.setInterval", "setInterval()")}} 和 [`Function()`](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Function)。
-当在页面的上下文中运行代码时,适用于上面所提到的"[Sharing content script objects with page scripts](/zh-CN/Add-ons/WebExtensions/Content_scripts#Sharing_objects_with_page_scripts)" 这一部分的警告:页面的环境可能会被恶意的网页所控制,这可能会导致你所交互的对象会有意想不到的行为:
-
-```js
-// page.js redefines console.log
-
-var original = console.log;
-
-console.log = function () {
- original(true);
-};
-```
-
-```js
-// content-script.js calls the redefined version
-
-window.eval("console.log(false)");
-```
+> [!WARNING]
+> 在页面的上下文中运行代码时要非常小心!
+>
+> 页面的环境由潜在的恶意网页控制,这些网页可以重新定义与你交互的对象,使其以意想不到的方式运行:
+>
+> ```js example-bad
+> // page.js 重新定义 console.log
+>
+> let original = console.log;
+>
+> console.log = () => {
+> original(true);
+> };
+> ```
+>
+> ```js example-bad
+> // content-script.js 调用了重新定义的版本
+>
+> window.eval("console.log(false)");
+> ```
diff --git a/files/zh-cn/web/api/canvas_api/tutorial/basic_animations/index.md b/files/zh-cn/web/api/canvas_api/tutorial/basic_animations/index.md
index 83932c1ba21b6e..8cdff690f48a3b 100644
--- a/files/zh-cn/web/api/canvas_api/tutorial/basic_animations/index.md
+++ b/files/zh-cn/web/api/canvas_api/tutorial/basic_animations/index.md
@@ -30,16 +30,16 @@ slug: Web/API/Canvas_API/Tutorial/Basic_animations
### 有安排地更新画布
-首先,可以用{{domxref("window.setInterval()")}}, {{domxref("window.setTimeout()")}},和{{domxref("window.requestAnimationFrame()")}}来设定定期执行一个指定函数。
+首先,可以用 {{domxref("Window.setInterval", "setInterval()")}}、{{domxref("window.setTimeout()")}} 和 {{domxref("Window.requestAnimationFrame", "requestAnimationFrame()")}} 来设定定期执行一个指定函数。
-- {{domxref("WindowTimers.setInterval", "setInterval(function, delay)")}}
+- {{domxref("Window.setInterval", "setInterval()")}}
- : 当设定好间隔时间后,function 会定期执行。
-- {{domxref("WindowTimers.setTimeout", "setTimeout(function, delay)")}}
+- {{domxref("setTimeout()")}}
- : 在设定好的时间之后执行函数
-- {{domxref("Window.requestAnimationFrame()", "requestAnimationFrame(callback)")}}
+- {{domxref("Window.requestAnimationFrame", "requestAnimationFrame()")}}
- : 告诉浏览器你希望执行一个动画,并在重绘之前,请求浏览器执行一个特定的函数来更新动画。
-如果你并不需要与用户互动,你可以使用 setInterval() 方法,它就可以定期执行指定代码。如果我们需要做一个游戏,我们可以使用键盘或者鼠标事件配合上 setTimeout() 方法来实现。通过设置事件监听,我们可以捕捉用户的交互,并执行相应的动作。
+如果你并不需要与用户互动,你可以使用 `setInterval()` 方法,它就可以定期执行指定代码。如果我们需要做一个游戏,我们可以使用键盘或者鼠标事件配合上 `setTimeout()` 方法来实现。通过设置事件监听,我们可以捕捉用户的交互,并执行相应的动作。
> [!NOTE]
> 下面的例子,采用 {{domxref("window.requestAnimationFrame()")}}实现动画效果。这个方法提供了更加平缓并更加有效率的方式来执行动画,当系统准备好了重绘条件的时候,才调用绘制动画帧。一般每秒钟回调函数执行 60 次,也有可能会被降低。想要了解更多关于动画循环的信息,尤其是游戏,可以在[Game development zone](/zh-CN/docs/Games) 参考这篇文章 [Anatomy of a video game](/zh-CN/docs/Games/Anatomy)。
diff --git a/files/zh-cn/web/api/canvas_api/tutorial/basic_usage/index.md b/files/zh-cn/web/api/canvas_api/tutorial/basic_usage/index.md
index 7252853cfab26e..a75f9aca37bf7e 100644
--- a/files/zh-cn/web/api/canvas_api/tutorial/basic_usage/index.md
+++ b/files/zh-cn/web/api/canvas_api/tutorial/basic_usage/index.md
@@ -105,7 +105,7 @@ if (canvas.getContext) {