From 7ea3fc3766504f6d743f9c3fe0ef34819e3aa82f Mon Sep 17 00:00:00 2001
From: Hoarfroster
Date: Wed, 24 Jul 2024 07:08:57 +0800
Subject: [PATCH 001/185] zh-CN: create Glossary/WindowProxy (#22237)
Co-authored-by: A1lo
---
files/zh-cn/glossary/windowproxy/index.md | 15 +++++++++++++++
1 file changed, 15 insertions(+)
create mode 100644 files/zh-cn/glossary/windowproxy/index.md
diff --git a/files/zh-cn/glossary/windowproxy/index.md b/files/zh-cn/glossary/windowproxy/index.md
new file mode 100644
index 00000000000000..54ecec0c59bd8e
--- /dev/null
+++ b/files/zh-cn/glossary/windowproxy/index.md
@@ -0,0 +1,15 @@
+---
+title: WindowProxy
+slug: Glossary/WindowProxy
+l10n:
+ sourceCommit: ada5fa5ef15eadd44b549ecf906423b4a2092f34
+---
+
+{{GlossarySidebar}}
+
+**`WindowProxy`** 对象是 [`Window`](/zh-CN/docs/Web/API/Window) 对象的包装器。`WindowProxy` 对象存在于每个[浏览上下文](/zh-CN/docs/Glossary/Browsing_context)中。对 `WindowProxy` 对象执行的所有操作也将应用于它当前包装的底层 `Window` 对象。因此,和 `WindowProxy` 对象直接交互几乎与直接和 `Window` 对象交互相同。当浏览上下文被导航时,其 `WindowProxy` 包装的 `Window` 对象会发生变化。
+
+## 参见
+
+- HTML 规范:[WindowProxy 小节](https://html.spec.whatwg.org/multipage/window-object.html#the-windowproxy-exotic-object)
+- Stack Overflow 问题:[WindowProxy 与 Window 对象?](https://stackoverflow.com/questions/16092835/windowproxy-and-window-objects)
From 84e4e31c48958201d98016bc84247364936da097 Mon Sep 17 00:00:00 2001
From: Hoarfroster
Date: Wed, 24 Jul 2024 07:12:29 +0800
Subject: [PATCH 002/185] zh-CN: update Glossary/Viewport (#22253)
Co-authored-by: A1lo
---
files/zh-cn/glossary/viewport/index.md | 11 +++++++++--
1 file changed, 9 insertions(+), 2 deletions(-)
diff --git a/files/zh-cn/glossary/viewport/index.md b/files/zh-cn/glossary/viewport/index.md
index fcfd130fcb45d0..93d6e003a841d5 100644
--- a/files/zh-cn/glossary/viewport/index.md
+++ b/files/zh-cn/glossary/viewport/index.md
@@ -1,14 +1,21 @@
---
-title: Viewport
+title: 视口
slug: Glossary/Viewport
+l10n:
+ sourceCommit: 50e5e8a9b8a6b7d0dd9877610c9639d8b90f329f
---
{{GlossarySidebar}}
在电脑图形学里面,视口代表了一个可看见的多边形区域(通常来说是矩形)。在浏览器范畴里,它代表的是浏览器中网站可见内容的部分。视口外的内容在被滚动进来前都是不可见的。
-视口当前可见的部分叫做**可视视口**(visual viewport)。可视视口可能会比**布局视口**(layout viewport)更小,因为当用户缩小浏览器缩放比例时,布局视口不变,而可视视口变小了。
+视口当前可见的部分叫做[**可视视口**](/zh-CN/docs/Glossary/Visual_viewport)。可视视口可能会比[**布局视口**](/zh-CN/docs/Glossary/Layout_viewport)更小,因为当用户缩小浏览器缩放比例时,布局视口不变,而可视视口变小了。
## 参见
+- [可视视口 API](/zh-CN/docs/Web/API/Visual_Viewport_API)
- 维基百科上的[视口](https://zh.wikipedia.org/wiki/视口)
+- [两个视口的故事](https://www.quirksmode.org/mobile/viewports.html)(Quirksmode)
+- 相关术语:
+ - {{Glossary("Visual viewport", "可视视口")}}
+ - {{Glossary("Layout viewport", "布局视口")}}
From c600a2907786af7359aadb004f8c28d0a60a93a8 Mon Sep 17 00:00:00 2001
From: Hoarfroster
Date: Wed, 24 Jul 2024 07:13:07 +0800
Subject: [PATCH 003/185] zh-CN: create Glossary/TypeScript (#22270)
Co-authored-by: A1lo
---
files/zh-cn/glossary/typescript/index.md | 41 ++++++++++++++++++++++++
1 file changed, 41 insertions(+)
create mode 100644 files/zh-cn/glossary/typescript/index.md
diff --git a/files/zh-cn/glossary/typescript/index.md b/files/zh-cn/glossary/typescript/index.md
new file mode 100644
index 00000000000000..8b0750c331547e
--- /dev/null
+++ b/files/zh-cn/glossary/typescript/index.md
@@ -0,0 +1,41 @@
+---
+title: TypeScript
+slug: Glossary/TypeScript
+l10n:
+ sourceCommit: 8005d92738cb5678d9b1e434f02ddebaa15c1eaa
+---
+
+{{GlossarySidebar}}
+
+TypeScript 是一个为 JavaScript 添加{{glossary("static_typing", "静态类型检查")}}的编程语言。
+
+TypeScript 是 JavaScript 的超集,这意味着 JavaScript 中所具有的一切也都可以在 TypeScript 中使用,而且每个 JavaScript 程序都是语法合法的 TypeScript 程序。此外,TypeScript 和 JavaScript 的运行时行为是相同的。
+
+然而,TypeScript 添加了编译时类型检查,实现了关于不同类型如何使用和组合的规则。这可以捕获在 JavaScript 中只有在运行时才会遇到的各种编程错误。
+
+一些类型规则是从 JavaScript 中推断出来的。例如,在下面的代码中,TypeScript 推断 `myVariable` 是一个字符串,因此不允许将其重新赋值为不同的类型:
+
+```ts
+let myVariable = "Hello World";
+myVariable = 1;
+// 错误:
+// Type 'number' is not assignable to type 'string'.
+```
+
+TypeScript 还允许程序员对其代码进行注释,以指示例如函数的参数类型或对象的属性:
+
+```ts
+function add(left: number, right: number): number {
+ return left + right;
+}
+
+add("hello", "world");
+// 错误:
+// Argument of type 'string' is not assignable to parameter of type 'number'.
+```
+
+编译后,类型注释会被移除,使得编译输出只是 JavaScript,这意味着它可以在任何 JavaScript 运行时中执行。
+
+## 参见
+
+- [TypeScript 官网](https://www.typescriptlang.org/)
From 99ed4bcbd2ba31d283f36910e015d8430d9ec97e Mon Sep 17 00:00:00 2001
From: Hoarfroster
Date: Wed, 24 Jul 2024 07:13:40 +0800
Subject: [PATCH 004/185] zh-CN: create Glossary/Wrapper (#22238)
Co-authored-by: A1lo
---
files/zh-cn/glossary/wrapper/index.md | 21 +++++++++++++++++++++
1 file changed, 21 insertions(+)
create mode 100644 files/zh-cn/glossary/wrapper/index.md
diff --git a/files/zh-cn/glossary/wrapper/index.md b/files/zh-cn/glossary/wrapper/index.md
new file mode 100644
index 00000000000000..6475454b2d5a09
--- /dev/null
+++ b/files/zh-cn/glossary/wrapper/index.md
@@ -0,0 +1,21 @@
+---
+title: 包装器
+slug: Glossary/Wrapper
+l10n:
+ sourceCommit: 50e5e8a9b8a6b7d0dd9877610c9639d8b90f329f
+---
+
+{{GlossarySidebar}}
+
+在诸如 JavaScript 之类的编程语言中,包装器是一种函数,旨在调用一个或多个其他函数,有时纯粹是为了方便,有时是为了在此过程中使它们执行略有不同的任务。
+
+例如,AWS 的 SDK 库就是包装器的例子。
+
+## 参见
+
+- 维基百科上的[包装函数](https://zh.wikipedia.org/wiki/包裝函式)
+- 相关术语:
+
+ - {{Glossary("API")}}
+ - {{Glossary("Class", "类")}}
+ - {{Glossary("Function", "函数")}}
From 0b796a30966537d324d7777ac9b6037df5e6d5d8 Mon Sep 17 00:00:00 2001
From: Hoarfroster
Date: Wed, 24 Jul 2024 07:13:57 +0800
Subject: [PATCH 005/185] zh-CN: create Glossary/WCAG (#22249)
Co-authored-by: A1lo
---
files/zh-cn/glossary/wcag/index.md | 28 ++++++++++++++++++++++++++++
1 file changed, 28 insertions(+)
create mode 100644 files/zh-cn/glossary/wcag/index.md
diff --git a/files/zh-cn/glossary/wcag/index.md b/files/zh-cn/glossary/wcag/index.md
new file mode 100644
index 00000000000000..494d6cdf5241c8
--- /dev/null
+++ b/files/zh-cn/glossary/wcag/index.md
@@ -0,0 +1,28 @@
+---
+title: WCAG
+slug: Glossary/WCAG
+l10n:
+ sourceCommit: 3163ae00b0d8ac11dc752ea9f7d956bd00551a3e
+---
+
+{{GlossarySidebar}}
+
+_Web 内容无障碍指南_(**WCAG**)是由 {{Glossary("W3C")}} {{Glossary("WAI","Web 无障碍倡议")}}组发布的一些建议。它们概述了一组主要面向残障人士的内容无障碍指南,但也适用于移动电话等资源有限的设备。
+
+WCAG 2.0 于 2008 年 12 月 11 日发布,取代了 WCAG 1.0。它由 12 条指南组成,分为 4 个原则(可感知、可操作、可理解和健壮性),每个指南都有可测试的成功标准。
+
+WCAG 使用三个一致性水平:
+
+- 优先级 1:Web 开发人员**必须**满足这些要求,否则将无法让一个或多个群体访问 Web 内容。符合此级别的描述为 A。
+- 优先级 2:Web 开发人员**应该**满足这些要求,否则一些群体将发现访问 Web 内容变得困难。符合此级别的描述为 AA 或双 A。
+- 优先级 3:Web 开发人员**可以**满足这些要求,以便让一些群体更容易访问 Web 内容。符合此级别的描述为 AAA 或三 A。
+
+[WCAG 2.2](https://www.w3.org/TR/WCAG22/) 和 [WCAG 3.0](https://www.w3.org/TR/wcag-3.0/) 的工作正在进行中。
+
+## 参见
+
+- 维基百科上的 [WCAG](https://zh.wikipedia.org/wiki/Web内容无障碍指南)
+- [MDN 上的无障碍信息](/zh-CN/docs/Web/Accessibility/Information_for_Web_authors)
+- [W3C 上的 WCAG 2.0 推荐标准](https://www.w3.org/Translations/WCAG20-zh/)
+- [Web 内容无障碍指南(WCAG)2.2:候选推荐标准](https://www.w3.org/TR/WCAG22/)
+- [W3C 内容无障碍指南(WCAG)3.0:工作草案](https://www.w3.org/TR/wcag-3.0/)
From 0d81dd54bb835dafb0610ad7113b7fa50a9147ce Mon Sep 17 00:00:00 2001
From: Tianyi Tao
Date: Wed, 24 Jul 2024 14:00:33 +0800
Subject: [PATCH 006/185] [zh-cn]: create the translation of
`CanvasRenderingContext2D.fontVariantCaps` property (#21951)
Co-authored-by: skyclouds2001 <95597335+skyclouds2001@users.noreply.github.com>
Co-authored-by: A1lo
---
.../fontvariantcaps/index.md | 92 +++++++++++++++++++
1 file changed, 92 insertions(+)
create mode 100644 files/zh-cn/web/api/canvasrenderingcontext2d/fontvariantcaps/index.md
diff --git a/files/zh-cn/web/api/canvasrenderingcontext2d/fontvariantcaps/index.md b/files/zh-cn/web/api/canvasrenderingcontext2d/fontvariantcaps/index.md
new file mode 100644
index 00000000000000..cb203e091f1e16
--- /dev/null
+++ b/files/zh-cn/web/api/canvasrenderingcontext2d/fontvariantcaps/index.md
@@ -0,0 +1,92 @@
+---
+title: CanvasRenderingContext2D:fontVariantCaps 属性
+slug: Web/API/CanvasRenderingContext2D/fontVariantCaps
+l10n:
+ sourceCommit: 44cf523714745d626317192bfbe849b47144f3ab
+---
+
+{{APIRef}}
+
+[Canvas API](/zh-CN/docs/Web/API/Canvas_API) 的 `CanvasRenderingContext2D.fontVariantCaps` 属性用于指定渲染文本的替代大写形式。
+
+该属性对应于 CSS 中的 [`font-variant-caps`](/zh-CN/docs/Web/CSS/font-variant-caps) 属性。
+
+## 值
+
+字体的替代大写形式值,可以是以下之一:
+
+- `normal`(默认)
+ - : 停用替代字形。
+- `small-caps`
+ - : 启用小型大写字母(small capital)的显示(OpenType 特性:`smcp`)。小型大写字形通常使用大写字母的形式,但大小与小写字母相同。
+- `all-small-caps`
+ - : 同时为大写和小写字母启用小型大写字母(small capital)的显示(OpenType 特性:`c2sc`、`smcp`)。
+- `petite-caps`
+ - : 启用小型大写字母(petite capital)的显示(OpenType 特性:`pcap`)。
+- `all-petite-caps`
+ - : 同时为大写和小写字母启用小型大写字母(petite capital)的显示(OpenType 特性:`c2pc`、`pcap`)。
+- `unicase`
+ - : 启用将大写字母显示为小型大写字母(small capital),同时正常显示小写字母的混合显示(OpenType 特性:`unic`)。
+- `titling-caps`
+ - : 启用标题大写字母的显示(OpenType 特性:`titl`)。大写字母字形通常设计用于与小写字母配合使用。在全大写的标题序列中使用时,它们可能显得过于强烈。标题大写字母是专为这种情况而设计的。
+
+该属性可以用于获取或设置字体的大写值。
+
+请注意,某些内容可能会引发无障碍问题,具体内容请参阅相应的 [`font-variant-caps`](/zh-CN/docs/Web/CSS/font-variant-caps#无障碍访问风险) 主题。
+
+## 示例
+
+以下示例演示了使用 `fontVariantCaps` 属性支持的每种值来显示文本“Hello World”。每种情况还通过读取属性来显示其值。
+
+### HTML
+
+```html
+
+```
+
+### JavaScript
+
+```js
+const canvas = document.getElementById("canvas");
+const ctx = canvas.getContext("2d");
+ctx.font = "20px serif";
+
+// 默认值(normal)
+ctx.fillText(`Hello world(默认:${ctx.fontVariantCaps})`, 5, 20);
+
+// 大写形式:small-caps
+ctx.fontVariantCaps = "small-caps";
+ctx.fillText(`Hello world(${ctx.fontVariantCaps})`, 5, 50);
+
+// 大写形式:all-small-caps
+ctx.fontVariantCaps = "all-small-caps";
+ctx.fillText(`Hello world(${ctx.fontVariantCaps})`, 5, 80);
+
+// 大写形式:petite-caps
+ctx.fontVariantCaps = "petite-caps";
+ctx.fillText(`Hello world(${ctx.fontVariantCaps})`, 5, 110);
+
+// 大写形式:all-petite-caps
+ctx.fontVariantCaps = "all-petite-caps";
+ctx.fillText(`Hello world(${ctx.fontVariantCaps})`, 5, 140);
+
+// 大写形式:unicase
+ctx.fontVariantCaps = "unicase";
+ctx.fillText(`Hello world(${ctx.fontVariantCaps})`, 5, 170);
+
+// 大写形式:titling-caps
+ctx.fontVariantCaps = "titling-caps";
+ctx.fillText(`Hello world(${ctx.fontVariantCaps})`, 5, 200);
+```
+
+### 结果
+
+{{ EmbedLiveSample('示例', 700, 230) }}
+
+## 规范
+
+{{Specifications}}
+
+## 浏览器兼容性
+
+{{Compat}}
From bc4714fa7a440d4df15b81e2d12ed0956f8b49f1 Mon Sep 17 00:00:00 2001
From: Hoarfroster
Date: Wed, 24 Jul 2024 14:26:29 +0800
Subject: [PATCH 007/185] zh-CN: create Glossary/WebVTT (#22236)
Co-authored-by: A1lo
---
files/zh-cn/glossary/webvtt/index.md | 18 ++++++++++++++++++
1 file changed, 18 insertions(+)
create mode 100644 files/zh-cn/glossary/webvtt/index.md
diff --git a/files/zh-cn/glossary/webvtt/index.md b/files/zh-cn/glossary/webvtt/index.md
new file mode 100644
index 00000000000000..ade2f03db742d6
--- /dev/null
+++ b/files/zh-cn/glossary/webvtt/index.md
@@ -0,0 +1,18 @@
+---
+title: WebVTT
+slug: Glossary/WebVTT
+l10n:
+ sourceCommit: ada5fa5ef15eadd44b549ecf906423b4a2092f34
+---
+
+{{GlossarySidebar}}
+
+WebVTT(Web 视频文本轨道)是一种 {{Glossary("W3C")}} 规范的用于和 HTML 的 {{HTMLElement("track")}} 元素一起标记文本轨道资源的文件格式。
+
+WebVTT 文件提供了与音频或视频内容同步的元数据,如视频内容的字幕或标题、视频描述的文本、内容导航的章节等。
+
+## 参见
+
+- 维基百科上的 [WebVTT](https://zh.wikipedia.org/wiki/WebVTT)
+- MDN 上的 [WebVTT](/zh-CN/docs/Web/API/WebVTT_API)
+- [规范](https://www.w3.org/TR/webvtt1/)
From f6b29423f1c76ec50925a9286929bba7d43a4a8a Mon Sep 17 00:00:00 2001
From: Tianyi Tao
Date: Wed, 24 Jul 2024 14:44:29 +0800
Subject: [PATCH 008/185] [zh-cn]: update the translation of
`CanvasRenderingContext2D.bezierCurveTo()` method (#21985)
Co-authored-by: A1lo
---
.../beziercurveto/index.md | 123 +++++++++---------
1 file changed, 63 insertions(+), 60 deletions(-)
diff --git a/files/zh-cn/web/api/canvasrenderingcontext2d/beziercurveto/index.md b/files/zh-cn/web/api/canvasrenderingcontext2d/beziercurveto/index.md
index 03c0cb03745a9d..698605fe6c911b 100644
--- a/files/zh-cn/web/api/canvasrenderingcontext2d/beziercurveto/index.md
+++ b/files/zh-cn/web/api/canvasrenderingcontext2d/beziercurveto/index.md
@@ -1,16 +1,18 @@
---
-title: CanvasRenderingContext2D.bezierCurveTo()
+title: CanvasRenderingContext2D:bezierCurveTo() 方法
slug: Web/API/CanvasRenderingContext2D/bezierCurveTo
+l10n:
+ sourceCommit: 1f216a70d94c3901c5767e6108a29daa48edc070
---
{{APIRef}}
-**`CanvasRenderingContext2D.bezierCurveTo()`** 是 Canvas 2D API 绘制三次贝赛尔曲线路径的方法。该方法需要三个点。第一、第二个点是控制点,第三个点是结束点。起始点是当前路径的最后一个点,绘制贝赛尔曲线前,可以通过调用 `moveTo()` 进行修改。
+Canvas 2D API 的 **`CanvasRenderingContext2D.bezierCurveTo()`** 方法用于将三次[贝赛尔曲线](/zh-CN/docs/Glossary/Bezier_curve)添加到当前子路径中。该方法需要三个点:前两个点是控制点,第三个点是结束点。起始点是当前路径的最后一个点,绘制贝赛尔曲线前,可以通过调用 {{domxref("CanvasRenderingContext2D.moveTo", "moveTo()")}} 进行修改。
## 语法
-```
-void ctx.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y);
+```js-nolint
+bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y)
```
### 参数
@@ -28,11 +30,15 @@ void ctx.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y);
- `y`
- : 结束点的 y 轴坐标。
+### 返回值
+
+无({{jsxref("undefined")}})。
+
## 示例
-### 使用 `bezierCurveTo` 方法
+### 如何使用 bezierCurveTo 方法
-这是一段绘制贝赛尔曲线的简单的代码片段。控制点是红色的,开始和结束点是蓝色的。
+此示例展示了如何绘制三次贝塞尔曲线。
#### HTML
@@ -43,75 +49,72 @@ void ctx.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y);
#### JavaScript
```js
-var canvas = document.getElementById("canvas");
-var ctx = canvas.getContext("2d");
+// 定义画布和上下文
+const canvas = document.getElementById("canvas");
+const ctx = canvas.getContext("2d");
+// 定义点的坐标 {x, y}
+let start = { x: 50, y: 20 };
+let cp1 = { x: 230, y: 30 };
+let cp2 = { x: 150, y: 80 };
+let end = { x: 250, y: 100 };
+
+// 三次贝塞尔曲线
ctx.beginPath();
-ctx.moveTo(50, 20);
-ctx.bezierCurveTo(230, 30, 150, 60, 50, 100);
+ctx.moveTo(start.x, start.y);
+ctx.bezierCurveTo(cp1.x, cp1.y, cp2.x, cp2.y, end.x, end.y);
ctx.stroke();
+// 起点和终点
ctx.fillStyle = "blue";
-// start point
-ctx.fillRect(50, 20, 10, 10);
-// end point
-ctx.fillRect(50, 100, 10, 10);
+ctx.beginPath();
+ctx.arc(start.x, start.y, 5, 0, 2 * Math.PI); // 起点
+ctx.arc(end.x, end.y, 5, 0, 2 * Math.PI); // 终点
+ctx.fill();
+// 控制点
ctx.fillStyle = "red";
-// control point one
-ctx.fillRect(230, 30, 10, 10);
-// control point two
-ctx.fillRect(150, 70, 10, 10);
+ctx.beginPath();
+ctx.arc(cp1.x, cp1.y, 5, 0, 2 * Math.PI); // 控制点一
+ctx.arc(cp2.x, cp2.y, 5, 0, 2 * Math.PI); // 控制点二
+ctx.fill();
```
-{{ EmbedLiveSample('使用_bezierCurveTo_方法', 315, 165) }}
+#### 结果
-### 尝试 `bezierCurveTo` 参数
+在这个例子中,控制点是红色的,起点和终点是蓝色的。
-修改下面的代码并在线查看 canvas 的变化:
+{{ EmbedLiveSample('如何使用_bezierCurveTo_方法', 315, 165) }}
-```html hidden
-
-
-
-
-
-
+### 简单的贝塞尔曲线
+
+此示例使用 `bezierCurveTo()` 绘制了一条简单的贝塞尔曲线。
+
+#### HTML
+
+```html
+
```
-```js hidden
-var canvas = document.getElementById("canvas");
-var ctx = canvas.getContext("2d");
-var textarea = document.getElementById("code");
-var reset = document.getElementById("reset");
-var edit = document.getElementById("edit");
-var code = textarea.value;
-
-function drawCanvas() {
- ctx.clearRect(0, 0, canvas.width, canvas.height);
- eval(textarea.value);
-}
-
-reset.addEventListener("click", function () {
- textarea.value = code;
- drawCanvas();
-});
-
-edit.addEventListener("click", function () {
- textarea.focus();
-});
-
-textarea.addEventListener("input", drawCanvas);
-window.addEventListener("load", drawCanvas);
+#### JavaScript
+
+曲线从指定的起点开始,使用 `moveTo()` 方法:(30, 30)。第一个控制点位于 (120, 160),第二个控制点位于 (180, 10)。曲线在 (220, 140) 结束。
+
+```js
+const canvas = document.getElementById("canvas");
+const ctx = canvas.getContext("2d");
+
+ctx.beginPath();
+ctx.moveTo(30, 30);
+ctx.bezierCurveTo(120, 160, 180, 10, 220, 140);
+ctx.stroke();
```
-{{ EmbedLiveSample('尝试_bezierCurveTo_参数', 700, 360) }}
+#### 结果
+
+{{ EmbedLiveSample('简单的贝塞尔曲线', 700, 180) }}
-## 规范描述
+## 规范
{{Specifications}}
@@ -121,5 +124,5 @@ window.addEventListener("load", drawCanvas);
## 参见
-- 接口定义, {{domxref("CanvasRenderingContext2D")}}
-- [维基百科关于贝赛尔曲线](http://en.wikipedia.org/wiki/B%C3%A9zier_curve)。
+- 定义此方法的接口:{{domxref("CanvasRenderingContext2D")}}
+- [贝赛尔曲线](/zh-CN/docs/Glossary/Bezier_curve)
From ff6dde4a15179f087dc2a6f923d60ba66e3156cb Mon Sep 17 00:00:00 2001
From: Jongha Kim
Date: Wed, 24 Jul 2024 15:48:22 +0900
Subject: [PATCH 009/185] =?UTF-8?q?[ko]=20RegExp.$1,=20=E2=80=A6,=20RegExp?=
=?UTF-8?q?.$9=20=EC=8B=A0=EA=B7=9C=20=EB=B2=88=EC=97=AD=20=EC=99=B8=20(#2?=
=?UTF-8?q?2507)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* [ko] RegExp.$1, …, RegExp.$9 신규 번역 외
- RegExp.$1, …, RegExp.$9 신규 번역
- Math.E
* 린트 에러 수정
---
.../reference/global_objects/math/e/index.md | 20 +++++--
.../global_objects/regexp/n/index.md | 52 +++++++++++++++++++
2 files changed, 67 insertions(+), 5 deletions(-)
create mode 100644 files/ko/web/javascript/reference/global_objects/regexp/n/index.md
diff --git a/files/ko/web/javascript/reference/global_objects/math/e/index.md b/files/ko/web/javascript/reference/global_objects/math/e/index.md
index 79280d323ed466..f328a096161021 100644
--- a/files/ko/web/javascript/reference/global_objects/math/e/index.md
+++ b/files/ko/web/javascript/reference/global_objects/math/e/index.md
@@ -1,19 +1,29 @@
---
title: Math.E
slug: Web/JavaScript/Reference/Global_Objects/Math/E
+l10n:
+ sourceCommit: 761b9047d78876cbd153be811efb1aa77b419877
---
{{JSRef}}
-**`Math.E`** 속성은 자연로그의 밑 값 e를 나타내며 약 2.718의 값을 가집니다.
+**`Math.E`** 정적 데이터 속성은 오일러 수를 의미하며, 자연로그의 밑 값 e를 나타내며 약 2.718의 값을 가집니다.
-Math.E = e ≈ 2.718 \mathtt{\mi{Math.E}} = e \approx 2.718
+{{EmbedInteractiveExample("pages/js/math-e.html")}}
-{{EmbedInteractiveExample("pages/js/math-e.html")}}{{js_property_attributes(0, 0, 0)}}
+## 값
+
+
+
+ 𝙼𝚊𝚝𝚑.𝙴 = e ≈ 2.718 \mathtt{Math.E} = e \approx 2.718
+
+
+
+{{js_property_attributes(0, 0, 0)}}
## 설명
-`E`는 `Math`의 정적 속성이므로, 사용자가 생성한 `Math` 객체의 속성으로 접근할 수 없고 항상 `Math.E`를 사용해야 합니다. (`Math`는 생성자가 아닙니다)
+`E`는 `Math`의 정적 속성이므로, 생성한 `Math` 객체(`Math`는 생성자가 아닙니다)의 속성 대신 항상 `Math.E`를 사용해야 합니다.
## 예제
@@ -29,7 +39,7 @@ function getNapier() {
getNapier(); // 2.718281828459045
```
-## 명세
+## 명세서
{{Specifications}}
diff --git a/files/ko/web/javascript/reference/global_objects/regexp/n/index.md b/files/ko/web/javascript/reference/global_objects/regexp/n/index.md
new file mode 100644
index 00000000000000..62d84e51e4d596
--- /dev/null
+++ b/files/ko/web/javascript/reference/global_objects/regexp/n/index.md
@@ -0,0 +1,52 @@
+---
+title: RegExp.$1, …, RegExp.$9
+slug: Web/JavaScript/Reference/Global_Objects/RegExp/n
+l10n:
+ sourceCommit: fb85334ffa4a2c88d209b1074909bee0e0abd57a
+---
+
+{{JSRef}} {{Deprecated_Header}}
+
+> **참고:** 마지막 일치 상태를 전역적으로 노출하는 모든 `RegExp` 정적 속성은 더 이상 사용되지 않습니다. 자세한 내용은 [더 이상 사용되지 않는 RegExp 기능](/ko/docs/Web/JavaScript/Reference/Deprecated_and_obsolete_features#regexp)을 참고하세요.
+
+**`RegExp.$1, …, RegExp.$9`** 정적 접근자 속성은 괄호 안의 하위 문자열 일치 항목을 반환합니다.
+
+## 설명
+
+`$1`–`$9`는 {{jsxref("RegExp")}}의 정적 속성이기 때문에, 생성한 `RegExp` 객체의 속성으로 사용하는 것보다는 항상`RegExp.$1`, `RegExp.$2` 등으로 사용해야 합니다.
+
+`$1, …, $9`의 값은 `RegExp`(`RegExp` 하위 클래스 제외) 인스턴스가 일치에 성공할 때마다 갱신됩니다. 일치하는 항목이 없거나 마지막 일치가 대응되는 캡쳐 그룹이 없으면 각각의 속성은 빈 문자열입니다. 각각의 속성의 설정 접근자는 `undefined`이므로 이 속성을 직접 변경할 수 없습니다.
+
+괄호로 묶을 수 있는 하위 문자열의 개수는 제한이 없지만 `RegExp` 객체는 처음 9개만 보유할 수 있습니다. 반환된 배열의 인덱스를 통해 괄호로 묶인 모든 하위 문자열에 접근할 수 있습니다.
+
+`$1, …, $9`는 {{jsxref("String.prototype.replace()")}}의 대체 문자열에도 사용할 수 있지만, 이는 `RegExp.$n` 레거시 속성과는 관련이 없습니다.
+
+## 예제
+
+### RegExp.prototype.test()와 함께 $n 사용하기
+
+아래 스크립트는 일반적인 문자열 내에서 숫자를 잡아내기 위해 {{jsxref("RegExp.prototype.test()")}} 메서드를 사용합니다.
+
+```js
+const str = "Test 24";
+const number = /(\d+)/.test(str) ? RegExp.$1 : "0";
+number; // "24"
+```
+
+`re.test(str)` 호출과 `RegExp.$n` 속성 사이에 다른 정규식을 사용하는 작업은 부작용이 있을 수 있습니다. 이러한 특수 속성 접근은 즉시 수행해야 하며, 그렇지 않으면 예상치 못한 결과가 발생할 수 있다는 점을 주의하시기 바랍니다.
+
+## 명세서
+
+{{Specifications}}
+
+## 브라우저 호환성
+
+{{Compat}}
+
+## 같이 보기
+
+- {{jsxref("RegExp/input", "RegExp.input ($_)")}}
+- {{jsxref("RegExp/lastMatch", "RegExp.lastMatch ($&)")}}
+- {{jsxref("RegExp/lastParen", "RegExp.lastParen ($+)")}}
+- {{jsxref("RegExp/leftContext", "RegExp.leftContext ($`)")}}
+- {{jsxref("RegExp/rightContext", "RegExp.rightContext ($')")}}
From cb04775bd635873bcd1c0856e24307da19e2ddd2 Mon Sep 17 00:00:00 2001
From: Hoarfroster
Date: Wed, 24 Jul 2024 16:06:15 +0800
Subject: [PATCH 010/185] zh-CN: update Glossary/URL (#22265)
---
files/zh-cn/glossary/url/index.md | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/files/zh-cn/glossary/url/index.md b/files/zh-cn/glossary/url/index.md
index 6a3d6cd304bbb7..957e526970453b 100644
--- a/files/zh-cn/glossary/url/index.md
+++ b/files/zh-cn/glossary/url/index.md
@@ -1,15 +1,17 @@
---
title: URL
slug: Glossary/URL
+l10n:
+ sourceCommit: 731e5ba6630a220c24b22288b58af70495063555
---
{{GlossarySidebar}}
-统一资源定位器(**URL**)是指定在 Internet 上可以找到资源的位置的文本字符串。
+**统一资源定位符**(**URL**)是指定在互联网上可以找到资源的位置的文本字符串。
-在 {{Glossary("HTTP")}} 的上下文中,URL 被叫做”网络地址“或“链接”。你的浏览器在其地址栏显示 URL,例如 `https://developer.mozilla.org`
+在 {{Glossary("HTTP")}} 的上下文中,URL 被叫做”网络地址“或“链接”。{{glossary("browser", "浏览器")}}在其地址栏显示 URL,例如 `https://developer.mozilla.org`。一些浏览器仅显示 URL 中在“//”之后的部分(即{{Glossary("Domain name", "域名")}})。
-URL 也可用于文件传输({{Glossary("FTP")}}) ,电子邮件({{Glossary("SMTP")}})和其他应用。
+URL 也可用于文件传输({{Glossary("FTP")}})、电子邮件({{Glossary("SMTP")}})和其他应用。
## 参见
From 3a26b6b234c4c75fa0dcc06f04e8da2037f345f4 Mon Sep 17 00:00:00 2001
From: Hoarfroster
Date: Wed, 24 Jul 2024 17:47:07 +0800
Subject: [PATCH 011/185] zh-CN: update Glossary/URI (#22264)
Co-authored-by: A1lo
---
files/zh-cn/glossary/uri/index.md | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/files/zh-cn/glossary/uri/index.md b/files/zh-cn/glossary/uri/index.md
index e37ffa7adc622b..39b0ee175356ef 100644
--- a/files/zh-cn/glossary/uri/index.md
+++ b/files/zh-cn/glossary/uri/index.md
@@ -1,13 +1,17 @@
---
title: URI
slug: Glossary/URI
+l10n:
+ sourceCommit: ada5fa5ef15eadd44b549ecf906423b4a2092f34
---
{{GlossarySidebar}}
-**URI**(统一资源标识符)是一个指向资源的字符串。最通常用在 {{Glossary("URL")}} 上来指定 Web 上资源文件的具体位置。相比之下,{{Glossary("URN")}} 是在给定的命名空间用名字指向具体的资源,如:书本的 ISBN。
+**URI**(统一资源标识符)是一个指向资源的字符串。
+
+最通常用在 {{Glossary("URL")}} 上来指定 Web 上资源文件的具体位置。相比之下,{{Glossary("URN")}} 是在给定的命名空间用名字指向具体的资源,如书本的 ISBN。
## 参见
- 在维基百科上的 [URI](https://zh.wikipedia.org/wiki/URI)
-- [RFC 3986 on URI](https://tools.ietf.org/html/rfc3986)
+- [关于 URI 的 RFC 3986](https://tools.ietf.org/html/rfc3986)
From 4db48c2d11c0151c936bdfdfb0b3a66f6b8ce55a Mon Sep 17 00:00:00 2001
From: Masahiro FUJIMOTO
Date: Wed, 17 Jul 2024 23:11:28 +0900
Subject: [PATCH 012/185] =?UTF-8?q?2024/05/07=20=E6=99=82=E7=82=B9?=
=?UTF-8?q?=E3=81=AE=E8=8B=B1=E8=AA=9E=E7=89=88=E3=81=AB=E5=9F=BA=E3=81=A5?=
=?UTF-8?q?=E3=81=8D=E6=9B=B4=E6=96=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
files/ja/web/api/event/preventdefault/index.md | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/files/ja/web/api/event/preventdefault/index.md b/files/ja/web/api/event/preventdefault/index.md
index 0a456f9300dda6..de87e93e0aec1b 100644
--- a/files/ja/web/api/event/preventdefault/index.md
+++ b/files/ja/web/api/event/preventdefault/index.md
@@ -3,10 +3,10 @@ title: "Event: preventDefault() メソッド"
short-title: preventDefault()
slug: Web/API/Event/preventDefault
l10n:
- sourceCommit: 32b07aa5b6ac4799a88e7b87a4d8333643ab6427
+ sourceCommit: 15f0b5552bc9c2ea1f32b0cd5ee840a7d43c887e
---
-{{apiref("DOM")}}
+{{APIRef("DOM")}}{{AvailableInWorkers}}
**`preventDefault()`** は {{domxref("Event")}} インターフェイスのメソッドで、{{Glossary("user agent", "ユーザーエージェント")}}に、このイベントが明示的に処理されない場合に、その既定のアクションを通常どおりに行うべきではないことを伝えます。
@@ -78,7 +78,7 @@ function checkboxClick(event) {
#### CSS
-ユーザが無効なキーを押したときに描画する警告ボックスには、CSS を少し使用します。
+ユーザーが無効なキーを押したときに描画する警告ボックスには、CSS を少し使用します。
```css
.warning {
From 35e6d79a742e54efe691a27f66e4df77cafa5ab3 Mon Sep 17 00:00:00 2001
From: Masahiro FUJIMOTO
Date: Sat, 20 Jul 2024 21:46:22 +0900
Subject: [PATCH 013/185] =?UTF-8?q?2024/07/09=20=E6=99=82=E7=82=B9?=
=?UTF-8?q?=E3=81=AE=E8=8B=B1=E8=AA=9E=E7=89=88=E3=81=AB=E5=9F=BA=E3=81=A5?=
=?UTF-8?q?=E3=81=8D=E6=9B=B4=E6=96=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../api/eventtarget/addeventlistener/index.md | 611 +++++++++---------
1 file changed, 323 insertions(+), 288 deletions(-)
diff --git a/files/ja/web/api/eventtarget/addeventlistener/index.md b/files/ja/web/api/eventtarget/addeventlistener/index.md
index bce731ab8c42f2..10ca0498277c04 100644
--- a/files/ja/web/api/eventtarget/addeventlistener/index.md
+++ b/files/ja/web/api/eventtarget/addeventlistener/index.md
@@ -1,15 +1,16 @@
---
title: "EventTarget: addEventListener() メソッド"
+short-title: addEventListener()
slug: Web/API/EventTarget/addEventListener
l10n:
- sourceCommit: 339595951b78774e951b1a9d215a6db6b856f6b2
+ sourceCommit: ded971d7fec855c2b81fde8809172697f2e227c1
---
-{{APIRef("DOM")}}
+{{APIRef("DOM")}}{{AvailableInWorkers}}
**`addEventListener()`** は {{domxref("EventTarget")}} インターフェイスのメソッドで、ターゲットに特定のイベントが配信されるたびに呼び出される関数を設定します。
-対象としてよくあるものは {{domxref("Element")}}、{{domxref("Document")}}、{{domxref("Window")}} ですが、イベントに対応したあらゆるオブジェクトが対象になることができます ({{domxref("XMLHttpRequest")}} など)。
+対象としてよくあるものは {{domxref("Element")}}、{{domxref("Document")}}、{{domxref("Window")}} ですが、イベントに対応したあらゆるオブジェクトが対象になることができます({{domxref("IDBRequest")}} など)。
> **メモ:** `addEventListener()` メソッドは、イベントリスナーを登録するための*推奨される*方法です。以下のような長所があります。
>
@@ -17,7 +18,7 @@ l10n:
> - `onXYZ` プロパティを使用するのとは対照的に、リスナーが起動されるときのフェーズ(キャプチャとバブリング)をより細かく制御できます。
> - HTML や SVG の要素だけでなく、あらゆるイベントターゲットで動作します。
-`addEventListener()` は関数または {{domxref("EventTarget.addEventListener", "EventListener")}} を実装したオブジェクトを、呼び出される {{domxref("EventTarget")}} における指定されたイベント種別のイベントリスナーのリストに加えることで動作します。その関数やオブジェクトが既にターゲットのイベントリスナーのリストにあった場合は、その関数やオブジェクトが二重に追加されることはありません。
+`addEventListener()` メソッドは、関数または `handleEvent()` 関数を実装したオブジェクトを、呼び出される {{domxref("EventTarget")}} における指定されたイベント種別のイベントリスナーのリストに加えることで動作します。その関数やオブジェクトが既にターゲットのイベントリスナーのリストにあった場合は、その関数やオブジェクトが二重に追加されることはありません。
> **メモ:** ある無名関数が特定のターゲットでイベントリスナーのリストに登録されており、後のコードで同じ無名関数が `addEventListener` の呼び出しに指定された場合、2 つ目の関数*も*そのターゲットのイベントリスナーのリストに追加されます。
>
@@ -41,17 +42,22 @@ addEventListener(type, listener, useCapture)
- `type`
- : 対象とする[イベントの種類](/ja/docs/Web/Events)を表す文字列です。
- `listener`
- - : 指定された種類のイベントが発生するときに通知({{domxref("Event")}} インターフェースを実装しているオブジェクト)を受け取るオブジェクト。これは `null` であるか、`handleEvent()` メソッドのあるオブジェクトか、JavaScript の[関数](/ja/docs/Web/JavaScript/Guide/Functions)の何れかでなければなりません。コールバックについて詳しくは、[イベントリスナーのコールバック](#イベントリスナーのコールバック)を参照してください。
+ - : 指定された種類のイベントが発生するときに通知({{domxref("Event")}} インターフェイスを実装しているオブジェクト)を受け取るオブジェクト。これは `null` であるか、`handleEvent()` メソッドのあるオブジェクトか、JavaScript の[関数](/ja/docs/Web/JavaScript/Guide/Functions)のいずれかでなければなりません。コールバックについて詳しくは、[イベントリスナーのコールバック](#イベントリスナーのコールバック)を参照してください。
- `options` {{optional_inline}}
- - : 対象のイベントリスナーの特性を指定する、オプションのオブジェクトです。次のオプションが使用できます。
+ - : 対象のイベントリスナーの特性を指定する、オプションのオブジェクトです。
+ 次のオプションが使用できます。
- `capture` {{optional_inline}}
- : 論理値で、この型のイベントが DOM ツリーで下に位置する `EventTarget` に配信 (dispatch) される前に、登録された `listener` に配信されることを示します。指定されていない場合は、既定で `false` になります。
- `once` {{optional_inline}}
- : 論理値で、 `listener` の呼び出しを一回のみのとしたいかどうかを値で指定します。 `true` を指定すると、 `listener` は一度実行された時に自動的に削除されます。指定されていない場合は、既定で `false` になります。
- `passive` {{optional_inline}}
- - : 論理値で、 `true` ならば、 `listener` で指定された関数が {{domxref("Event.preventDefault", "preventDefault()")}} を呼び出さないことを示します。呼び出されたリスナーが `preventDefault()` を呼び出すと、ユーザーエージェントは何もせず、コンソールに警告を出力します。指定されていない場合、既定で `false` になります。ただし、Safari 以外のブラウザーでは、{{domxref("Element/wheel_event", "wheel")}}、{{domxref("Element/mousewheel_event", "mousewheel")}}、{{domxref("Element/touchstart_event", "touchstart")}}、{{domxref("Element/touchmove_event", "touchmove")}} の各イベントでは `true` になります。詳細は[パッシブリスナーによるスクロールの性能改善](#パッシブリスナーによるスクロールの性能改善)をご覧ください。
+
+ - : 論理値で、`true` ならば、 `listener` で指定された関数が {{domxref("Event.preventDefault", "preventDefault()")}} を呼び出さないことを示します。呼び出されたリスナーが `preventDefault()` を呼び出すと、ユーザーエージェントは何もせず、コンソールに警告を出力します。
+
+ このオプションが指定されていない場合、既定で `false` になります。ただし、Safari 以外のブラウザーでは、{{domxref("Element/wheel_event", "wheel")}}、{{domxref("Element/mousewheel_event", "mousewheel")}}、{{domxref("Element/touchstart_event", "touchstart")}}、{{domxref("Element/touchmove_event", "touchmove")}} の各イベントでは `true` になります。詳細は[パッシブリスナーの使用](#パッシブリスナーの使用)をご覧ください。
+
- `signal` {{optional_inline}}
- : {{domxref("AbortSignal")}} です。指定された `AbortSignal` オブジェクトの {{domxref("AbortController/abort()", "abort()")}} メソッドが呼び出された時に、リスナーが削除されます。指定されていない場合は、`AbortSignal` がリスナーに関連付けられません。
@@ -61,10 +67,10 @@ addEventListener(type, listener, useCapture)
指定されていない場合、 `useCapture` は既定で `false` となります。
> **メモ:** イベントターゲットに登録されたイベントリスナーは、キャプチャフェーズやバブリングフェーズではなく、ターゲットフェーズのイベントになります。
- > キャプチャリングフェーズのイベントリスナーは、キャプチャリングフェーズ以外のイベントリスナーよりも先に呼び出されます。
+ > キャプチャフェーズのイベントリスナーは、キャプチャフェーズ以外のイベントリスナーよりも先に呼び出されます。
- `wantsUntrusted` {{optional_inline}} {{non-standard_inline}}
- - : `true` の場合、このリスナーはウェブコンテンツによって発行された合成イベント (カスタムイベント) を受け取ります (ブラウザーの{{glossary("chrome", "クローム")}}では既定で `false` ですが、一般のウェブページでは `true` です)。この引数は、主にアドオンやブラウザー自身の役に立つものです。
+ - : Firefox (Gecko) 独自の引数です。`true` の場合、このリスナーはウェブコンテンツによって発行された合成イベント (カスタムイベント) を受け取ります (ブラウザーの{{glossary("chrome", "クローム")}}では既定で `false` ですが、一般のウェブページでは `true` です)。この引数は、主にアドオンやブラウザー自身の役に立つものです。
### 返値
@@ -74,18 +80,18 @@ addEventListener(type, listener, useCapture)
### イベントリスナーのコールバック
-イベントリスナーには、コールバック関数または `handleEvent()` メソッドを持つオブジェクトの何れかをコールバック関数として指定することができます。
+イベントリスナーには、コールバック関数または `handleEvent()` メソッドを持つオブジェクトのいずれかをコールバック関数として指定することができます。
コールバック関数自体は、 `handleEvent()` メソッドと同じ引数と返値を持ちます。つまり、コールバック関数は発生したイベントを説明する {{domxref("Event")}} に基づくオブジェクトを唯一の引数として受け付け、何も返しません。
たとえば、次のイベントハンドラーコールバックは、 {{domxref("Element/fullscreenchange_event", "fullscreenchange")}} および {{domxref("Element/fullscreenerror_event", "fullscreenerror")}} の両方を処理するために使用することができます。
```js
-function eventHandler(event) {
+function handleEvent(event) {
if (event.type === "fullscreenchange") {
- /* handle a full screen toggle */
+ /* 全画面モードへの切り替えを処理 */
} else {
- /* handle a full screen toggle error */
+ /* 全画面モードへの切り替えエラーを処理 */
}
}
```
@@ -134,9 +140,208 @@ someElement.addEventListener(
ここでは、 {{domxref("Element/mouseup_event", "mouseup")}} イベントのリスナーを `someElement` 要素に追加しています。第 3 引数の `passiveSupported` が `true` である場合、 `options` オブジェクトを `passive` を `true` に設定して指定しています。そうでない場合は、論理値を渡す必要があることがわかっているので、 `useCapture` 引数の値として `false` を渡しています。
-ご希望であれば、 [Modernizr](https://modernizr.com/docs) や [Detect It](https://github.com/rafgraph/detect-it) のようなサードパーティ製のライブラリーを使用してこのテストを行うことができます。
+[機能検出の実装](/ja/docs/Learn/Tools_and_testing/Cross_browser_testing/Feature_detection)のドキュメントや [Web Incubator Community Group](https://wicg.github.io/admin/charter.html) の [`EventListenerOptions`](https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md#feature-detection) に関する説明で詳しく学ぶことができます。
+
+### ハンドラー内での "this" の値
+
+イベントハンドラーが発行された要素を参照することはよくあることで、似たような要素の設定に汎用ハンドラーを使用する場合などに便利です。
+
+ハンドラー関数を `addEventListener()` を使用して要素に装着する場合、ハンドラー内の {{jsxref("Operators/this","this")}} の値は要素を参照します。ハンドラーに渡すイベント引数の `currentTarget` プロパティの値と同じになります。
+
+```js
+my_element.addEventListener("click", function (e) {
+ console.log(this.className); // my_element の className をログ出力
+ console.log(e.currentTarget === this); // `true` をログ出力
+});
+```
+
+注意点として、[アロー関数は自分自身で `this` コンテキストを持つことはありません](/ja/docs/Web/JavaScript/Reference/Functions/Arrow_functions#メソッドとしては使用不可)。
+
+```js
+my_element.addEventListener("click", (e) => {
+ console.log(this.className); // 警告: `this` は `my_element` ではない
+ console.log(e.currentTarget === this); // `false` をログ出力
+});
+```
+
+イベントハンドラー(例えば、{{domxref("Element.click_event", "onclick")}})が HTML ソースの要素に指定されている場合、属性値の JavaScript コードは実質的にハンドラー関数にラップされ、`addEventListener()` と整合する方法で `this` の値にバインドされます。コード内に `this` が現れた場合は、要素への参照を表します。
+
+```html
+
+```
+
+属性値内のコードによって呼び出された関数内の `this` の値は、[標準ルール](/ja/docs/Web/JavaScript/Reference/Operators/this) に従って動作することに注意してください。これは次の例で表示されます。
+
+```html
+
+
+```
+
+`logID()` 内の `this` の値はグローバルオブジェクト {{domxref("Window")}} への参照です([厳格モード](/ja/docs/Web/JavaScript/Reference/Strict_mode)の場合は `undefined`)。
+
+#### bind() を使用した "this" の設定
+
+{{jsxref("Function.prototype.bind()")}} メソッドを使用すると、修正された `this` コンテキストをその後のすべての呼び出しに使用することができます。ただし、リスナーへの参照を保持しておく必要があることに注意してください。
-[Web Incubator Community Group](https://wicg.github.io/admin/charter.html) の [`EventListenerOptions`](https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md#feature-detection) の記事を参考にしてください。
+これは `bind()` を使用した例と使用しない例です。
+
+```js
+class Something {
+ name = "Something Good";
+ constructor(element) {
+ // bind によって、修正された `this` コンテキストを `onclick2` に代入される
+ this.onclick2 = this.onclick2.bind(this);
+ element.addEventListener("click", this.onclick1, false);
+ element.addEventListener("click", this.onclick2, false); // Trick
+ }
+ onclick1(event) {
+ console.log(this.name); // undefined(`this` が要素であるため)
+ }
+ onclick2(event) {
+ console.log(this.name); // 'Something Good'(`this` が Something インターフェイスに結び付けられているため)
+ }
+}
+
+const s = new Something(document.body);
+```
+
+もう一つの解決策は、`handleEvent()` と呼ばれる特別な関数を使用してイベントを捕捉することです。
+
+```js
+class Something {
+ name = "Something Good";
+ constructor(element) {
+ // この場合のリスナーは `this` であり、 this.handleEvent ではないことに注意
+ element.addEventListener("click", this, false);
+ element.addEventListener("dblclick", this, false);
+ }
+ handleEvent(event) {
+ console.log(this.name); // 'Something Good'(新しく作成されたオブジェクトに結び付けられているため)
+ switch (event.type) {
+ case "click":
+ // ここにいくらかのコード…
+ break;
+ case "dblclick":
+ // ここにいくらかのコード…
+ break;
+ }
+ }
+}
+
+const s = new Something(document.body);
+```
+
+`this` への参照を処理するもう一つの方法は、別個の `this` コンテキストを作成しないアロー関数を使用することです。
+
+```js
+class SomeClass {
+ name = "Something Good";
+
+ register() {
+ window.addEventListener("keydown", (e) => {
+ this.someMethod(e);
+ });
+ }
+
+ someMethod(e) {
+ console.log(this.name);
+ switch (e.code) {
+ case "ArrowUp":
+ // ここにいくらかのコード…
+ break;
+ case "ArrowDown":
+ // ここにいくらかのコード…
+ break;
+ }
+ }
+}
+
+const myObject = new SomeClass();
+myObject.register();
+```
+
+### イベントリスナーのデータの出し入れ
+
+イベントリスナーは {{domxref("Event")}} または `Event` のサブクラスの引数を 1 つだけ取りますが、これは自動的にリスナーに渡され、返値は無視されます。
+したがって、イベントリスナーにデータを取得したり、イベントリスナーからデータを取得したりするには、引数と返値でデータを渡すのではなく、代わりに[クロージャ](/ja/docs/Web/JavaScript/Closures)を作成する必要があります。
+
+イベントリスナーとして渡された関数は、その関数を格納する外部スコープで宣言されたすべての変数にアクセスすることができます。
+
+```js
+const myButton = document.getElementById("my-button-id");
+let someString = "Data";
+
+myButton.addEventListener("click", () => {
+ console.log(someString);
+ // 最初のクリックでは 'Data' となり、
+ // 2 番目のクリックでは 'Data Again' となる
+
+ someString = "Data Again";
+});
+
+console.log(someString); // 期待される値: 'Data' ('Data Again' とはならない)
+```
+
+関数スコープに関する詳細情報は、[関数ガイド](/ja/docs/Web/JavaScript/Guide/Functions#関数のスコープ)をお読みください。
+
+### メモリーの問題
+
+```js
+const elts = document.getElementsByTagName("*");
+
+// ケース 1
+for (const elt of elts) {
+ elt.addEventListener(
+ "click",
+ (e) => {
+ // 何かを行う
+ },
+ false,
+ );
+}
+
+// ケース 2
+function processEvent(e) {
+ // 何かを行う
+}
+
+for (const elt of elts) {
+ elt.addEventListener("click", processEvent, false);
+}
+```
+
+上記の 1 つ目のケースでは、ループの繰り返しごとに新しい(無名の)ハンドラー関数が作成されます。一方、 2 つ目のケースでは、以前に宣言した同じ関数がイベントハンドラーとして使用され、作成されるハンドラー関数が 1 つであるため、メモリー消費量が少なくなります。さらに、最初のケースでは、無名関数への参照が保持されないため、 {{domxref("EventTarget.removeEventListener", "removeEventListener()")}} を呼び出すことができません(ここでは、ループが生成する可能性がある複数の無名関数への参照が保持されません)。2 番目のケースでは、`processEvent` が関数の参照なので、`myElement.removeEventListener("click", processEvent, false)` を実行することが可能です。
+
+実は、メモリー消費に関しては、関数参照を保持しないことが本当の問題ではなく、むしろ、*静的*な関数参照を保持しないことが問題なのです。
+
+### パッシブリスナーの使用
+
+イベントに既定のアクションがある場合、例えば、既定でコンテナーをスクロールする {{domxref("Element/wheel_event", "wheel")}} イベントの場合、イベントリスナーが {{domxref("Event.preventDefault()")}} を呼び出して既定のアクションをキャンセルするかどうかを事前に知ることができないため、ブラウザーは一般的にイベントリスナーが完了するまで既定のアクションを開始することができません。イベントリスナーの実行に時間がかかりすぎると、既定のアクションが実行されるまでに、{{glossary("jank", "ジャンク")}}と呼ばれる顕著な遅延が発生する可能性があります。
+
+`passive` オプションを `true` に設定することで、イベントリスナーは既定のアクションを取り消される可能性がないことを宣言します。リスナーが {{domxref("Event.preventDefault()")}} を呼び出しても、効果はありません。
+
+`addEventListener()` の仕様書では、`passive` オプションの既定値は常に `false` であると定義しています。しかし、パッシブリスナーのスクロールパフォーマンスの利点を古いコードで実現するために、最近のブラウザーでは {{domxref("Element/wheel_event", "wheel")}}、{{domxref("Element/mousewheel_event", "mousewheel")}}、{{domxref("Element/touchstart_event", "touchstart")}}、{{domxref("Element/touchmove_event", "touchmove")}} の各イベントの `passive` オプションの既定値が、文書レベルノード {{domxref("Window")}}、{{domxref("Document")}}、{{domxref("Document.body")}} においては `true` に変更されています。これにより、イベントリスナーが[イベントが取り消される可能性](/ja/docs/Web/API/Event/preventDefault)を防ぐことができるので、ユーザーがスクロールしている間にページのレンダリングをブロックすることはありません。
+
+そのため、(既定値に頼らずに)その動作を上書きして `passive` オプションを確実に `false` にしたい場合は、明示的にこのオプションを `false` に設定する必要があります。
+
+基本的な {{domxref("Element/scroll_event", "scroll")}} イベントについて、`passive` の値を気にする必要はありません。
+取り消される可能性がないため、イベントリスナーがページのレンダリングをブロックすることはありません。
+
+パッシブリスナーの効果を示す例については[パッシブリスナーによるスクロールの性能改善](#パッシブリスナーによるスクロールの性能改善)を参照してください。
+
+### 古いブラウザーの場合
+
+`addEventListener()` の引数 `options` に対応していない古いブラウザーでは、これを使用しようとすると、[機能検出](#オプションの対応の安全な検出)を適切に使用しない限り、引数 `useCapture` が使用できなくなります。
## 例
@@ -172,7 +377,7 @@ const el = document.getElementById("outside");
el.addEventListener("click", modifyText, false);
```
-このコードの中で、 `modifyText()` が `addEventListener()` を使用して登録された `click` イベントのリスナーです。表の中のどこかをクリックすると、ハンドラーまでバブリングし、 `modifyText()` が実行されます。
+このコードの中で、 `modifyText()` は `click` イベントのリスナーであり、`addEventListener()` を使用して登録されています。表の中のどこかをクリックすると、ハンドラーまでバブリングし、`modifyText()` が実行されます。
#### 結果
@@ -215,7 +420,7 @@ function modifyText() {
}
```
-上の例では、2 行目の内容が "three" に変わった後に、 `addEventListener()` に渡した {{domxref("AbortController")}} から `abort()` を呼び出すようにコードを変更しました。その結果、クリックイベントを待ち受けするコードがなくなったので、値は永遠に "three" のままとなります。
+上の例では、2 行目のコンテンツが "three" に変更された後に、 `addEventListener()` の呼び出しに渡した {{domxref("AbortController")}} から `abort()` を呼び出すように、前回のコードを変更しています。その結果、クリックイベントを待ち受けするコードがなくなったので、値は永遠に "three" のままとなります。
#### 結果
@@ -266,7 +471,7 @@ el.addEventListener(
### アロー関数を使用したイベントリスナー
-この例はアロー関数表記を使用して実装された、簡単なイベントリスナーを紹介しています。
+この例はアロー関数記法を使用して実装された、簡単なイベントリスナーを紹介しています。
#### HTML
@@ -305,7 +510,7 @@ el.addEventListener(
{{EmbedLiveSample('Event_listener_with_an_arrow_function')}}
-なお、無名関数とアロー関数は似ており、違いは `this` を結び付けるかどうかです。無名関数 (および従来のすべての JavaScript 関数) は固有の `this` を作成するのに対し、アロー関数はそれを含む関数の `this` を継承します。
+なお、無名関数とアロー関数は似ており、違いは `this` を結び付けるかどうかです。無名関数(および従来のすべての JavaScript 関数)は固有の `this` を作成するのに対し、アロー関数はそれを含む関数の `this` を継承します。
つまり、アロー関数を使用したときは、それを含む関数の変数や定数をイベントハンドラーで利用することができます。
@@ -319,13 +524,16 @@ el.addEventListener(
+
+ログをクリア
+
```
#### CSS
@@ -358,8 +566,31 @@ el.addEventListener(
}
```
+```css hidden
+.demo-logs {
+ width: 530px;
+ height: 16rem;
+ background-color: #ddd;
+ overflow-x: auto;
+ padding: 1rem;
+}
+```
+
#### JavaScript
+```js hidden
+const clearBtn = document.querySelector(".clear-button");
+const demoLogs = document.querySelector(".demo-logs");
+
+function log(msg) {
+ demoLogs.innerText += `${msg}\n`;
+}
+
+clearBtn.addEventListener("click", () => {
+ demoLogs.innerText = "";
+});
+```
+
```js
const outer = document.querySelector(".outer");
const middle = document.querySelector(".middle");
@@ -393,27 +624,27 @@ inner1.addEventListener("click", passiveHandler, passive);
inner2.addEventListener("click", nonePassiveHandler, nonePassive);
function onceHandler(event) {
- alert("outer, once");
+ log("outer、once");
}
function noneOnceHandler(event) {
- alert("outer, none-once, default");
+ log("outer、非 once、既定値\n");
}
function captureHandler(event) {
//event.stopImmediatePropagation();
- alert("middle, capture");
+ log("middle、capture");
}
function noneCaptureHandler(event) {
- alert("middle, none-capture, default");
+ log("middle、非 capture、既定値");
}
function passiveHandler(event) {
- // Unable to preventDefault inside passive event listener invocation.
+ // パッシブイベントリスナーの呼び出しの中では preventDefault は実行できない
event.preventDefault();
- alert("inner1, passive, open new page");
+ log("inner1、passive、新しいページを開く");
}
function nonePassiveHandler(event) {
event.preventDefault();
//event.stopPropagation();
- alert("inner2, none-passive, default, not open new page");
+ log("inner2、非 passive、既定値、新しいページを開かない");
}
```
@@ -421,7 +652,7 @@ function nonePassiveHandler(event) {
外側、中央、内側のコンテナーをそれぞれクリックして、オプションがどのように動作するかを確認してください。
-{{ EmbedLiveSample('Example_of_options_usage', 600, 310, '') }}
+{{ EmbedLiveSample('options_の使い方の例', 600, 630) }}
`options` オブジェクトで特定の値を使用する前に、ユーザーのブラウザーがその値に対応していることを確認するのが良いでしょう。これらは歴史的にすべてのブラウザーがサポートしてきたわけではない追加要素であるからです。詳細は[オプションの対応の安全な検出](#オプションの対応の安全な検出)を参照してください。
@@ -481,292 +712,96 @@ addListener();
{{EmbedLiveSample('Event_listener_with_multiple_options')}}
-## その他の注意事項
-
-### ハンドラー内での "this" の値
-
-一連の類似した要素に対して一般的なハンドラーを使いたい場合のように、イベントハンドラーが実行される要素を参照したいということがたびたびあります。
-
-ハンドラー関数を `addEventListener()` を使って要素に装着したとき、ハンドラーの中の {{jsxref("Operators/this","this")}} の値は要素への参照となります。これはハンドラーに渡された event 引数の `currentTarget` プロパティの値と同じです。
-
-```js
-my_element.addEventListener("click", function (e) {
- console.log(this.className); // logs the className of my_element
- console.log(e.currentTarget === this); // logs `true`
-});
-```
-
-[アロー関数は独自の `this` コンテキストを持たない](/ja/docs/Web/JavaScript/Reference/Functions/Arrow_functions#メソッドとして使われるアロー関数)ことをお忘れなく。
-
-```js
-my_element.addEventListener("click", (e) => {
- console.log(this.className); // WARNING: `this` is not `my_element`
- console.log(e.currentTarget === this); // logs `false`
-});
-```
-
-イベントハンドラー(例えば {{domxref("Element.click_event", "onclick")}})が HTML ソース内の要素に指定されていた場合、属性値の JavaScript コードは、 `addEventListener()` を使用するような方法で `this` の値を結び付けたハンドラー関数に置き換えられます。コード内に `this` が現れた場合には、要素への参照を表します。
+### パッシブリスナーによるスクロールの性能改善
-```html
-
-```
+次の例は `passive` を設定した効果を示しています。テキストとチェックボックスを含む {{htmlelement("div")}} があります。
-`this` の値は、属性値の中のコード*によって呼び出される*関数内では、[標準的な規則](/ja/docs/Web/JavaScript/Reference/Operators/this)に従って動作することに注意してください。これは次の例で示されています。
+#### HTML
```html
-
-
-```
-
-`this` は `logID()` 内においては、グローバルオブジェクト {{domxref("Window")}} (または[厳格モード](/ja/docs/Web/JavaScript/Reference/Strict_mode)の場合は `undefined` になります。
-
-#### bind() を使用した this の指定
-
-{{jsxref("Function.prototype.bind()")}} メソッドで、その関数のすべての呼び出しにおいて `this` として使用される値を指定できます。これを使えば、関数がどこから呼び出されるかによって `this` の値が変わってしまうというややこしい問題を簡単に回避できます。ただし、リスナーを後で削除できるように、そのリスナーへの参照を残しておく必要があります。
-
-以下は `bind()` を使った場合と使わない場合の例です。
-
-```js
-const Something = function (element) {
- // |this| is a newly created object
- this.name = "Something Good";
- this.onclick1 = function (event) {
- console.log(this.name); // this は element なので undefined になります
- };
-
- this.onclick2 = function (event) {
- console.log(this.name); // this は新しく生成されたオブジェクトに結び付けられているので、 'Something Good' と出力されます
- };
-
- // bind によって、固定の `this` コンテキストを onclick2 に割り当てる
- this.onclick2 = this.onclick2.bind(this);
-
- element.addEventListener("click", this.onclick1, false);
- element.addEventListener("click", this.onclick2, false); // これが仕掛けです
-};
-const s = new Something(document.body);
-```
-
-もうひとつの解決策は、あらゆるイベントを捕捉する `handleEvent()` という特別な関数を使用することです。
-
-```js
-const Something = function (element) {
- // |this| is a newly created object
- this.name = "Something Good";
- this.handleEvent = function (event) {
- console.log(this.name); // this は新しく生成されたオブジェクトに結び付けられているので、 'Something Good' と出力されます
- switch (event.type) {
- case "click":
- // 処理
- break;
- case "dblclick":
- // 処理
- break;
- }
- };
-
- // この場合のリスナーは this であって this.handleEvent でないことに注意してください
- element.addEventListener("click", this, false);
- element.addEventListener("dblclick", this, false);
+
+
+ But down there it would be dark now, and not the lovely lighted aquarium she
+ imagined it to be during the daylight hours, eddying with schools of tiny,
+ delicate animals floating and dancing slowly to their own serene currents
+ and creating the look of a living painting. That was wrong, in any case. The
+ ocean was different from an aquarium, which was an artificial environment.
+ The ocean was a world. And a world is not art. Dorothy thought about the
+ living things that moved in that world: large, ruthless and hungry. Like us
+ up here.
+
+
- // リスナーは適切に削除できます
- element.removeEventListener("click", this, false);
- element.removeEventListener("dblclick", this, false);
-};
-const s = new Something(document.body);
+
+
+ パッシブ
+
```
-_this_ の参照を扱うためのもう一つの方法は、 `EventListener` にアクセスする必要のあるフィールドを含むオブジェクトのメソッドを呼び出す関数を渡すことです。
-
-```js
-class SomeClass {
- constructor() {
- this.name = "Something Good";
- }
-
- register() {
- const that = this;
- window.addEventListener("keydown", (e) => {
- that.someMethod(e);
- });
- }
-
- someMethod(e) {
- console.log(this.name);
- switch (e.keyCode) {
- case 5:
- // ここにいくらかのコード...
- break;
- case 6:
- // ここにいくらかのコード...
- break;
- }
- }
+```css hidden
+#container {
+ width: 150px;
+ height: 200px;
+ overflow: scroll;
+ margin: 2rem 0;
+ padding: 0.4rem;
+ border: 1px solid black;
}
-
-const myObject = new SomeClass();
-myObject.register();
```
-### イベントリスナーのデータの出し入れ
-
-イベントリスナーは離島のようなもので、データを渡すのも、ましてや実行後にデータを取り戻すのも至難の業だと思われるかもしれません。
-イベントリスナーは引数を、[イベントオブジェクト](/ja/docs/Learn/JavaScript/Building_blocks/Events#event_objects) 1 つしかとらず、これは自動的にリスナーに渡され、返値は無視されます。
-では、どのようにデータを取り込んだり、戻したりすればよいのでしょうか。これには良い方法がいくつかあります。
-
-#### "this" を使用したイベントリスナーへのデータの入力
-
-[前述](#bind_を使用した_this_の指定)の通り、 `Function.prototype.bind()` を使用すると `this` 参照変数を通じてイベントリスナーに値を渡すことができます。
-
-```js
-const myButton = document.getElementById("my-button-id");
-const someString = "Data";
-
-myButton.addEventListener(
- "click",
- function () {
- console.log(this); // 期待される値: 'Data'
- }.bind(someString),
-);
-```
-
-この方法は、イベントリスナーの中からプログラムでイベントリスナーがどの HTML 要素で発生したかを知る必要がない場合に適しています。これを行う主な利点は、実際に引数リストにデータを渡す場合とほぼ同じ方法でイベントリスナーがデータを受け取ることです。
-
-#### 外部スコープのプロパティを使用したイベントリスナーへのデータの入力
+#### JavaScript
-外部スコープに(`const`, `let` を付けた)変数宣言が含まれている場合、そのスコープで宣言されたすべての内部関数はその変数にアクセスすることができます(外部関数/内部関数については[こちら](/ja/docs/Glossary/Function#different_types_of_functions)を、変数スコープについては[こちら](/ja/docs/Web/JavaScript/Reference/Statements/var#暗黙のグローバル変数と関数スコープの外部)を参照してください)。したがって、イベントリスナーの外部からデータにアクセスする最も簡単な方法の 1 つは、イベントリスナーが宣言されているスコープにアクセスできるようにすることです。
+このコードは、コンテナーの {{domxref("Element/wheel_event", "wheel")}} イベントにリスナーを追加するもので、既定ではコンテナーをスクロールします。リスナーは長時間実行する処理を実行します。初期状態では、リスナーは `passive` オプションで追加され、チェックボックスがトグル切り替えされるたびに、コードは `passive` オプションをトグル切り替えします。
```js
-const myButton = document.getElementById("my-button-id");
-let someString = "Data";
-
-myButton.addEventListener("click", () => {
- console.log(someString); // 期待される値: 'Data'
-
- someString = "Data Again";
+const passive = document.querySelector("#passive");
+passive.addEventListener("change", (event) => {
+ container.removeEventListener("wheel", wheelHandler);
+ container.addEventListener("wheel", wheelHandler, {
+ passive: passive.checked,
+ once: true,
+ });
});
-console.log(someString); // 期待される値: 'Data' (will never output 'Data Again')
-```
-
-> **メモ:** 内側のスコープは外側のスコープにある `const`, `let` 変数にアクセスすることができますが、イベントリスナーの定義後に、同じ外側のスコープ内でこれらの変数にアクセスできるようになることは期待できません。なぜでしょうか?単純に、イベントリスナーが実行される頃には、イベントリスナーが定義されたスコープは既に実行を終了しているからです。
-
-#### オブジェクトを用いたイベントリスナーのデータの出し入れ
-
-JavaScript のほとんどの関数とは異なり、オブジェクトはそのオブジェクトを参照する変数がメモリー内に存在する限り、メモリー内に保持されます。それに加えて、オブジェクトはプロパティを持つことができ、参照によって渡すことができることから、スコープ間でデータを共有するための有力な候補となります。これについて調べてみましょう。
-
-> **メモ:** JavaScript の関数は厳密にはオブジェクトです。 (そのため、プロパティを持つことができ、メモリー内に永続的に存在する変数に代入されていれば、実行終了後もメモリー内に保持されます。)
-
-オブジェクトを参照する変数がメモリーに存在する限り、オブジェクトのプロパティを使用してメモリーにデータを格納することができるので、実際にそれらを使用して、イベントリスナーにデータを渡し、イベントハンドラーが実行された後でデータに変更があった場合には、それを戻すことができます。この例を考えてみましょう。
-
-```js
-const myButton = document.getElementById("my-button-id");
-const someObject = { aProperty: "Data" };
-
-myButton.addEventListener("click", () => {
- console.log(someObject.aProperty); // 期待される値: 'Data'
-
- someObject.aProperty = "Data Again"; // 値を変更
+const container = document.querySelector("#container");
+container.addEventListener("wheel", wheelHandler, {
+ passive: true,
+ once: true,
});
-setInterval(() => {
- if (someObject.aProperty === "Data Again") {
- console.log("Data Again: True");
- someObject.aProperty = "Data"; // 次のイベントの実行を待つために値を初期化
+function wheelHandler() {
+ function isPrime(n) {
+ for (let c = 2; c <= Math.sqrt(n); ++c) {
+ if (n % c === 0) {
+ return false;
+ }
+ }
+ return true;
}
-}, 5000);
-```
-
-この例では、イベントリスナーとインターバル関数の両方が定義されているスコープは、 `someObject.aProperty` の元の値が変更される前に実行を終了していたとしても、イベントリスナーとインターバル関数の両方で `someObject` がメモリー内に (*参照*によって) 持続するため、両方とも同じデータにアクセスできます (つまり、一方がデータを変更したときに、もう一方がその変更に対応できます)。
-
-> **メモ:** オブジェクトは参照で変数に格納されます。つまり、実際のデータのメモリーの場所だけが変数に格納されます。とりわけ、これはオブジェクトを「格納」する変数が、実際に同じオブジェクト参照が代入 (「格納」) されている他の変数に影響を与えることができるということです。 2 つの変数が同じオブジェクトを参照している場合 (例えば、 `let a = b = {aProperty: 'Yeah'};`)、どちらかから変数のデータを変更すると、もう一方の変数に影響を与えます。
-
-> **メモ:** オブジェクトは参照によって変数に格納されているので、関数の実行を停止した後も、関数からオブジェクトを返す (データを失わないようにメモリーに保存しておく) ことができます。
-
-### メモリーの問題
-
-```js
-const elts = document.getElementsByTagName("*");
-// ケース 1
-for (const elt of elts) {
- elt.addEventListener(
- "click",
- (e) => {
- // 何かを行う
- },
- false,
- );
-}
+ const quota = 1000000;
+ const primes = [];
+ const maximum = 1000000;
-// ケース 2
-function processEvent(e) {
- // 何かを行う
-}
+ while (primes.length < quota) {
+ const candidate = Math.floor(Math.random() * (maximum + 1));
+ if (isPrime(candidate)) {
+ primes.push(candidate);
+ }
+ }
-for (const elt of elts) {
- elt.addEventListener("click", processEvent, false);
+ console.log(primes);
}
```
-上記の 1 つ目のケースでは、ループの繰り返しごとに新しい(無名の)ハンドラー関数が作成されます。一方、 2 つ目のケースでは、以前に宣言した同じ関数がイベントハンドラーとして使用され、作成されるハンドラー関数が 1 つであるため、メモリー消費量が少なくなります。さらに、最初のケースでは、無名関数への参照が保持されないため、 {{domxref("EventTarget.removeEventListener", "removeEventListener()")}} を呼び出すことができません(ここでは、ループが生成する可能性がある複数の無名関数への参照が保持されません)。2 番目のケースでは、`processEvent` が関数の参照なので、`myElement.removeEventListener("click", processEvent, false)` を実行することが可能です。
-
-実は、メモリー消費に関しては、関数参照を保持しないことが本当の問題ではなく、むしろ、*静的*な関数参照を保持しないことが問題なのです。
-
-### パッシブリスナーによるスクロールの性能改善
-
-以下の例にあるように、`passive` の値を `true` に設定すると、パフォーマンスを最適化し、アプリケーションのパフォーマンスが劇的に向上する可能性があります。
-
-```js
-/* 機能検出 */
-let passiveIfSupported = false;
-
-try {
- window.addEventListener(
- "test",
- null,
- Object.defineProperty({}, "passive", {
- get() {
- passiveIfSupported = { passive: true };
- },
- }),
- );
-} catch (err) {}
-
-window.addEventListener(
- "scroll",
- (event) => {
- /* 何かを行う */
- // event.preventDefault(); は使用できない
- },
- passiveIfSupported,
-);
-```
-
-`addEventListener()` の仕様では、`passive` オプションの既定値は常に `false` です。しかし、これはタッチイベントやホイールイベントを扱うイベントリスナーがスクロールを処理しようとしている間にブラウザーのメインスレッドをブロックする可能性をもたらすため、スクロール処理中の性能が大幅に低下する結果になる可能性があります。
-
-この問題を防ぐため、Safari 以外のブラウザーでは、文書レベルのノードである {{domxref("Window")}}、{{domxref("Document")}}、{{domxref("Document.body")}} のに対する {{domxref("Element/wheel_event", "wheel")}}、{{domxref("Element/mousewheel_event", "mousewheel")}}、{{domxref("Element/touchstart_event", "touchstart")}}、{{domxref("Element/touchmove_event", "touchmove")}} イベントの `passive` オプションの既定値が `true` に変更されました。これにより、イベントリスナーが[イベントをキャンセルする](/ja/docs/Web/API/Event/preventDefault)ことができなくなるため、ユーザーがスクロールしている間、ページレンダリングをブロックすることがなくなります。
-
-> **メモ:** この変更された動作を実装しているブラウザー(およびそれらのブラウザーのバージョン)を知りたい場合は、下記の互換性一覧表を参照してください。
-
-そのため、その動作を上書きして、すべてのブラウザーで `passive` オプションが `false` になるようにしたい場合は、(既定値に頼らず)明示的にオプションを `false` に設定する必要があります。
+#### 結果
-基本的な {{domxref("Element/scroll_event", "scroll")}} イベントの `passive` の値を気にする必要はありません。
-もともとキャンセル不可であるため、イベントリスナーはいずれにせよページのレンダリングをブロックすることはありません。
+効果は次の通りです。
-### 古いブラウザー
+- 初期状態では、リスナーはパッシブであるため、ホイールでコンテナーをスクロールしようとするとすぐにスクロールします。
+- 「パッシブ」のチェックを外して、ホイールを使用してコンテナーをスクロールしようとすると、コンテナーがスクロールするまでに顕著な遅延があります。
-`addEventListener()` の `options` 引数に対応していない古いブラウザーでは、正しく[機能検出](#オプションの対応の安全な検出)をせずに使おうとすると、 `useCapture` 引数が使用できないことがあります。
+{{EmbedLiveSample("Improving scroll performance using passive listeners", 100, 300)}}
## 仕様書
From cc6548e6684a12091db090085c1eeb5d2e42fe7b Mon Sep 17 00:00:00 2001
From: Masahiro FUJIMOTO
Date: Sat, 20 Jul 2024 21:49:39 +0900
Subject: [PATCH 014/185] =?UTF-8?q?2024/06/22=20=E6=99=82=E7=82=B9?=
=?UTF-8?q?=E3=81=AE=E8=8B=B1=E8=AA=9E=E7=89=88=E3=81=AB=E5=9F=BA=E3=81=A5?=
=?UTF-8?q?=E3=81=8D=E6=9B=B4=E6=96=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
files/ja/web/api/eventtarget/dispatchevent/index.md | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/files/ja/web/api/eventtarget/dispatchevent/index.md b/files/ja/web/api/eventtarget/dispatchevent/index.md
index d104e41b3e4d63..83b1af6c98a056 100644
--- a/files/ja/web/api/eventtarget/dispatchevent/index.md
+++ b/files/ja/web/api/eventtarget/dispatchevent/index.md
@@ -1,19 +1,20 @@
---
title: "EventTarget: dispatchEvent() メソッド"
+short-title: dispatchEvent()
slug: Web/API/EventTarget/dispatchEvent
l10n:
- sourceCommit: 339595951b78774e951b1a9d215a6db6b856f6b2
+ sourceCommit: 8ac73df2fbe2c88d8649fcb006dcde098616c723
---
-{{APIRef("DOM")}}
+{{APIRef("DOM")}}{{AvailableInWorkers}}
-**`dispatchEvent()`** は {{domxref("EventTarget")}} のメソッドで、 {{domxref("Event")}} をそのオブジェクトへ送り、関連する[イベントリスナー](/ja/docs/Web/API/EventTarget/addEventListener)を(同期的に)適切に起動させます。通常のイベント処理ルール(キャプチャとオプションのバブリングフェーズを含む)は `dispatchEvent()` で手動で配信されたイベントにも適用されます。
+**`dispatchEvent()`** は {{domxref("EventTarget")}} のメソッドで、 {{domxref("Event")}} をそのオブジェクトへ送り、関連するイベントリスナーを(同期的に)適切に起動させます。通常のイベント処理ルール(キャプチャとオプションのバブリングフェーズを含む)は `dispatchEvent()` で手動で配信されたイベントにも適用されます。
`dispatchEvent()` の呼び出しは、イベントを発行させるための最後のステップです。イベントは既に {{domxref("Event/Event", "Event()")}} コンストラクターを使って作成され、初期化されているはずです。
> **メモ:** このメソッドを呼び出すとき、 {{domxref("Event.target")}} プロパティは現在の `EventTarget` に初期化されます。
-「ネイティブ」イベントがブラウザーによって発生し、[イベントループ](/ja/docs/Web/JavaScript/Event_loop)を介して非同期にイベントハンドラーを呼び出すのとは異なり、 `dispatchEvent()` はイベントハンドラーを*同期的に*呼び出します。適用可能なすべてのイベントハンドラが呼び出され、 `dispatchEvent()` から戻る前に返されます。
+「ネイティブ」イベントがブラウザーによって発生し、[イベントループ](/ja/docs/Web/JavaScript/Event_loop)を介して非同期にイベントハンドラーを呼び出すのとは異なり、 `dispatchEvent()` はイベントハンドラーを*同期的に*呼び出します。適用可能なすべてのイベントハンドラーが呼び出され、 `dispatchEvent()` から戻る前に返されます。
## 構文
From 409828fa2df5ba16c0c443cc6e3d193aa7295edc Mon Sep 17 00:00:00 2001
From: Masahiro FUJIMOTO
Date: Wed, 17 Jul 2024 23:20:13 +0900
Subject: [PATCH 015/185] =?UTF-8?q?2024/05/07=20=E6=99=82=E7=82=B9?=
=?UTF-8?q?=E3=81=AE=E8=8B=B1=E8=AA=9E=E7=89=88=E3=81=AB=E5=9F=BA=E3=81=A5?=
=?UTF-8?q?=E3=81=8D=E6=9B=B4=E6=96=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../web/api/eventtarget/eventtarget/index.md | 63 ++++++++++++++-----
files/ja/web/api/eventtarget/index.md | 6 +-
.../eventtarget/removeeventlistener/index.md | 7 ++-
3 files changed, 56 insertions(+), 20 deletions(-)
diff --git a/files/ja/web/api/eventtarget/eventtarget/index.md b/files/ja/web/api/eventtarget/eventtarget/index.md
index b5c6cd724177b0..19db53f3e038b7 100644
--- a/files/ja/web/api/eventtarget/eventtarget/index.md
+++ b/files/ja/web/api/eventtarget/eventtarget/index.md
@@ -1,11 +1,12 @@
---
title: "EventTarget: EventTarget() コンストラクター"
+short-title: EventTarget()
slug: Web/API/EventTarget/EventTarget
l10n:
- sourceCommit: 339595951b78774e951b1a9d215a6db6b856f6b2
+ sourceCommit: 15f0b5552bc9c2ea1f32b0cd5ee840a7d43c887e
---
-{{APIRef("DOM")}}
+{{APIRef("DOM")}}{{AvailableInWorkers}}
**`EventTarget()`** コンストラクターは、新しい {{domxref("EventTarget")}} オブジェクトのインスタンスを作成します。
@@ -27,29 +28,63 @@ new EventTarget()
## 例
+### カウンターの実装
+
+この例では、 `increment()` メソッドと `decrement()` メソッドを持つ `Counter` クラスを実装します。これらのメソッドが呼び出されると、カスタムイベント `"valuechange"` が発生します。
+
+#### HTML
+
+```html
+-
+0
++
+```
+
+#### JavaScript
+
```js
-class MyEventTarget extends EventTarget {
- constructor(mySecret) {
+class Counter extends EventTarget {
+ constructor(initialValue = 0) {
super();
- this._secret = mySecret;
+ this.value = initialValue;
+ }
+
+ #emitChangeEvent() {
+ this.dispatchEvent(new CustomEvent("valuechange", { detail: this.value }));
}
- get secret() {
- return this._secret;
+ increment() {
+ this.value++;
+ this.#emitChangeEvent();
+ }
+
+ decrement() {
+ this.value--;
+ this.#emitChangeEvent();
}
}
-let myEventTarget = new MyEventTarget(5);
-let value = myEventTarget.secret; // === 5
-myEventTarget.addEventListener("foo", (e) => {
- myEventTarget._secret = e.detail;
+const initialValue = 0;
+const counter = new Counter(initialValue);
+document.querySelector("#currentValue").innerText = initialValue;
+
+counter.addEventListener("valuechange", (event) => {
+ document.querySelector("#currentValue").innerText = event.detail;
+});
+
+document.querySelector("#inc").addEventListener("click", () => {
+ counter.increment();
});
-let event = new CustomEvent("foo", { detail: 7 });
-myEventTarget.dispatchEvent(event);
-let newValue = myEventTarget.secret; // === 7
+document.querySelector("#dec").addEventListener("click", () => {
+ counter.decrement();
+});
```
+#### 結果
+
+{{EmbedLiveSample("Implementing a counter")}}
+
## 仕様書
{{Specifications}}
diff --git a/files/ja/web/api/eventtarget/index.md b/files/ja/web/api/eventtarget/index.md
index 0a47d008e7c2d5..e2ed2bb930c450 100644
--- a/files/ja/web/api/eventtarget/index.md
+++ b/files/ja/web/api/eventtarget/index.md
@@ -2,15 +2,15 @@
title: EventTarget
slug: Web/API/EventTarget
l10n:
- sourceCommit: 049632675ccb83fe2e257c43071d366d3f80ee2b
+ sourceCommit: 15f0b5552bc9c2ea1f32b0cd5ee840a7d43c887e
---
-{{ApiRef("DOM")}}
+{{APIRef("DOM")}}{{AvailableInWorkers}}
**`EventTarget`** インターフェイスは、イベントを受け取ることや、リスナーを持つことができるオブジェクトが実装します。
言い換えると、イベントのターゲットはすべて、このインターフェイスに関する 3 つのメソッドを実装しています。
-{{domxref("Element")}} とその子、{{domxref("Document")}}、{{domxref("Window")}} は、最も一般的なイベントターゲットですが、他のオブジェクトも、例えば {{domxref("XMLHttpRequest")}}、{{domxref("AudioNode")}}、{{domxref("AudioContext")}} などもイベントターゲットになります。
+{{domxref("Element")}} とその子、{{domxref("Document")}}、{{domxref("Window")}} は、最も一般的なイベントターゲットですが、他のオブジェクト、例えば {{domxref("IDBRequest")}}、{{domxref("AudioNode")}}、{{domxref("AudioContext")}} などもイベントターゲットになります。
多くのイベントターゲット (要素、文書、ウィンドウを含む) は、[イベントハンドラー](/ja/docs/Web/Events/Event_handlers)を設定するのに `onイベント名` プロパティや属性を使用することもできます。
diff --git a/files/ja/web/api/eventtarget/removeeventlistener/index.md b/files/ja/web/api/eventtarget/removeeventlistener/index.md
index 0e0006df4e1d66..50afc4360dd00a 100644
--- a/files/ja/web/api/eventtarget/removeeventlistener/index.md
+++ b/files/ja/web/api/eventtarget/removeeventlistener/index.md
@@ -1,11 +1,12 @@
---
title: "EventTarget: removeEventListener() メソッド"
+short-title: removeEventListener()
slug: Web/API/EventTarget/removeEventListener
l10n:
- sourceCommit: 339595951b78774e951b1a9d215a6db6b856f6b2
+ sourceCommit: 15f0b5552bc9c2ea1f32b0cd5ee840a7d43c887e
---
-{{APIRef("DOM")}}
+{{APIRef("DOM")}}{{AvailableInWorkers}}
**`removeEventListener()`** は {{domxref("EventTarget")}} インターフェイスのメソッドで、以前に {{domxref("EventTarget.addEventListener()")}} で登録されたイベントリスナーを取り外します。
取り外されるイベントリスナーはイベントの型、イベントリスナー関数そのもの、照合プロセスに影響を与えるさまざまな任意のオプションを使用して識別します。
@@ -90,7 +91,7 @@ element.removeEventListener("mousedown", handleMouseDown, false); // 成功
element.removeEventListener("mousedown", handleMouseDown, true); // 失敗
```
-この点については、いくつかのブラウザのリリースで一貫性がないことに注意してください。特に理由がない限り、`addEventListener()` の呼び出しで使用したのと同じ値を `removeEventListener()` の呼び出しでも使用することが賢明でしょう。
+この点については、いくつかのブラウザーのリリースで一貫性がないことに注意してください。特に理由がない限り、`addEventListener()` の呼び出しで使用したのと同じ値を `removeEventListener()` の呼び出しでも使用することが賢明でしょう。
## 例
From b684640792ee2eb6b900d2ad635b1a39ef87041d Mon Sep 17 00:00:00 2001
From: Leonid Vinogradov
Date: Thu, 25 Jul 2024 00:41:00 +0300
Subject: [PATCH 016/185] [ru] remove outdated
`Web/JavaScript/Reference/Errors/Undefined_prop` (#22410)
[ru] remove outdated Web/JavaScript/Reference/Errors/Undefined_prop
---
files/ru/_redirects.txt | 1 -
files/ru/_wikihistory.json | 4 --
.../reference/errors/undefined_prop/index.md | 55 -------------------
3 files changed, 60 deletions(-)
delete mode 100644 files/ru/orphaned/web/javascript/reference/errors/undefined_prop/index.md
diff --git a/files/ru/_redirects.txt b/files/ru/_redirects.txt
index a182ae59fe8d3d..0f5a243af82f56 100644
--- a/files/ru/_redirects.txt
+++ b/files/ru/_redirects.txt
@@ -758,7 +758,6 @@
/ru/docs/Web/JavaScript/Reference/Errors/Equal_as_assign /ru/docs/orphaned/Web/JavaScript/Reference/Errors/Equal_as_assign
/ru/docs/Web/JavaScript/Reference/Errors/Missing_semicolon_before_statement /ru/docs/conflicting/Web/JavaScript/Reference/Errors/Unexpected_token
/ru/docs/Web/JavaScript/Reference/Errors/Not_a_codepoint /ru/docs/Web/JavaScript/Reference/Errors/Not_a_valid_code_point
-/ru/docs/Web/JavaScript/Reference/Errors/Undefined_prop /ru/docs/orphaned/Web/JavaScript/Reference/Errors/Undefined_prop
/ru/docs/Web/JavaScript/Reference/Errors/Unterminated_string_literal /ru/docs/Web/JavaScript/Reference/Errors/String_literal_EOL
/ru/docs/Web/JavaScript/Reference/Functions/Определиние_методов /ru/docs/Web/JavaScript/Reference/Functions/Method_definitions
/ru/docs/Web/JavaScript/Reference/Global_Objects/Array/@@iterator /ru/docs/Web/JavaScript/Reference/Global_Objects/Array/Symbol.iterator
diff --git a/files/ru/_wikihistory.json b/files/ru/_wikihistory.json
index c9f4d5dc2420b0..d1da7f5a8b63c4 100644
--- a/files/ru/_wikihistory.json
+++ b/files/ru/_wikihistory.json
@@ -15969,9 +15969,5 @@
"orphaned/Web/JavaScript/Reference/Errors/Equal_as_assign": {
"modified": "2020-03-12T19:48:37.445Z",
"contributors": ["MakarovDs777"]
- },
- "orphaned/Web/JavaScript/Reference/Errors/Undefined_prop": {
- "modified": "2020-03-12T19:47:58.221Z",
- "contributors": ["KTatyana"]
}
}
diff --git a/files/ru/orphaned/web/javascript/reference/errors/undefined_prop/index.md b/files/ru/orphaned/web/javascript/reference/errors/undefined_prop/index.md
deleted file mode 100644
index 1caf390ca8157d..00000000000000
--- a/files/ru/orphaned/web/javascript/reference/errors/undefined_prop/index.md
+++ /dev/null
@@ -1,55 +0,0 @@
----
-title: 'ReferenceError: reference to undefined property "x"'
-slug: orphaned/Web/JavaScript/Reference/Errors/Undefined_prop
-original_slug: Web/JavaScript/Reference/Errors/Undefined_prop
----
-
-{{jsSidebar("Errors")}}
-
-## Сообщение
-
-```
-ReferenceError: reference to undefined property "x" (Firefox)
-```
-
-## Тип ошибки
-
-(только в Firefox) Предупреждение {{jsxref("ReferenceError")}}, возникает, только если значение настройки `javascript.options.strict` равно `true`.
-
-## Что пошло не так?
-
-Совершена попытка обращения к свойству объекта, которое не определено. Существует два способа обращения к свойствам: обратитесь к странице справочника {{jsxref("Operators/Property_Accessors", "property accessors", 0, 1)}} для более подробной информации.
-
-## Примеры
-
-### Случаи возникновения ошибки
-
-В данном примере свойство `bar` не определено, поэтому возникнет ошибка `ReferenceError`.
-
-```js example-bad
-var foo = {};
-foo.bar; // ReferenceError: reference to undefined property "bar"
-```
-
-### Правильный код
-
-Чтобы избежать ошибки, потребуется либо задать для объекта свойство `bar`, либо проверить существование данного свойства, прежде чем обращаться к нему. Одним из способов это сделать является использование метода {{jsxref("Object.prototype.hasOwnProperty()")}}:
-
-```js example-good
-var foo = {};
-
-// Задать свойство bar
-
-foo.bar = "moon";
-console.log(foo.bar); // "moon"
-
-// Убедиться, что свойство bar существует, прежде чем обращаться к нему
-
-if (foo.hasOwnProperty("bar")) {
- console.log(foo.bar);
-}
-```
-
-## Смотрите также
-
-- {{jsxref("Operators/Property_Accessors", "property accessors", 0, 1)}}
From e9735067917a241b07a4b864db8c609d9ec13554 Mon Sep 17 00:00:00 2001
From: Leonid Vinogradov
Date: Thu, 25 Jul 2024 00:45:32 +0300
Subject: [PATCH 017/185] [ru] remove outdated
`Web/JavaScript/Reference/Errors/Equal_as_assign` (#22412)
[ru] remove outdated Web/JavaScript/Reference/Errors/Equal_as_assign
---
files/ru/_redirects.txt | 1 -
files/ru/_wikihistory.json | 4 --
.../reference/errors/equal_as_assign/index.md | 54 -------------------
3 files changed, 59 deletions(-)
delete mode 100644 files/ru/orphaned/web/javascript/reference/errors/equal_as_assign/index.md
diff --git a/files/ru/_redirects.txt b/files/ru/_redirects.txt
index 0f5a243af82f56..3ec2918d23aa2e 100644
--- a/files/ru/_redirects.txt
+++ b/files/ru/_redirects.txt
@@ -755,7 +755,6 @@
/ru/docs/Web/JavaScript/Reference/Classes/Приватные_поля_класса /ru/docs/Web/JavaScript/Reference/Classes/Private_properties
/ru/docs/Web/JavaScript/Reference/Errors/Bad_return_or_yield /ru/docs/Web/JavaScript/Reference/Errors/Bad_return
/ru/docs/Web/JavaScript/Reference/Errors/Deprecated_octal /ru/docs/Web/JavaScript/Reference/Errors/Deprecated_octal_literal
-/ru/docs/Web/JavaScript/Reference/Errors/Equal_as_assign /ru/docs/orphaned/Web/JavaScript/Reference/Errors/Equal_as_assign
/ru/docs/Web/JavaScript/Reference/Errors/Missing_semicolon_before_statement /ru/docs/conflicting/Web/JavaScript/Reference/Errors/Unexpected_token
/ru/docs/Web/JavaScript/Reference/Errors/Not_a_codepoint /ru/docs/Web/JavaScript/Reference/Errors/Not_a_valid_code_point
/ru/docs/Web/JavaScript/Reference/Errors/Unterminated_string_literal /ru/docs/Web/JavaScript/Reference/Errors/String_literal_EOL
diff --git a/files/ru/_wikihistory.json b/files/ru/_wikihistory.json
index d1da7f5a8b63c4..2e1cb455101f50 100644
--- a/files/ru/_wikihistory.json
+++ b/files/ru/_wikihistory.json
@@ -15965,9 +15965,5 @@
"conflicting/Web/SVG/Attribute": {
"modified": "2020-10-15T22:34:58.576Z",
"contributors": ["osipov_s"]
- },
- "orphaned/Web/JavaScript/Reference/Errors/Equal_as_assign": {
- "modified": "2020-03-12T19:48:37.445Z",
- "contributors": ["MakarovDs777"]
}
}
diff --git a/files/ru/orphaned/web/javascript/reference/errors/equal_as_assign/index.md b/files/ru/orphaned/web/javascript/reference/errors/equal_as_assign/index.md
deleted file mode 100644
index af44799a3859d3..00000000000000
--- a/files/ru/orphaned/web/javascript/reference/errors/equal_as_assign/index.md
+++ /dev/null
@@ -1,54 +0,0 @@
----
-title: "SyntaxError: test for equality (==) mistyped as assignment (=)?(тест на равенство (==) опечатка как присваивание (=)?)"
-slug: orphaned/Web/JavaScript/Reference/Errors/Equal_as_assign
-original_slug: Web/JavaScript/Reference/Errors/Equal_as_assign
----
-
-{{jsSidebar("Errors")}}
-
-## Сообщения
-
-```
-Warning: SyntaxError: тест на равенство (==) опечатка как присваивание (=)?
-```
-
-## Тип ошибки
-
-(Только в Firefox) {{jsxref("SyntaxError")}} предупреждение, в котором сообщается, только если `javascript.options.strict` предпочтение установлено в `true`.
-
-## Что пошло не так?
-
-Было присвоение ( = ), когда вы обычно ожидали тест на присвоение (==). Чтобы помочь отладке, JavaScript (с включёнными строгими предупреждениями) предупреждает об этом шаблоне.
-
-## Примеры
-
-### Задание в условных выражениях
-
-Рекомендуется не использовать простые назначения в условном выражении (например, if...else), поскольку при просмотре кода назначение можно спутать с равенством. Например, не используйте следующий код:
-
-```js-nolint example-bad
-if (x = y) {
- // делать правильные вещи
-}
-```
-
-Если необходимо использовать присваивание в условном выражении, то обычно вокруг него ставят дополнительные скобки. Например:
-
-```js
-if ((x = y)) {
- // делать правильные вещи
-}
-```
-
-В противном случае вы, вероятно, хотели использовать оператор сравнения (например, = = или ===):
-
-```js
-if (x == y) {
- // делать правильные вещи
-}
-```
-
-## Смотрите также
-
-- [`if...else`](/ru/docs/Web/JavaScript/Reference/Statements/if...else)
-- [Comparison operators](/ru/docs/Web/JavaScript/Reference/Operators/Comparison_Operators)
From cdd96def2df421f6448e077a5dfa1af00f6b37d0 Mon Sep 17 00:00:00 2001
From: Hoarfroster
Date: Thu, 25 Jul 2024 07:01:12 +0800
Subject: [PATCH 018/185] zh-CN: update Glossary/Accessibility_tree (#22565)
---
files/zh-cn/glossary/accessibility_tree/index.md | 15 ++++++++++++---
1 file changed, 12 insertions(+), 3 deletions(-)
diff --git a/files/zh-cn/glossary/accessibility_tree/index.md b/files/zh-cn/glossary/accessibility_tree/index.md
index e655299fb09681..dfca4830bd6a8d 100644
--- a/files/zh-cn/glossary/accessibility_tree/index.md
+++ b/files/zh-cn/glossary/accessibility_tree/index.md
@@ -2,7 +2,7 @@
title: 无障碍树
slug: Glossary/Accessibility_tree
l10n:
- sourceCommit: 1f44fd905e4acbe867ca945b26a8b06ddb646328
+ sourceCommit: 50e5e8a9b8a6b7d0dd9877610c9639d8b90f329f
---
{{GlossarySidebar}}
@@ -19,7 +19,7 @@ l10n:
- : 除了无障碍名称,我们还可以如何描述这个东西?一个表格的描述可以解释这个表格包含了什么样的信息。
- [**角色**](/zh-CN/docs/Web/Accessibility/ARIA/Roles)
- : 这个是什么?例如,这是按钮、导航栏,还是列表?
-- **状态**
+- [**状态**](/zh-CN/docs/Web/Accessibility/ARIA/Attributes)
- : 它有状态吗?例如,复选框被选中与否、[``](/zh-CN/docs/Web/HTML/Element/summary) 元素被展开与否。
除此之外,无障碍树经常包含可以对这个元素进行操作的行为:一个链接可以被*访问*,一个文本输入框可以被*输入*,等等。
@@ -28,6 +28,15 @@ l10n:
## 参见
-- [术语](/zh-CN/docs/Glossary)
+- [无障碍](/zh-CN/docs/Web/Accessibility)
+- [学习无障碍](/zh-CN/docs/Learn/Accessibility)
+- 维基百科的 [Web 无障碍](https://zh.wikipedia.org/wiki/网站无障碍)
+- [Web Accessibility In Mind](https://webaim.org/)
+- [无障碍富互联网应用(ARIA)](/zh-CN/docs/Web/Accessibility/ARIA)
+- [Web 无障碍倡议(WAI)](https://www.w3.org/WAI/)
+- [WAI-ARIA 推荐](https://w3c.github.io/aria/)
+- 相关术语:
- {{Glossary("Accessibility", "无障碍")}}
+ - {{Glossary("Accessible description", "无障碍描述")}}
+ - {{Glossary("Accessible name", "无障碍名称")}}
- {{Glossary("ARIA")}}
From b561739e99d9880501bf75a28e5837c832910946 Mon Sep 17 00:00:00 2001
From: Hoarfroster
Date: Thu, 25 Jul 2024 07:08:16 +0800
Subject: [PATCH 019/185] zh-CN: update Glossary/URN (#22266)
Co-authored-by: A1lo
---
files/zh-cn/glossary/urn/index.md | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/files/zh-cn/glossary/urn/index.md b/files/zh-cn/glossary/urn/index.md
index 0390761a6982c7..14e99d0749d53e 100644
--- a/files/zh-cn/glossary/urn/index.md
+++ b/files/zh-cn/glossary/urn/index.md
@@ -1,12 +1,14 @@
---
title: URN
slug: Glossary/URN
+l10n:
+ sourceCommit: fbc9980c0718c3ead40863b20a74fc8535ebcc85
---
{{GlossarySidebar}}
-URN(统一资源名称)是标准格式的 URI,指的是资源而不指定其位置或是否存在。这个例子来自[RFC3986](https://www.ietf.org/rfc/rfc3986.txt): `urn:oasis:names:specification:docbook:dtd:xml:4.1.2`
+URN(统一资源名称)是标准格式的 URI,指的是资源而不指定其位置或是否存在。如来自 [RFC3986](https://datatracker.ietf.org/doc/html/rfc3986.txt) 的示例:`urn:oasis:names:specification:docbook:dtd:xml:4.1.2`
## 参见
-- [URN](https://zh.wikipedia.org/wiki/URN) on Wikipedia
+- 维基百科上的 [URN](https://zh.wikipedia.org/wiki/统一资源名称)
From 63ab5a8b745aceee1aa3e848bfa2168b378291d0 Mon Sep 17 00:00:00 2001
From: Hoarfroster
Date: Thu, 25 Jul 2024 07:09:25 +0800
Subject: [PATCH 020/185] zh-CN: create Glossary/WebAssembly (#22244)
Co-authored-by: A1lo
---
files/zh-cn/glossary/webassembly/index.md | 16 ++++++++++++++++
1 file changed, 16 insertions(+)
create mode 100644 files/zh-cn/glossary/webassembly/index.md
diff --git a/files/zh-cn/glossary/webassembly/index.md b/files/zh-cn/glossary/webassembly/index.md
new file mode 100644
index 00000000000000..fe77e194978954
--- /dev/null
+++ b/files/zh-cn/glossary/webassembly/index.md
@@ -0,0 +1,16 @@
+---
+title: WebAssembly
+slug: Glossary/WebAssembly
+l10n:
+ sourceCommit: ada5fa5ef15eadd44b549ecf906423b4a2092f34
+---
+
+{{GlossarySidebar}}
+
+**WebAssembly**(缩写 _Wasm_)是一种开放的{{Glossary("binary", "二进制")}}编程格式,可以在现代 Web {{Glossary("Browser", "浏览器")}}中运行,以提高性能,并为网页提供新特性。
+
+## 参见
+
+- 维基百科上的 [WebAssembly](https://zh.wikipedia.org/wiki/WebAssembly)
+- [官网](https://webassembly.org/)
+- MDN 上的 [WebAssembly](/zh-CN/docs/WebAssembly)
From 4bfb55eb1247d4d84b0e853500e420cef3ebe6aa Mon Sep 17 00:00:00 2001
From: Hoarfroster
Date: Thu, 25 Jul 2024 08:41:36 +0800
Subject: [PATCH 021/185] zh-CN: create Glossary/Usenet (#22261)
---
files/zh-cn/glossary/usenet/index.md | 14 ++++++++++++++
1 file changed, 14 insertions(+)
create mode 100644 files/zh-cn/glossary/usenet/index.md
diff --git a/files/zh-cn/glossary/usenet/index.md b/files/zh-cn/glossary/usenet/index.md
new file mode 100644
index 00000000000000..a7502f2ae14d15
--- /dev/null
+++ b/files/zh-cn/glossary/usenet/index.md
@@ -0,0 +1,14 @@
+---
+title: Usenet
+slug: Glossary/Usenet
+l10n:
+ sourceCommit: ada5fa5ef15eadd44b549ecf906423b4a2092f34
+---
+
+{{GlossarySidebar}}
+
+Usenet 是一个互联网讨论系统,每个帖子都会在多个服务器上复制。Usenet 相当于当时的互联网论坛,它的功能类似于公告板系统。
+
+## 参见
+
+- 维基百科上的 [Usenet](https://zh.wikipedia.org/wiki/Usenet)
From aeb6c6f14655bdb92f9e798907fc276adaf8e333 Mon Sep 17 00:00:00 2001
From: Hoarfroster
Date: Thu, 25 Jul 2024 10:14:09 +0800
Subject: [PATCH 022/185] zh-CN: update Glossary/Accessibility (#22564)
Co-authored-by: A1lo
---
files/zh-cn/glossary/accessibility/index.md | 24 +++++++++++++++------
1 file changed, 17 insertions(+), 7 deletions(-)
diff --git a/files/zh-cn/glossary/accessibility/index.md b/files/zh-cn/glossary/accessibility/index.md
index 76f5bdfcbe9d17..fea9ccfa921fa8 100644
--- a/files/zh-cn/glossary/accessibility/index.md
+++ b/files/zh-cn/glossary/accessibility/index.md
@@ -2,19 +2,29 @@
title: 无障碍
slug: Glossary/Accessibility
l10n:
- sourceCommit: ada5fa5ef15eadd44b549ecf906423b4a2092f34
+ sourceCommit: 50e5e8a9b8a6b7d0dd9877610c9639d8b90f329f
---
{{GlossarySidebar}}
-_无障碍网页_(Web Accessibility,缩写:**A11Y**)指尽管在物理条件和技术条件限制下,仍能保证网站可用的最佳实践。{{Glossary("W3C")}} 组织的 {{Glossary("WAI","Web 无障碍倡议")}}(WAI)正式定义和论述了 Web 无障碍技术。
+_无障碍_(Accessibility,缩写:**A11Y**)意味着让尽可能多的人(包括能力受限的)能够使用网站。实现此目标的最常见做法是确保无障碍技术可以正常访问内容。这些技术包括{{glossary("screen reader", "屏幕阅读器")}}、屏幕放大镜、语音识别工具以及替代输入设备等。
+
+你可以使用类似 [Lighthouse](https://developer.chrome.com/docs/lighthouse/accessibility/scoring) 和 [Firefox 无障碍检查器](https://firefox-source-docs.mozilla.org/devtools-user/accessibility_inspector/index.html)这样的工具衡量你的网站的无障碍水平。
+
+{{Glossary("W3C")}} 组织的 {{Glossary("WAI","Web 无障碍倡议")}}(WAI)正式地定义和论述了 Web 无障碍技术。
## 参见
-- [MDN 上的无障碍资源](/zh-CN/docs/Web/Accessibility)
-- 维基百科的 [Web 无障碍](https://zh.wikipedia.org/wiki/网站无障碍)词条
+- [无障碍](/zh-CN/docs/Web/Accessibility)
- [学习无障碍](/zh-CN/docs/Learn/Accessibility)
-- [Web Accessibility In Mind](https://webaim.org/)
-- [MDN 上的 ARIA 文档](/zh-CN/docs/Web/Accessibility/ARIA)
-- [Web 无障碍倡议主页](https://www.w3.org/WAI/)
+- [无障碍富互联网应用(ARIA)](/zh-CN/docs/Web/Accessibility/ARIA)
+- 维基百科的 [Web 无障碍](https://zh.wikipedia.org/wiki/网站无障碍)
+- W3C 上的 [Web 无障碍倡议(WAI)](https://www.w3.org/WAI/)
- [WAI-ARIA 推荐](https://www.w3.org/TR/wai-aria/)
+- [Web Accessibility In Mind](https://webaim.org/)
+- 相关术语:
+ - {{Glossary("ARIA")}}
+ - {{Glossary("Screen reader", "屏幕阅读器")}}
+ - {{Glossary("Accessibility tree", "无障碍树")}}
+ - {{Glossary("Accessible description", "无障碍描述")}}
+ - {{Glossary("Accessible name", "无障碍名称")}}
From f1b2adccec87eb13abae227df285b0aaf3f79cc8 Mon Sep 17 00:00:00 2001
From: Hoarfroster
Date: Thu, 25 Jul 2024 10:16:27 +0800
Subject: [PATCH 023/185] zh-CN: update Glossary/UX (#22260)
Co-authored-by: A1lo
---
files/zh-cn/glossary/ux/index.md | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/files/zh-cn/glossary/ux/index.md b/files/zh-cn/glossary/ux/index.md
index 2ca5d798b3fe27..3ce6f5ef50d5bb 100644
--- a/files/zh-cn/glossary/ux/index.md
+++ b/files/zh-cn/glossary/ux/index.md
@@ -1,14 +1,16 @@
---
title: UX
slug: Glossary/UX
+l10n:
+ sourceCommit: ada5fa5ef15eadd44b549ecf906423b4a2092f34
---
{{GlossarySidebar}}
-UX(User eXperience) 是用户体验的首字母缩写。它是研究用户和系统之间的交互。其目标是使系统易于从用户的角度进行交互。
+**UX** 是 User eXperience 的缩写,意为用户体验。它是对用户与系统之间的交互的研究。其目标是从用户的角度使系统易于交互。
-该系统可以是用户最终可以交互的任何类型的产品或应用程序。例如,在网页上进行的 UX 研究可以证明用户是否容易理解页面,引导到不同的页面并完成一般操作,以及减少这些过程中用户的操作步骤。
+系统可以是任何一种用户应该与之交互的产品或应用。例如,对网页进行的 UX 研究可以展示用户是否容易理解页面、导航到不同区域以及完成常见任务,以及哪些过程可以减少摩擦。
## 参见
-- 维基百科[用户体验](https://zh.wikipedia.org/wiki/使用者經驗)
+- 维基百科上的[用户体验](https://zh.wikipedia.org/wiki/使用者經驗)
From 7f21368c69359fa7b6329dc01e7f8e78aeb07772 Mon Sep 17 00:00:00 2001
From: Hoarfroster
Date: Thu, 25 Jul 2024 10:17:09 +0800
Subject: [PATCH 024/185] zh-CN: create Glossary/UUID (#22258)
---
files/zh-cn/glossary/uuid/index.md | 21 +++++++++++++++++++++
1 file changed, 21 insertions(+)
create mode 100644 files/zh-cn/glossary/uuid/index.md
diff --git a/files/zh-cn/glossary/uuid/index.md b/files/zh-cn/glossary/uuid/index.md
new file mode 100644
index 00000000000000..4bd5cc8f6d9a07
--- /dev/null
+++ b/files/zh-cn/glossary/uuid/index.md
@@ -0,0 +1,21 @@
+---
+title: UUID
+slug: Glossary/UUID
+l10n:
+ sourceCommit: ada5fa5ef15eadd44b549ecf906423b4a2092f34
+---
+
+{{GlossarySidebar}}
+
+**通用唯一标识符**(UUID)是用于在所有其他同类资源中唯一标识资源的标签。
+
+计算机系统在本地使用非常大的随机数生成 UUID。理论上,这些 ID 可能不是全局唯一的,但重复的概率非常小。如果系统确实需要绝对唯一的 ID,则这些 ID 可能由中央机构分配。
+
+UUID 是 128 位值,通常表示为 36 个字符的字符串,格式为 `123e4567-e89b-12d3-a456-426614174000`(5 个由连字符分隔的十六进制字符串)。有几个版本在计算方式上略有不同;例如,包含时间信息。
+
+正式的定义可以在 [RFC4122: A Universally Unique IDentifier (UUID) URN Namespace](https://www.rfc-editor.org/rfc/rfc4122) 中找到。
+
+## 参见
+
+- 维基百科上的 [UUID](https://zh.wikipedia.org/wiki/通用唯一识别码)
+- [`Crypto.randomUUID()`](/zh-CN/docs/Web/API/Crypto/randomUUID)
From ff352f445c76367ff626a1804da3815952cdc99a Mon Sep 17 00:00:00 2001
From: Hoarfroster
Date: Thu, 25 Jul 2024 10:23:30 +0800
Subject: [PATCH 025/185] zh-CN: update Glossary/Variable (#22256)
---
files/zh-cn/glossary/variable/index.md | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/files/zh-cn/glossary/variable/index.md b/files/zh-cn/glossary/variable/index.md
index 3f03c65e7c2a30..aa67a18e9ac0e9 100644
--- a/files/zh-cn/glossary/variable/index.md
+++ b/files/zh-cn/glossary/variable/index.md
@@ -1,14 +1,16 @@
---
title: 变量
slug: Glossary/Variable
+l10n:
+ sourceCommit: ada5fa5ef15eadd44b549ecf906423b4a2092f34
---
{{GlossarySidebar}}
-变量是{{Glossary("Value", "值")}}的具名引用。这样,不可预测的值可以通过预定的名称来访问。
+变量是{{Glossary("Value", "值")}}的具名引用。这样可以让不可预测的值通过预定的名称来访问。
## 参见
-- 维基百科上的[变量(程序设计)]()词条
+- 维基百科上的[变量(程序设计)]()
- [在 JavaScript 中声明变量](/zh-CN/docs/Web/JavaScript/Guide/Grammar_and_types#声明)
- [JavaScript 的 `var` 语句](/zh-CN/docs/Web/JavaScript/Reference/Statements/var)
From f8179242ca72d934fdb1b743cbb0a03557765d67 Mon Sep 17 00:00:00 2001
From: Hoarfroster
Date: Thu, 25 Jul 2024 10:24:52 +0800
Subject: [PATCH 026/185] zh-CN: create Glossary/Web_standards (#22246)
Co-authored-by: A1lo
---
files/zh-cn/glossary/web_standards/index.md | 32 +++++++++++++++++++++
1 file changed, 32 insertions(+)
create mode 100644 files/zh-cn/glossary/web_standards/index.md
diff --git a/files/zh-cn/glossary/web_standards/index.md b/files/zh-cn/glossary/web_standards/index.md
new file mode 100644
index 00000000000000..5fdbd5664f984c
--- /dev/null
+++ b/files/zh-cn/glossary/web_standards/index.md
@@ -0,0 +1,32 @@
+---
+title: Web 标准
+slug: Glossary/Web_standards
+l10n:
+ sourceCommit: 86b695e507a30ebcbb5348710b001ca03bff74b4
+---
+
+{{GlossarySidebar}}
+
+Web 标准是由国际标准组织制定的规则,用于定义 {{Glossary("World Wide Web", "Web")}} 的工作方式(有时也控制{{Glossary("Internet", "因特网")}})。
+
+有几个标准组织负责定义 Web 的不同方面,所有标准必须协调一致,以使 Web 的可用性和可访问性最大化。Web 标准也必须不断发展,以改进当前状态并适应新的情况。
+
+以下是一个非详尽的列表,让你了解网站和网络系统必须符合的标准:
+
+- **IETF**(互联网工程任务组):互联网标准(STD),其中包括管理 {{Glossary("URI", "URI")}}、{{Glossary("HTTP")}} 和 {{Glossary("MIME")}} 的设置和使用等内容
+- **{{Glossary("W3C")}}**:标记语言(例如 {{Glossary("HTML")}})、样式定义(即 {{Glossary("CSS")}})、{{Glossary("DOM")}}、{{Glossary("Accessibility", "无障碍")}}等规范
+- **IANA**(互联网号码分配局):名称和号码的注册管理
+- **Ecma 国际**:脚本标准,最突出的是 {{Glossary("JavaScript")}} 标准
+- **{{Glossary("ISO")}}**(国际标准化组织):涵盖各种方面的标准,包括字符编码、网站管理和用户界面设计等
+
+## 反对标准
+
+偶尔地,标准组织的成员可能对某个特性的发展方式存在分歧,有些人可能**反对**它。这意味着与当前形式的特性存在分歧的技术实施者(例如 Web 浏览器供应商)可能永远不会实现它。
+
+*同意*该特性的供应商通常仍会实现它,以便可以对其进行实验并提供反馈。这使得感兴趣的各方可以构建用例并展示该特性的问题,希望能够达成对未来版本的共识。
+
+标准组织的成员通常会发布他们对不同标准的立场记录,供参考。例如,参见 [Mozilla 规范立场](https://mozilla.github.io/standards-positions/)和 [WebKit 标准立场](https://webkit.org/standards-positions/)。
+
+## 参见
+
+- 维基百科上的 [Web 标准](https://zh.wikipedia.org/wiki/網頁標準)
From b7a76da3cb5f0c25ff0e77bfabb11b32f8df7666 Mon Sep 17 00:00:00 2001
From: Hoarfroster
Date: Thu, 25 Jul 2024 10:25:58 +0800
Subject: [PATCH 027/185] zh-CN: create Glossary/Visual_viewport (#22254)
Co-authored-by: A1lo
---
files/zh-cn/glossary/visual_viewport/index.md | 19 +++++++++++++++++++
1 file changed, 19 insertions(+)
create mode 100644 files/zh-cn/glossary/visual_viewport/index.md
diff --git a/files/zh-cn/glossary/visual_viewport/index.md b/files/zh-cn/glossary/visual_viewport/index.md
new file mode 100644
index 00000000000000..3053237cd75fc6
--- /dev/null
+++ b/files/zh-cn/glossary/visual_viewport/index.md
@@ -0,0 +1,19 @@
+---
+title: 可视视口
+slug: Glossary/Visual_Viewport
+l10n:
+ sourceCommit: 50e5e8a9b8a6b7d0dd9877610c9639d8b90f329f
+---
+
+{{GlossarySidebar}}
+
+{{Glossary("viewport", "视口")}}的当前可见部分被称作是可视视口。这可能比布局视口小,例如当用户进行了缩放操作时。可视视口是屏幕上的可视部分,不包括屏幕键盘、缩放区域外的区域,以及任何不随页面尺寸变化的屏幕上的物件。
+
+## 参见
+
+- [可视视口 API](/zh-CN/docs/Web/API/Visual_Viewport_API)
+- 维基百科上的[视口](https://zh.wikipedia.org/wiki/视口)
+- [两种视口的故事](https://www.quirksmode.org/mobile/viewports.html)(Quirksmode)
+- 相关术语:
+ - {{Glossary("Viewport", "视口")}}
+ - {{Glossary("Layout viewport", "布局视口")}}
From f333e92ac4dd4aef92342afb8a81cf205aadc00e Mon Sep 17 00:00:00 2001
From: Hoarfroster
Date: Thu, 25 Jul 2024 15:52:47 +0800
Subject: [PATCH 028/185] zh-CN: update Glossary/Vendor_Prefix (#22257)
Co-authored-by: A1lo
---
files/zh-cn/glossary/vendor_prefix/index.md | 44 +++++++++++++--------
1 file changed, 27 insertions(+), 17 deletions(-)
diff --git a/files/zh-cn/glossary/vendor_prefix/index.md b/files/zh-cn/glossary/vendor_prefix/index.md
index c5442da943ec78..7a778a0465aac8 100644
--- a/files/zh-cn/glossary/vendor_prefix/index.md
+++ b/files/zh-cn/glossary/vendor_prefix/index.md
@@ -1,24 +1,26 @@
---
title: 浏览器引擎前缀
slug: Glossary/Vendor_Prefix
+l10n:
+ sourceCommit: e099e74fe5c09c46f0dfe044894692721a713d29
---
{{GlossarySidebar}}
-浏览器厂商们有时会给实验性的或者非标准的 CSS 属性和 JavaScript API 添加前缀,这样开发者就可以用这些新的特性进行试验,同时(理论上)防止他们的试验代码被依赖,从而在标准化过程中破坏 web 开发者的代码。开发者应该等到浏览器行为标准化之后再使用未加前缀的属性。
+浏览器厂商有时会给实验性的或者非标准的 CSS 属性和 JavaScript API 添加前缀,这样开发者就可以用这些新的特性进行试验,同时(理论上)防止他们的试验代码被依赖,从而在标准化过程中破坏 Web 开发者的代码。开发者应该等到浏览器行为标准化之后再使用未加前缀的属性。
-> **备注:** 浏览器厂商们正在努力停止使用前缀来表示实验性质的代码的行为。Web 开发者一直在生产环境的网站上使用这些实验性代码,这使得浏览器厂商更难保证浏览器兼容性和处理新特性;这也伤害了更小众的浏览器,它们被迫添加其他浏览器前缀以加载热门网站。
->
-> 现在的趋势是将实验性功能添加在需要用户自行设置偏好或标记(flag)的地方,同时编写一个更小规模的规范,以更快达到稳定状态。
+Web 开发者一直在生产环境的网站上使用这些实验性代码,这使得浏览器厂商更难保证浏览器兼容性和处理新特性;这也伤害了更小众的浏览器,它们被迫添加其他浏览器前缀以渲染热门网站。
+
+现在,浏览器引擎的实验性特性被“放在一个标志(flag)后面”。这使得开发者可以更改浏览器配置来测试即将到来的特性。浏览器现在通过用户控制的标志(flag)或首选项添加实验性特性。标志会被用于较小的规范,以更快达到稳定状态。
## CSS 前缀
-主流浏览器引擎前缀:
+你在旧代码中可能会看到的最常见的浏览器 CSS 前缀包括:
-- `-webkit-` (谷歌,Safari,新版 Opera 浏览器,以及几乎所有 iOS 系统中的浏览器(包括 iOS 系统中的火狐浏览器);基本上所有基于 WebKit 内核的浏览器)
-- `-moz-` (火狐浏览器)
-- `-o-` (旧版 Opera 浏览器)
-- `-ms-` (IE 浏览器 和 Edge 浏览器)
+- `-webkit-`(Chrome、Safari、新版 Opera 浏览器以及几乎所有 iOS 系统中的浏览器(包括 iOS 系统中的火狐浏览器);简单的说,所有基于 WebKit 内核的浏览器)
+- `-moz-`(火狐浏览器)
+- `-o-`(旧版、WebKit 之前的 Opera 浏览器)
+- `-ms-`(IE 浏览器和 Chromium 之前的 Edge 浏览器)
示例:
@@ -30,6 +32,12 @@ slug: Glossary/Vendor_Prefix
transition: all 4s ease;
```
+如果你在代码库中遇到上面的代码,你可以安全地删除除最后一行之外的所有内容。所有浏览器都已支持不带浏览器引擎前缀的[过渡](/zh-CN/docs/Web/CSS/transition#浏览器兼容性):
+
+```css
+transition: all 4s ease;
+```
+
## API 前缀
过去,浏览器引擎也使用前缀修饰实验性质的 API。如果整个接口都是实验性的,前缀修饰的就是接口名(但不包括其中的属性或者方法)。如果将一个实验性的接口或者方法添加到一个标准化的接口中,这个新增的接口或者方法被前缀修饰。
@@ -38,19 +46,19 @@ transition: all 4s ease;
需要使用大写的前缀修饰接口名:
-- `WebKit` (谷歌,Safari, 新版 Opera 浏览器,以及几乎所有 iOS 系统中的浏览器 (包括 iOS 系统中的火狐浏览器); 简单的说,所有基于 WebKit 内核的浏览器)
-- `Moz` (火狐浏览器)
-- `O` (旧版 Opera 浏览器)
-- `MS` (IE 浏览器 和 Edge 浏览器)
+- `WebKit`(Chrome、Safari、新版 Opera 浏览器以及几乎所有 iOS 系统中的浏览器(包括 iOS 系统中的火狐浏览器);简单的说,所有基于 WebKit 内核的浏览器)
+- `Moz`(火狐浏览器)
+- `O`(旧版、WebKit 之前的 Opera 浏览器)
+- `MS`(IE 浏览器和 Chromium 之前的 Edge 浏览器)
### 属性和方法前缀
需要使用小写的前缀修饰属性或者方法
-- `webkit` (谷歌,Safari, 新版 Opera 浏览器,以及几乎所有 iOS 系统中的浏览器 (包括 iOS 系统中的火狐浏览器); 简单的说,所有基于 WebKit 内核的浏览器)
-- `moz` (火狐浏览器)
-- `o` (旧版 Opera 浏览器等
-- `ms` (IE 浏览器 和 Edge 浏览器)
+- `webkit`(Chrome、Safari、新版 Opera 浏览器以及几乎所有 iOS 系统中的浏览器(包括 iOS 系统中的火狐浏览器);简单的说,所有基于 WebKit 内核的浏览器)
+- `moz`(火狐浏览器)
+- `o`(旧版、WebKit 之前的 Opera 浏览器)
+- `ms`(IE 浏览器和 Chromium 之前的 Edge 浏览器)
示例:
@@ -65,4 +73,6 @@ window.requestAnimationFrame =
## 参见
+- [`-moz-` 浏览器引擎前缀 CSS 拓展](/zh-CN/docs/Web/CSS/Mozilla_Extensions)
+- [`-webkit-` 浏览器引擎前缀 CSS 拓展](/zh-CN/docs/Web/CSS/WebKit_Extensions)
- 维基百科[浏览器引擎前缀](https://zh.wikipedia.org/wiki/CSS濾器#前缀_滤镜)
From b7a0b8cf4b4499aa46008f024efc1f6c150d9557 Mon Sep 17 00:00:00 2001
From: Hoarfroster
Date: Thu, 25 Jul 2024 15:54:37 +0800
Subject: [PATCH 029/185] zh-CN: create Glossary/Web_performance (#22248)
Co-authored-by: A1lo
---
files/zh-cn/glossary/web_performance/index.md | 17 +++++++++++++++++
1 file changed, 17 insertions(+)
create mode 100644 files/zh-cn/glossary/web_performance/index.md
diff --git a/files/zh-cn/glossary/web_performance/index.md b/files/zh-cn/glossary/web_performance/index.md
new file mode 100644
index 00000000000000..5d57c52ed0cb98
--- /dev/null
+++ b/files/zh-cn/glossary/web_performance/index.md
@@ -0,0 +1,17 @@
+---
+title: Web 性能
+slug: Glossary/Web_performance
+l10n:
+ sourceCommit: ada5fa5ef15eadd44b549ecf906423b4a2092f34
+---
+
+{{GlossarySidebar}}
+
+**Web 性能**是从用户请求内容到用户的浏览器中显示请求的内容的时间、客观的渲染时间以及加载时间和运行时间的主观用户体验。
+
+客观上,它是测量网页或 Web 应用程序下载、在用户的 Web 浏览器中绘制并变得响应和交互所需的时间,以毫秒为单位。它是每秒帧数和主线程不可用于用户交互的时间。主观上,它是用户对从请求内容到用户认为所请求的内容可用的时间感知:用户*觉得*所花费的时间是快还是慢。
+
+## 参见
+
+- [学习 Web 性能](/zh-CN/docs/Learn/Performance)
+- [感知性能](/zh-CN/docs/Glossary/Perceived_performance)
From e2372310ad1c1e7f24ce3e0680dd0a42de67d451 Mon Sep 17 00:00:00 2001
From: Cateon Huo <44727214+GuGuMur@users.noreply.github.com>
Date: Thu, 25 Jul 2024 22:05:29 +0800
Subject: [PATCH 030/185] [zh-cn]: create css property `text-emphasis` related
translations (#22185)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: skyclouds2001 <95597335+skyclouds2001@users.noreply.github.com>
Co-authored-by: A1lo
---
.../web/css/shorthand_properties/index.md | 2 +-
.../web/css/text-emphasis-color/index.md | 84 ++++++++++
.../web/css/text-emphasis-position/index.md | 154 ++++++++++++++++++
.../web/css/text-emphasis-style/index.md | 94 +++++++++++
files/zh-cn/web/css/text-emphasis/index.md | 123 ++++++++++++++
5 files changed, 456 insertions(+), 1 deletion(-)
create mode 100644 files/zh-cn/web/css/text-emphasis-color/index.md
create mode 100644 files/zh-cn/web/css/text-emphasis-position/index.md
create mode 100644 files/zh-cn/web/css/text-emphasis-style/index.md
create mode 100644 files/zh-cn/web/css/text-emphasis/index.md
diff --git a/files/zh-cn/web/css/shorthand_properties/index.md b/files/zh-cn/web/css/shorthand_properties/index.md
index d3a574d6c83380..162d806c9869e4 100644
--- a/files/zh-cn/web/css/shorthand_properties/index.md
+++ b/files/zh-cn/web/css/shorthand_properties/index.md
@@ -26,7 +26,7 @@ p {
以上样式不会将 background 的 color 值设置为 `red`,而是 {{cssxref("background-color")}} 的默认值 `transparent`。
-关键词 inherit 只可以应用于单独属性(individual properties),如果应用于一个简写属性(shorthand property),则必须整体应用,而能对简写属性值的每一个部分单独应用。由于单独属性的漏掉的值会被它们的初始值(initial value)替代,因此不可能允许单个属性通过省略继承的。这意味着让一个属性的值使用继承值的唯一方法就是使用值是 `inherit` 的普通属性(longhand property)。
+关键词 inherit 只可以应用于单独属性(individual properties),如果应用于一个简写属性(shorthand property),则必须整体应用,而能对简写属性值的每一个部分单独应用。由于单独属性的漏掉的值会被它们的初始值(initial value)替代,因此不可能允许单个属性通过省略继承的。这意味着让一个属性的值使用继承值的唯一方法就是使用值是 `inherit` 的全称属性(longhand property)。
### 属性的顺序
diff --git a/files/zh-cn/web/css/text-emphasis-color/index.md b/files/zh-cn/web/css/text-emphasis-color/index.md
new file mode 100644
index 00000000000000..d71d13d47bb13b
--- /dev/null
+++ b/files/zh-cn/web/css/text-emphasis-color/index.md
@@ -0,0 +1,84 @@
+---
+title: text-emphasis-color
+slug: Web/CSS/text-emphasis-color
+l10n:
+ sourceCommit: 5f13cbe7517ce96deeb521d4c8e6923266a22913
+---
+
+{{CSSRef}}
+
+[CSS](/zh-CN/docs/Web/CSS) 属性 **`text-emphasis-color`** 设置强调色。这个值也可以使用简写属性 {{cssxref("text-emphasis")}} 来设置。
+
+{{EmbedInteractiveExample("pages/css/text-emphasis-color.html")}}
+
+## 语法
+
+```css
+/* 初始值 */
+text-emphasis-color: currentcolor;
+
+/* */
+text-emphasis-color: #555;
+text-emphasis-color: blue;
+text-emphasis-color: rgb(90 200 160 / 80%);
+text-emphasis-color: transparent;
+
+/* 全局值 */
+text-emphasis-color: inherit;
+text-emphasis-color: initial;
+text-emphasis-color: revert;
+text-emphasis-color: revert-layer;
+text-emphasis-color: unset;
+```
+
+### 取值
+
+- ``
+ - : 指定用作强调色的颜色。如果未定义,该值默认为 `currentcolor`。
+
+## 形式定义
+
+{{CSSInfo}}
+
+## 形式语法
+
+{{csssyntax}}
+
+## 示例
+
+### 设置自定义强调色和强调标记
+
+#### CSS
+
+```css
+em {
+ text-emphasis-color: green;
+ text-emphasis-style: "*";
+}
+```
+
+#### HTML
+
+```html
+这是一个示例:
+
+这里有强调标记!
+```
+
+#### 结果
+
+{{EmbedLiveSample("设置自定义强调色和强调标记", 450, 100)}}
+
+## 规范
+
+{{Specifications}}
+
+## 浏览器兼容性
+
+{{Compat}}
+
+## 参见
+
+- {{cssxref("<color>")}} 数据类型
+- 其他强调标记相关属性:{{cssxref('text-emphasis-style')}}、{{cssxref('text-emphasis')}} 和 {{cssxref("text-emphasis-position")}}
+- 其他颜色相关属性:{{cssxref("color")}}、{{cssxref("background-color")}}、{{cssxref("border-color")}}、{{cssxref("outline-color")}}、{{cssxref("text-emphasis-color")}}、{{cssxref("text-shadow")}}、{{cssxref("caret-color")}} 和 {{cssxref("column-rule-color")}}
diff --git a/files/zh-cn/web/css/text-emphasis-position/index.md b/files/zh-cn/web/css/text-emphasis-position/index.md
new file mode 100644
index 00000000000000..e8dfcc64d8cdd5
--- /dev/null
+++ b/files/zh-cn/web/css/text-emphasis-position/index.md
@@ -0,0 +1,154 @@
+---
+title: text-emphasis-position
+slug: Web/CSS/text-emphasis-position
+l10n:
+ sourceCommit: b82ff59aab7883b7bb2222cf9f9f9b6eed818e08
+---
+
+{{CSSRef}}
+
+[CSS](/zh-CN/docs/Web/CSS) 属性 **`text-emphasis-position`** 设置强调标记的位置。强调标记(如注音字符)在没有足够空间时,会自动增加行高。
+
+{{EmbedInteractiveExample("pages/css/text-emphasis-position.html")}}
+
+## 语法
+
+```css
+/* 初始值 */
+text-emphasis-position: over right;
+
+/* 关键字值 */
+text-emphasis-position: over left;
+text-emphasis-position: under right;
+text-emphasis-position: under left;
+
+text-emphasis-position: left over;
+text-emphasis-position: right under;
+text-emphasis-position: left under;
+
+/* 全局值 */
+text-emphasis-position: inherit;
+text-emphasis-position: initial;
+text-emphasis-position: revert;
+text-emphasis-position: revert-layer;
+text-emphasis-position: unset;
+```
+
+### 取值
+
+- `over`
+ - : 在水平书写模式下,在文本上方绘制标记。
+- `under`
+ - : 在水平书写模式下,在文本下方绘制标记。
+- `right`
+ - : 在垂直书写模式下,在文本右侧绘制标记。
+- `left`
+ - : 在垂直书写模式下,在文本左侧绘制标记。
+
+## 描述
+
+强调标记的首选位置取决于语言。例如,在日语中,首选位置是 `over right`;在中文中,首选位置则是 `under right`。下面的信息表总结了中文、蒙古语和日语的首选强调标记位置:
+
+
+
+ 标记和注音文字的首选强调标记位置
+
+
+
+ 语言
+ 偏好位置
+ 效果
+
+
+ 水平排列
+ 垂直排列
+
+
+
+
+ 日语
+ 上方
+ 右侧
+
+
+
+
+
+
+
+
+ 韩语
+
+
+ 蒙古语
+
+
+ 中文
+ 下方
+ 右侧
+
+
+
+
+
+
+
+> **备注:** `text-emphasis-position` 无法使用简写属性 {{cssxref("text-emphasis")}} 进行设置,因此也无法进行重置。
+
+## 形式定义
+
+{{CSSInfo}}
+
+## 形式语法
+
+{{csssyntax}}
+
+## 示例
+
+### 优先使用注音标记而不是强调标记
+
+一些编辑器在注音标记与强调标记冲突时倾向于隐藏强调标记。在 HTML 中,可以通过以下样式规则实现:
+
+```css
+ruby {
+ text-emphasis: none;
+}
+```
+
+### 优先使用强调标记而不是注音标记
+
+一些编辑器在强调标记与注音标记冲突时倾向于隐藏注音标记。在 HTML 中,可以通过以下样式规则实现:
+
+```css
+em {
+ text-emphasis: dot; /* 为 元素设置 text-emphasis */
+}
+
+em rt {
+ display: none; /* 隐藏 元素内部的注音标记 */
+}
+```
+
+## 规范
+
+{{Specifications}}
+
+## 浏览器兼容性
+
+{{Compat}}
+
+## 参见
+
+- 相关全称属性:{{cssxref("text-emphasis-style")}}、{{cssxref("text-emphasis-color")}},以及对应的简写属性 {{cssxref("text-emphasis")}}。
diff --git a/files/zh-cn/web/css/text-emphasis-style/index.md b/files/zh-cn/web/css/text-emphasis-style/index.md
new file mode 100644
index 00000000000000..23c6c58b83f6c5
--- /dev/null
+++ b/files/zh-cn/web/css/text-emphasis-style/index.md
@@ -0,0 +1,94 @@
+---
+title: text-emphasis-style
+slug: Web/CSS/text-emphasis-style
+l10n:
+ sourceCommit: 5a0e89bad2e2bbbd32ce22b0c2bb419ae3b7c962
+---
+
+{{CSSRef}}
+
+[CSS](/zh-CN/docs/Web/CSS) 属性 **`text-emphasis-style`** 设置强调标记的样式。这个值也可以使用简写属性 {{cssxref("text-emphasis")}} 来设置。
+
+{{EmbedInteractiveExample("pages/css/text-emphasis-style.html")}}
+
+## 语法
+
+```css
+/* 初始值 */
+text-emphasis-style: none; /* 无强调标记 */
+
+/* 值 */
+text-emphasis-style: "x";
+text-emphasis-style: "\25B2";
+text-emphasis-style: "*";
+
+/* 关键字值 */
+text-emphasis-style: filled;
+text-emphasis-style: open;
+text-emphasis-style: dot;
+text-emphasis-style: circle;
+text-emphasis-style: double-circle;
+text-emphasis-style: triangle;
+text-emphasis-style: filled sesame;
+text-emphasis-style: open sesame;
+
+/* 全局值 */
+text-emphasis-style: inherit;
+text-emphasis-style: initial;
+text-emphasis-style: revert;
+text-emphasis-style: revert-layer;
+text-emphasis-style: unset;
+```
+
+### 取值
+
+- `none`
+ - : 没有强调标记。
+- `filled`
+ - : 形状填充为纯色。如果 `filled` 和 `open` 都未被设置,这是默认设置。
+- `open`
+ - : 形状为空心。
+- `dot`
+ - : 显示小圆点作为标记。填充圆点是 `'•'`(`U+2022`),空心圆点是 `'◦'`(`U+25E6`)。
+- `circle`
+ - : 显示大圆圈作为标记。填充圆圈是 `'●'`(`U+25CF`),空心圆圈是 `'○'`(`U+25CB`)。
+- `double-circle`
+ - : 显示双重圆圈作为标记。填充双重圆圈是 `'◉'`(`U+25C9`),空心双重圆圈是 `'◎'`(`U+25CE`)。
+- `triangle`
+ - : 显示三角形作为标记。填充三角形是 `'▲'`(`U+25B2`),空心三角形是 `'△'`(`U+25B3`)。
+- `sesame`
+ - : 显示芝麻点形状作为标记。填充芝麻点是 `'﹅'`(`U+FE45`),空心芝麻点是 `'﹆'`(`U+FE46`)。
+- ``
+ - : 将指定的字符串作为标记显示。不应指定多于一个*字符*的 ``。用户代理(UA)可能会截断或忽略超过一个字素簇的字符串。
+
+## 形式定义
+
+{{CSSInfo}}
+
+## 形式语法
+
+{{csssyntax}}
+
+## 示例
+
+### 基础示例
+
+```css
+h2 {
+ -webkit-text-emphasis-style: sesame;
+ text-emphasis-style: sesame;
+}
+```
+
+## 规范
+
+{{Specifications}}
+
+## 浏览器兼容性
+
+{{Compat}}
+
+## 参见
+
+- 相关属性:{{cssxref('text-emphasis-color')}}、{{cssxref('text-emphasis')}}。
+- 用于定义强调标记的 {{cssxref('text-emphasis-position')}} 属性。
diff --git a/files/zh-cn/web/css/text-emphasis/index.md b/files/zh-cn/web/css/text-emphasis/index.md
new file mode 100644
index 00000000000000..73a3a852306a40
--- /dev/null
+++ b/files/zh-cn/web/css/text-emphasis/index.md
@@ -0,0 +1,123 @@
+---
+title: text-emphasis
+slug: Web/CSS/text-emphasis
+l10n:
+ sourceCommit: b82ff59aab7883b7bb2222cf9f9f9b6eed818e08
+---
+
+{{CSSRef}}
+
+[CSS](/zh-CN/docs/Web/CSS) 属性 **`text-emphasis`** 将强调标记应用到除去空格和控制字符的文本。这个值是 {{cssxref("text-emphasis-style")}} 和 {{cssxref("text-emphasis-color")}} 的[简写属性](/zh-CN/docs/Web/CSS/Shorthand_properties)。
+
+{{EmbedInteractiveExample("pages/css/text-emphasis.html")}}
+
+`text-emphasis` 属性与 {{cssxref("text-decoration")}} 完全不同。`text-decoration` 属性不可继承,并且指定的装饰会应用于整个元素。然而,`text-emphasis` 是可继承的,这意味着可以为其子元素更改强调标记。
+
+强调符号的大小,例如注音字符,大约是字体大小的 50%,在当前行间距不足以容纳标记时,`text-emphasis` 可能会影响行高。
+
+> **备注:** `text-emphasis` 不会重置 {{cssxref("text-emphasis-position")}} 的值。这是因为如果文本中的强调标记的样式和颜色不同,它们的位置几乎不会变化。在极少数情况需要这样做时,可以使用 `text-emphasis-position` 属性。
+
+## 组成属性
+
+此属性是以下 CSS 属性的简写:
+
+- [`text-emphasis-color`](/zh-CN/docs/Web/CSS/text-emphasis-color)
+- [`text-emphasis-style`](/zh-CN/docs/Web/CSS/text-emphasis-style)
+
+## 语法
+
+```css
+/* 初始值 */
+text-emphasis: none; /* 没有强调标记 */
+
+/* 值 */
+text-emphasis: "x";
+text-emphasis: "点";
+text-emphasis: "\25B2";
+text-emphasis: "*" #555;
+text-emphasis: "foo"; /* 不应使用。它可能被计算或渲染为仅“f” */
+
+/* 关键字值 */
+text-emphasis: filled;
+text-emphasis: open;
+text-emphasis: filled sesame;
+text-emphasis: open sesame;
+
+/* 关键字值与色彩值结合 */
+text-emphasis: filled sesame #555;
+
+/* 全局值 */
+text-emphasis: inherit;
+text-emphasis: initial;
+text-emphasis: revert;
+text-emphasis: revert-layer;
+text-emphasis: unset;
+```
+
+### 取值
+
+- `none`
+ - : 没有强调标记。
+- `filled`
+ - : 形状填充为纯色。如果 `filled` 和 `open` 都未被设置,这是默认设置。
+- `open`
+ - : 形状为空心。
+- `dot`
+ - : 显示小圆点作为标记。填充圆点是 `'•'`(`U+2022`),空心圆点是 `'◦'`(`U+25E6`)。
+- `circle`
+ - : 显示大圆圈作为标记。填充圆圈是 `'●'`(`U+25CF`),空心圆圈是 `'○'`(`U+25CB`)。在水平书写模式下,如果没有指定其他形状,则默认为此形状。
+- `double-circle`
+ - : 显示双重圆圈作为标记。填充双重圆圈是 `'◉'`(`U+25C9`),空心双重圆圈是 `'◎'`(`U+25CE`)。
+- `triangle`
+ - : 显示三角形作为标记。填充三角形是 `'▲'`(`U+25B2`),空心三角形是 `'△'`(`U+25B3`)。
+- `sesame`
+ - : 显示芝麻点形状作为标记。填充芝麻点是 `'﹅'`(`U+FE45`),空心芝麻点是 `'﹆'`(`U+FE46`)。在垂直书写模式下,如果没有指定其他形状,则默认为此形状。
+- ``
+ - : 将指定的字符串作为标记显示。不应指定多于一个字符的 ``。用户代理(UA)可能会截断或忽略超过一个字素簇的字符串。
+- ``
+ - : 指定用作强调色的颜色。如果未定义,该值默认为 `currentcolor`。
+
+## 形式定义
+
+{{CSSInfo}}
+
+## 形式语法
+
+{{csssyntax}}
+
+## 示例
+
+### 使用强调标记和强调色的标题
+
+此示例绘制了一个标题,并使用三角形来强调每个字符。
+
+#### CSS
+
+```css
+h2 {
+ text-emphasis: triangle #d55;
+}
+```
+
+#### HTML
+
+```html
+这很重要!
+```
+
+#### 结果
+
+{{EmbedLiveSample("使用强调标记和强调色的标题", 500, 90)}}
+
+## 规范
+
+{{Specifications}}
+
+## 浏览器兼容性
+
+{{Compat}}
+
+## 参见
+
+- 全称属性 {{cssxref('text-emphasis-style')}}、{{cssxref('text-emphasis-color')}}
+- 用于定义强调标记位置的 {{cssxref('text-emphasis-position')}} 属性。
From b99eb2b3d5bfb34b6023df1f2e830dc23b8286e1 Mon Sep 17 00:00:00 2001
From: xtex
Date: Thu, 25 Jul 2024 22:34:46 +0800
Subject: [PATCH 031/185] zh-CN: update the translation of "WAI-ARIA basics"
(#22571)
---
.../learn/accessibility/wai-aria_basics/index.md | 13 ++++++++-----
1 file changed, 8 insertions(+), 5 deletions(-)
diff --git a/files/zh-cn/learn/accessibility/wai-aria_basics/index.md b/files/zh-cn/learn/accessibility/wai-aria_basics/index.md
index 3f12bacba3fe68..2262214631b9db 100644
--- a/files/zh-cn/learn/accessibility/wai-aria_basics/index.md
+++ b/files/zh-cn/learn/accessibility/wai-aria_basics/index.md
@@ -60,11 +60,14 @@ slug: Learn/Accessibility/WAI-ARIA_basics
[WAI-ARIA](https://www.w3.org/TR/wai-aria-1.1/) 是 W3C 编写的规范,定义了一组可用于其他元素的 HTML 特性,用于提供额外的语义化以及改善缺乏的无障碍。以下是规范中三个主要的特性:
-- **角色** — 这定义了元素是干什么的。许多「标志性的角色」,其实重复了 HTML5 的结构元素的语义价值。例如 `role="navigation"` ({{htmlelement("nav")}}) 或者 `role="complementary"` ({{htmlelement("aside")}}),这也有一些描述其他页面结构的(角色),例如 `role="banner"`, `role="search"`, `role="tabgroup"`, `role="tab"` 等等。我们通常能从 UI 层面找到它们。
-- **属性** — 我们能通过定义一些属性给元素,让他们具备更多的语义。例如: `aria-required="true"` 意味着元素在表单上是必填的。然而 `aria-labelledby="label"` 允许你在元素上设置一个 ID,用于[`labelledby`](/zh-CN/docs/Web/Accessibility/ARIA/ARIA_Techniques/Using_the_aria-labelledby_attribute)引用作为屏幕阅读器指定的 label 内容,多个也可以。当然,下面这个代码是不行的: `` 。举个例子:你可以用 `aria-labelledby` 指定包含在 a 标签中的 key 描述{{htmlelement("div")}} 是多个 table 表格的 label,或者将它指定为 img 标签的 alt 内容 — 而无需重复在每一个 img 里头定义。如果迷糊了,你可以在这里看到例子: [Text alternatives](/zh-CN/docs/Learn/Accessibility/HTML?document_saved=true#Text_alternatives).
-- **状态** —用于表达元素当前的条件的特殊属性,例如 `aria-disabled="true"`,屏幕阅读器就会这个表单禁止输入。状态和属性的差异之处就是:属性在应用的生命周期中不会改变,而状态可以,通常我们用编程的方法改变它,例如 Javascript。
-
-关于 WAI-ARIA 属性重要的一点是它不会对 web 页面有任何影响,除了让更多的信息从浏览器暴露给 accessibility APIs (无障碍 API),这也是屏幕阅读器这一类软件的信息源。WAI-ARIA 不会影响网页的结构,以及 DOM 等等,尽管这些属性可用于作为 css 选择器。
+- [角色](/zh-CN/docs/Web/Accessibility/ARIA/Roles)
+ - : 这定义了元素是干什么的。许多「标志性的角色」,其实重复了 HTML5 的结构元素的语义价值。例如 `role="navigation"` ({{htmlelement("nav")}}) 或者 `role="complementary"` ({{htmlelement("aside")}}),这也有一些描述其他页面结构的(角色),例如 `role="banner"`, `role="search"`, `role="tabgroup"`, `role="tab"` 等等。我们通常能从 UI 层面找到它们。
+- 属性
+ - : 定义元素的属性,使元素具备额外的含义或语义。例如,`aria-required="true"` 指定表单输入元素需要被填写才能有效,而 `aria-labelledby="label"` 允许你在元素上设置一个 ID,用于在页面中的其他地方(包括多个元素)引用其作为标签,`` 不可能做到这一点。举个例子:你可以用 `aria-labelledby` 指定在 {{htmlelement("div")}} 中包含的关键描述是多个表格单元的标签,或者将它指定为图像的替代文本——为图像替代文本指定额外信息,而无需在每一个 `alt` 属性中重复。你可以在[替代文本](/zh-CN/docs/Learn/Accessibility/HTML#替代文本)中查看示例。
+- 状态
+ - : 用于表达元素当前的条件的特殊属性,例如 `aria-disabled="true"`,屏幕阅读器就会这个表单禁止输入。状态和属性的差异之处就是:属性在应用的生命周期中不会改变,而状态可以,通常我们用编程的方法改变它,例如 JavaScript。
+
+关于 WAI-ARIA 属性重要的一点是它不会对 web 页面有任何影响,除了让更多的信息从浏览器暴露给无障碍 API,这也是屏幕阅读器这一类软件的信息源。WAI-ARIA 不会影响网页的结构,以及 DOM 等等,尽管这些属性可用于作为 css 选择器。
> **备注:** 关于 ARIA 的角色和他的用法,如需了解更多信息,尽在 WAI-ARIA 规范,查看 [角色定义](https://www.w3.org/TR/wai-aria-1.1/#role_definitions)
>
From f3dac60812e205577b9145a915658da1e08169b5 Mon Sep 17 00:00:00 2001
From: Masahiro FUJIMOTO
Date: Sat, 20 Jul 2024 22:31:50 +0900
Subject: [PATCH 032/185] =?UTF-8?q?2024/06/29=20=E6=99=82=E7=82=B9?=
=?UTF-8?q?=E3=81=AE=E8=8B=B1=E8=AA=9E=E7=89=88=E3=81=AB=E5=9F=BA=E3=81=A5?=
=?UTF-8?q?=E3=81=8D=E6=9B=B4=E6=96=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
files/ja/web/api/fetch_api/index.md | 35 +++++++----------------------
1 file changed, 8 insertions(+), 27 deletions(-)
diff --git a/files/ja/web/api/fetch_api/index.md b/files/ja/web/api/fetch_api/index.md
index 13e95b5045d2d8..cf25fa86bf99f7 100644
--- a/files/ja/web/api/fetch_api/index.md
+++ b/files/ja/web/api/fetch_api/index.md
@@ -2,22 +2,18 @@
title: フェッチ API
slug: Web/API/Fetch_API
l10n:
- sourceCommit: 1511e914c6b1ce6f88056bfefd48a6aa585cebce
+ sourceCommit: f2426e77139097d22e45eb44c6b7849d86fb6462
---
-{{DefaultAPISidebar("Fetch API")}}
+{{DefaultAPISidebar("Fetch API")}} {{AvailableInWorkers}}
-フェッチ API は(ネットワーク越しの通信を含む)リソース取得のためのインターフェイスを提供しています。 {{DOMxRef("XMLHttpRequest")}} と似たものではありますが、より強力で柔軟な操作が可能です。
+フェッチ API は(ネットワーク越しの通信を含む)リソース取得のためのインターフェイスを提供しています。これは {{DOMxRef("XMLHttpRequest")}} をより強力かつ柔軟に置き換えたものです。
-{{AvailableInWorkers}}
+## 概念と使用方法
-## 概念と利用方法
+フェッチ API は {{DOMxRef("Request")}} と {{DOMxRef("Response")}} オブジェクト(他にもネットワークリクエストに関係すること)と、CORS や HTTP の Origin ヘッダーの意味づけのような関連の概念を使用します。
-フェッチでは、 {{DOMxRef("Request")}} および {{DOMxRef("Response")}} オブジェクト(およびネットワークリクエストに関わるその他のもの)の汎用的な定義が提供されています。これにより、サービスワーカー、キャッシュ API、リクエストやレスポンスを処理または変更するその他の類似のもの、またはプログラム的にレスポンスを生成する (つまり、コンピュータプログラムまたはパーソナルプログラミング命令を使用する) 必要があるあらゆる種類の利用法など、将来的に必要とされるあらゆる場所で使用できるようになります。
-
-また CORS や HTTP の Origin ヘッダーの振る舞いといった関連した概念についても定義しています。この定義は、現行の分散している個別の定義を置き換えるものです。
-
-リソースを取得するためのリクエストは、 {{DOMxRef("fetch()")}} メソッドを呼ぶことで作成できます。このメソッドは {{DOMxRef("Window")}} や {{DOMxRef("WorkerGlobalScope")}} といったインターフェイスによって実装されています。その結果、リソース取得を必要とする様々な場面での利用が可能です。
+リクエストを行い、リソースを読み取るには、{{DOMxRef("Window.fetch", "fetch()")}} メソッドを使用します。これは {{DOMxRef("Window")}} と {{DOMxRef("WorkerGlobalScope", "Worker")}} コンテキストの両方でグローバルメソッドです。このため、リソースを取得するほとんどのコンテキストで利用できます。
`fetch()` メソッドは必須の引数を 1 つ取り、取得したいリソースのパスを指定します。これは {{JSxRef("Promise")}} を返します。これはサーバーがヘッダーで返答するとすぐに、**サーバーレスポンスが HTTP エラーステータスであったとしても**、 {{DOMxRef("Response")}} に解決します。第 2 引数は任意で、 `init` オプションオブジェクトを渡すことができます({{DOMxRef("Request")}} を参照してください)。
@@ -25,25 +21,11 @@ l10n:
{{DOMxRef("Request.Request", "Request()")}} および {{DOMxRef("Response.Response", "Response()")}} を利用することで、リクエストとレスポンスを直接作成できます。ただしこれらのオブジェクトは、{{DOMxRef("FetchEvent.respondWith()")}} のような他の API 呼び出しの結果として取得されるべきもので、直接作成しないほうが良いでしょう。
-### jQuery との違い
-
-`fetch` は主に 3 つの点で `jQuery.ajax()` と異なります。
-
-- `fetch()` から返されたプロミスは、レスポンスが HTTP `404` や `500` であっても、 **HTTP エラーステータスで拒否されません**。代わりに、正常に解決され (`ok` ステータスが `false` に設定されます)、ネットワーク障害が発生した場合、または要求の完了が妨げられた場合にのみ拒否されます。
-- `fetch()` は _credentials_ の[初期化オプション](/ja/docs/Web/API/fetch#引数)を(`include` に)設定しない限り、**オリジンをまたいだ Cookie を送信しません**。
-
- - [2018 年 4 月](https://github.com/whatwg/fetch/pull/585)、に仕様の既定の認証情報ポリシーが `'same-origin'` に変更され、古いネイティブの fetch が Firefox 61.0b13, Safari 12, Chrome 68 のバージョンのブラウザーで更新されました。
- - これらのブラウザーより古いバージョンをターゲットにしている場合は、 Cookie/ユーザーログイン状態の影響を受ける可能性のあるすべての API リクエストに `'same-origin'` を[初期化オプション](/ja/docs/Web/API/fetch#引数) に設定した認証情報を必ず含めてください。
-
-> **メモ:** フェッチ API の詳しい利用方法は [フェッチの使用](/ja/docs/Web/API/Fetch_API/Using_Fetch)を参照してください。また [フェッチの基本概念](/ja/docs/Web/API/Fetch_API/Basic_concepts)では、フェッチ API の基本概念が解説されています。
-
-### フェッチの中止
-
-未完了の `fetch()` (または `XMLHttpRequest`)の操作を中止するには、 {{DOMxRef("AbortController")}} および {{DOMxRef("AbortSignal")}} インターフェイスを使用してください。
+フェッチ API の詳しい利用方法は [フェッチの使用](/ja/docs/Web/API/Fetch_API/Using_Fetch)を参照してください。
## Fetch インターフェイス
-- {{DOMxRef("fetch()")}}
+- {{DOMxRef("Window.fetch", "fetch()")}}
- : `fetch()` メソッドはリソース取得のために使用されます。
- {{DOMxRef("Headers")}}
- : リクエストとレスポンスのヘッダーを表現しています。ヘッダー情報への問い合わせや、結果による振る舞いの選択が可能です。
@@ -67,4 +49,3 @@ l10n:
- [HTTP アクセス制御 (CORS)](/ja/docs/Web/HTTP/CORS)
- [HTTP](/ja/docs/Web/HTTP)
- [フェッチのポリフィル](https://github.com/github/fetch)
-- [フェッチの基本概念](/ja/docs/Web/API/Fetch_API/Basic_concepts)
From 1f1c41d0fdb66dc2fcd7a4c8eb7b5faa9341a0ea Mon Sep 17 00:00:00 2001
From: Masahiro FUJIMOTO
Date: Sun, 21 Jul 2024 12:35:38 +0900
Subject: [PATCH 033/185] =?UTF-8?q?2024/07/17=20=E6=99=82=E7=82=B9?=
=?UTF-8?q?=E3=81=AE=E8=8B=B1=E8=AA=9E=E7=89=88=E3=81=AB=E5=9F=BA=E3=81=A5?=
=?UTF-8?q?=E3=81=8D=E6=9B=B4=E6=96=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../ja/web/api/fetch_api/using_fetch/index.md | 743 ++++++++++--------
1 file changed, 425 insertions(+), 318 deletions(-)
diff --git a/files/ja/web/api/fetch_api/using_fetch/index.md b/files/ja/web/api/fetch_api/using_fetch/index.md
index b4cca6a909246e..8699638252c2a1 100644
--- a/files/ja/web/api/fetch_api/using_fetch/index.md
+++ b/files/ja/web/api/fetch_api/using_fetch/index.md
@@ -2,491 +2,598 @@
title: フェッチ API の使用
slug: Web/API/Fetch_API/Using_Fetch
l10n:
- sourceCommit: aae16b81e18d13dd006d418983558578563e9746
+ sourceCommit: c0e43030605b6f12bc4d550c0d5b8bf8a633eff3
---
{{DefaultAPISidebar("Fetch API")}}
-[フェッチ API](/ja/docs/Web/API/Fetch_API) は、リクエストやレスポンスといった[プロトコル](/ja/docs/Glossary/Protocol)を操作する要素にアクセスするための JavaScript インターフェイスです。グローバルの {{domxref("fetch()")}} メソッドも提供しており、簡単で論理的な方法で、非同期にネットワーク越しでリソースを取得することができます。
+[フェッチ API](/ja/docs/Web/API/Fetch_API) は、HTTP リクエストを行い、レスポンスを処理するための JavaScript インターフェイスを提供します。
-コールバックベースの API である {{domxref("XMLHttpRequest")}} とは異なり、Fetch は Promise ベースであり、[サービスワーカー](/ja/docs/Web/API/Service_Worker_API) で簡単に使用できる優れた代替手段を提供します。Fetch は、[CORS](/ja/docs/Web/HTTP/CORS) やその他の HTTP 拡張機能などの高度な HTTP 概念も統合します。
+フェッチは {{domxref("XMLHttpRequest")}} の現代の置き換えです。コールバックを使用する `XMLHttpRequest` とは異なり、フェッチはプロミスベースで、[サービスワーカー](/ja/docs/Web/API/Service_Worker_API)や[オリジン間リソース共有 (CORS)](/ja/docs/Web/HTTP/CORS) のような現代のウェブの機能と統合されています。
-基本的なフェッチリクエストは、以下のコードを見てください。
+フェッチ API では、{{domxref("Window/fetch", "fetch()")}} を呼び出してリクエストを行います。これは {{domxref("Window", "ウィンドウ", "", "nocode")}}と{{domxref("WorkerGlobalScope", "ワーカー", "", "nocode")}}の両方のコンテキストでグローバル関数として利用できます。このコンテキストには {{domxref("Request")}} オブジェクトか、フェッチする URL を格納した文字列、およびリクエストを構成するためのオプション引数を渡します。
+
+`fetch()` 関数は {{jsxref("Promise")}} を返します。このプロミスはサーバーのレスポンスを表す {{domxref("Response")}} オブジェクトで履行されます。レスポンスに対して適切なメソッドを呼び出すと、リクエストのステータスを調べたり、レスポンス本体をテキストや JSON など様々な形式で取り出すことができます。
+
+以下は `fetch()` を使用してサーバーから JSON データを取得する最小限の関数です。
```js
-async function logMovies() {
- const response = await fetch("http://example.com/movies.json");
- const movies = await response.json();
- console.log(movies);
+async function getData() {
+ const url = "https://example.org/products.json";
+ try {
+ const response = await fetch(url);
+ if (!response.ok) {
+ throw new Error(`レスポンスステータス: ${response.status}`);
+ }
+
+ const json = await response.json();
+ console.log(json);
+ } catch (error) {
+ console.error(error.message);
+ }
}
```
-これはネットワーク越しに JSON ファイルを取得してパースし、コンソールにデータを出力するスクリプトです。 `fetch()` の最も簡単な使い方は 1 つの引数 — fetch で取得したいリソースへのパス — のみをとり、 {{domxref("Response")}} オブジェクトで解決するプロミスを返します。
+URL を格納した文字列を宣言し、`fetch()` を呼び出して、余計なオプションを付けずに URL を渡します。
-{{domxref("Response")}} は、実際の JSON レスポンス本体を直接持っているのではなく、 HTTP レスポンス全体を表現するものです。 {{domxref("Response")}} オブジェクトから JSON の本体の内容を抽出するには、 {{domxref("Response.json()", "json()")}} メソッドを使用します。これはレスポンス本体のテキストを JSON として解釈した結果で解決する第 2 のプロミスを返します。
+`fetch()` 関数は何かエラーがあるとプロミスを拒否しますが、サーバーが {{httpstatus("404")}} のようなエラーステータスで応答した場合は拒否しません。したがって、レスポンスのステータスも調べて、OK でない場合はエラーを throw します。
-> **メモ:** 本体の内容が他の形式である場合に展開する同様の方法は、[本体](#本体)の節を参照してください。
+そうでない場合は、`Response` の {{domxref("Response.json()", "json()")}} メソッドを呼び出して、レスポンス本体のコンテンツを {{glossary("JSON")}} として取得し、その値の一つをログ出力します。`fetch()` 自体と同様に、 `json()` はレスポンス本体のコンテンツにアクセスする他のすべてのメソッドと同様に非同期であることに注意してください。
-フェッチリクエストは、受け取るリソースからの指示ではなく、[コンテンツセキュリティポリシー](/ja/docs/Web/HTTP/Headers/Content-Security-Policy)の `connect-src` ディレクティブによって制御されます。
+このページの残りの部分では、このプロセスのさまざまな段階を詳しく見ていきます。
-## リクエストオプションの適用
+## リクエストを行う
-`fetch()` メソッドには 2 つ目の引数を適用することができ、 `init` オブジェクトで様々な種類の設定を制御することができます。
+リクエストを行うには、 `fetch()` を呼び出して、次のものを渡します。
-すべての設定可能なオプションや詳しい説明については、 {{domxref("fetch()")}} を参照してください。
+1. フェッチするリソースの定義。これは以下のいずれかです。
+ - URL を格納した文字列。
+ - {{domxref("URL")}} のインスタンスなどのオブジェクト、すなわち URL を格納した文字列を生成する{{glossary("stringifier", "文字列化子")}}のあるもの。
+ - {{domxref("Request")}} のインスタンス。
+2. オプションとして、リクエストを構成するためのオプションを含むオブジェクト。
-```js
-// POST メソッドの実装の例
-async function postData(url = "", data = {}) {
- // 既定のオプションには * が付いています
- const response = await fetch(url, {
- method: "POST", // *GET, POST, PUT, DELETE, etc.
- mode: "cors", // no-cors, *cors, same-origin
- cache: "no-cache", // *default, no-cache, reload, force-cache, only-if-cached
- credentials: "same-origin", // include, *same-origin, omit
- headers: {
- "Content-Type": "application/json",
- // 'Content-Type': 'application/x-www-form-urlencoded',
- },
- redirect: "follow", // manual, *follow, error
- referrerPolicy: "no-referrer", // no-referrer, *no-referrer-when-downgrade, origin, origin-when-cross-origin, same-origin, strict-origin, strict-origin-when-cross-origin, unsafe-url
- body: JSON.stringify(data), // 本体のデータ型は "Content-Type" ヘッダーと一致させる必要があります
- });
- return response.json(); // JSON のレスポンスをネイティブの JavaScript オブジェクトに解釈
-}
+この節では、よく使用するオプションを見ていきます。指定されるすべてのオプションについては、[`fetch()`](/ja/docs/Web/API/Window/fetch) リファレンスページを参照してください。
+
+### メソッドの設定
-postData("https://example.com/answer", { answer: 42 }).then((data) => {
- console.log(data); // `data.json()` の呼び出しで解釈された JSON データ
+既定では、`fetch()` は {{httpmethod("GET")}} リクエストを行いますが、`method` オプションを使用すれば、別の[リクエストメソッド](/ja/docs/Web/HTTP/Methods)を使用することができます。
+
+```js
+const response = await fetch("https://example.org/post", {
+ method: "POST",
+ // ...
});
```
-なお、 `mode: "no-cors"` はリクエスト中の限られたヘッダーにしか許可されていません。
+`mode` オプションが `no-cors` に設定されている場合、 `method` は `GET`、`POST`、`HEAD` のいずれかでなければなりません。
-- `Accept`
-- `Accept-Language`
-- `Content-Language`
-- `Content-Type` のうち、値が `application/x-www-form-urlencoded`, `multipart/form-data`, `text/plain` のいずれかのもの
+### 本体の設定
-## fetch の中止
+リクエスト本体はリクエストの内容です。クライアントがサーバーに送るものです。`GET` リクエストでは本体を含めることはできませんが、{{httpmethod("POST")}} や {{httpmethod("PUT")}} リクエストのようにサーバーにコンテンツを送信するリクエストでは有益です。例えば、サーバーにファイルをアップロードしたい場合、`POST` リクエストを行い、リクエスト本体にファイルを含めることができます。
-未完了の `fetch()` 操作を中止するには、{{DOMxRef("AbortController")}} および {{DOMxRef("AbortSignal")}} インターフェイスを使用します。
+リクエスト本体を設定するには、`body` オプションとして渡します。
```js
-const controller = new AbortController();
-const signal = controller.signal;
-const url = "video.mp4";
+const response = await fetch("https://example.org/post", {
+ body: JSON.stringify({ username: "example" }),
+ // ...
+});
+```
-const downloadBtn = document.querySelector("#download");
-const abortBtn = document.querySelector("#abort");
+本体は、以下いずれかの型のインスタンスとして指定できます。
-downloadBtn.addEventListener("click", async () => {
- try {
- const response = await fetch(url, { signal });
- console.log("Download complete", response);
- } catch (error) {
- console.error(`Download error: ${error.message}`);
- }
+- 文字列
+- {{jsxref("ArrayBuffer")}}
+- {{jsxref("TypedArray")}}
+- {{jsxref("DataView")}}
+- {{domxref("Blob")}}
+- {{domxref("File")}}
+- {{domxref("URLSearchParams")}}
+- {{domxref("FormData")}}
+
+レスポンス本体と同様に、リクエスト本体はストリームであり、リクエストを作成するとストリームを読み込むので、リクエストが本体を含む場合、2 回作成することはできないことに注意してください。
+
+```js example-bad
+const request = new Request("https://example.org/post", {
+ method: "POST",
+ body: JSON.stringify({ username: "example" }),
});
-abortBtn.addEventListener("click", () => {
- controller.abort();
- console.log("Download aborted");
+const response1 = await fetch(request);
+console.log(response1.status);
+
+// 例外が発生: "Body has already been consumed."
+const response2 = await fetch(request);
+console.log(response2.status);
+```
+
+その代わりに、リクエストを送信する前に{{domxref("Request.clone()", "複製を作成する", "", "nocode")}}する必要があります。
+
+```js
+const request1 = new Request("https://example.org/post", {
+ method: "POST",
+ body: JSON.stringify({ username: "example" }),
});
+
+const request2 = request1.clone();
+
+const response1 = await fetch(request1);
+console.log(response1.status);
+
+const response2 = await fetch(request2);
+console.log(response2.status);
```
-## 資格情報つきのリクエストの送信
+詳しくは、[ロックされ妨害されたストリーム](#ロックされ妨害されたストリーム)を参照してください。
-ブラウザーに資格情報のついたリクエストを送るようにするには、同一オリジンの場合もオリジン間の呼び出しの場合も、 `credentials: 'include'` を `init` オブジェクトに追加して `fetch()` メソッドに渡してください。
+### ヘッダーの設定
+
+リクエストヘッダーは、リクエストに関する情報をサーバーに与えます。例えば {{httpheader("Content-Type")}} ヘッダーは、リクエスト本体の形式をサーバーに指示します。多くのヘッダーはブラウザーが自動的に設定し、スクリプトでは設定できません。これらは{{glossary("Forbidden header name", "禁止ヘッダー名")}}と呼ばれています。
+
+リクエストヘッダーを設定するには、`headers` オプションに割り当ててください。
+
+ここには `ヘッダー名: ヘッダー値` の形でプロパティを格納したオブジェクトリテラルを渡すことができます。
```js
-fetch("https://example.com", {
- credentials: "include",
+const response = await fetch("https://example.org/post", {
+ headers: {
+ "Content-Type": "application/json",
+ },
+ // .,.
});
```
-> **メモ:** `Access-Control-Allow-Origin` は `credentials: 'include'` を含むリクエストでは、ワイルドカードを使用することを禁止しています。このような場合、正確なオリジンを提供する必要があります。 CORS unblocker 拡張機能を使用している場合でも、リクエストは失敗します。
+あるいは、{{domxref("Headers")}} オブジェクトを構築し、{{domxref("Headers.append()")}} を使用してそのオブジェクトにヘッダーを追加し、`Headers` オブジェクトを `headers` オプションに割り当てることもできます。
-> **メモ:** この設定に関係なく、ブラウザーはプリフライトリクエストで資格情報を送信しないようにしてください。詳細については、 [CORS 資格情報を含むリクエスト](/ja/docs/Web/HTTP/CORS#資格情報を含むリクエスト)を参照してください。
+```js
+const myHeaders = new Headers();
+myHeaders.append("Content-Type", "application/json");
-リクエスト URL が呼び出しスクリプトと同一オリジンの場合だけ資格情報を送りたい場合、 `credentials: 'same-origin'` を追加します。
+const response = await fetch("https://example.org/post", {
+ headers: myHeaders,
+ // .,.
+});
+```
+
+`mode` オプションが `no-cors` に設定されている場合、{{glossary("CORS-safelisted request header", "CORS セーフリストリクエストヘッダー")}}のみを設定することができます。
+
+### POST リクエストを行う
+
+`method`、`body`、`headers` オプションを組み合わせることで、POST リクエストを作ることができます。
```js
-// オリジン 'https://example.com' で呼び出すスクリプトです。
+const myHeaders = new Headers();
+myHeaders.append("Content-Type", "application/json");
-fetch("https://example.com", {
- credentials: "same-origin",
+const response = await fetch("https://example.org/post", {
+ method: "POST",
+ body: JSON.stringify({ username: "example" }),
+ headers: myHeaders,
});
```
-ブラウザーがリクエストに資格情報を含めないことを保証するには、代わりに `credentials: 'omit'` を使用してください。
+### オリジン間リクエストを行う
+
+オリジン間のリクエストができるかどうかは `mode` オプションの値で決まります。これは `cors`、`no-cors`、`same-origin` の 3 つの値のいずれかを取ります。
+
+- 既定では `mode` は `cors` に設定され、リクエストがオリジンをまたぐものであれば、[オリジン間リソース共有 (CORS)](/ja/docs/Web/HTTP/CORS) の仕組みを使用することを意味しています。これは以下のことを意味しています。
+
+ - リクエストが[単純リクエスト](/ja/docs/Web/HTTP/CORS#simple_requests)の場合、リクエストは常に送信されますが、サーバーは正しい {{httpheader("Access-Control-Allow-Origin")}} ヘッダーで応答しなければなりません。
+ - リクエストが単純なリクエストでない場合、ブラウザーは[プリフライトリクエスト](/ja/docs/Web/HTTP/CORS#preflighted_requests)を送信して、サーバーが CORS を理解し、リクエストを許可しているか調べ、サーバーが適切な CORS ヘッダーでプリフライトリクエストに応答しない限り、実際のリクエストは送信されません。
+
+- `mode` を `same-origin` に設定すると、オリジン間のリクエストを完全に禁止します。
+
+- `mode` を `no-cors` に設定すると、リクエストは単純なリクエストでなりません。これにより、設定するヘッダーは制限され、メソッドは `GET`、`HEAD`、`POST` に制限されます。
+
+### 資格情報を含める
+
+資格情報とはクッキー、{{glossary("TLS")}} クライアント証明書、またはユーザー名とパスワードを格納した認証ヘッダーのことです。
+
+ブラウザーが資格情報を送信するかどうか、および **`Set-Cookie`** レスポンスヘッダーを尊重するかどうかを制御するには、`credentials` オプションを設定します。
+
+- `omit`: リクエストに資格情報を送信したり、レスポンスに資格情報を含めたりしません。
+- `same-origin` (既定値): 同一オリジンのリクエストに対してのみ資格情報を送信し、含めます。
+- `include`: オリジンをまたいだ場合であっても常に資格情報を含めます。
+
+クッキーの [`SameSite`](/ja/docs/Web/HTTP/Headers/Set-Cookie#samesitesamesite-value) 属性が `Strict` または `Lax` に設定されている場合、`credentials` が `include` に設定されていても、クッキーはサイトをまたいで送信されないことに注意してください。
+
+そのため、たとえ `credentials` が `include` に設定されていても、サーバーはレスポンスに {{httpheader("Access-Control-Allow-Credentials")}} ヘッダーを記載することで、資格情報を含めることに同意しなければなりません。さらに、この状況ではサーバーは {{httpheader("Access-Control-Allow-Origin")}} レスポンスヘッダーでクライアントの元のサーバーを明示的に指定しなければなりません(つまり、`*` は許可されません)。
+
+つまり、`credentials` が `include` に設定されていて、リクエストがオリジンをまたぐ場合、次のようになります。
+
+- リクエストが [単純リクエスト](/ja/docs/Web/HTTP/CORS#単純リクエスト)の場合、リクエストは資格情報と共に送信されますが、サーバーは {{httpheader("Access-Control-Allow-Credentials")}} と {{httpheader("Access-Control-Allow-Origin")}} レスポンスヘッダーを設定しなければなりません。サーバーが正しいヘッダーを設定した場合、資格情報を含むレスポンスが呼び出し元に配送されます。
+
+- リクエストが単純なリクエストでない場合、ブラウザーは資格情報なしの[プリフライトリクエスト](/ja/docs/Web/HTTP/CORS#プリフライトリクエスト)を送信し、サーバーは {{httpheader("Access-Control-Allow-Credentials")}} と {{httpheader("Access-Control-Allow-Origin")}} レスポンスヘッダーを設定しなければ、ブラウザーは呼び出し元にネットワークエラーを返します。サーバーが正しいヘッダーを設定した場合、ブラウザーは資格情報を含む本当のリクエストに続き、資格情報を含む本当のレスポンスを呼び出し元に送ります。
+
+### `Request` オブジェクトの作成
+
+{{domxref("Request.Request()", "Request()")}} コンストラクターは `fetch()` 自体と同じ引数を取ります。これは、オプションを `fetch()` に渡す代わりに、同じオプションを `Request()` コンストラクターに渡して、そのオブジェクトを `fetch()` に渡すことができるということです。
+
+例えば、次のようなコードを用いて `fetch()` にオプションを渡すことで POST リクエストを行うことができます。
```js
-fetch("https://example.com", {
- credentials: "omit",
+const myHeaders = new Headers();
+myHeaders.append("Content-Type", "application/json");
+
+const response = await fetch("https://example.org/post", {
+ method: "POST",
+ body: JSON.stringify({ username: "example" }),
+ headers: myHeaders,
});
```
-## JSON データのアップロード
-
-{{domxref("fetch()")}} を使って JSON エンコードしたデータを POST します。
+しかし、同じ引数を `Request()` コンストラクターに渡すように書き換えることもできます。
```js
-async function postJSON(data) {
- try {
- const response = await fetch("https://example.com/profile", {
- method: "POST", // or 'PUT'
- headers: {
- "Content-Type": "application/json",
- },
- body: JSON.stringify(data),
- });
+const myHeaders = new Headers();
+myHeaders.append("Content-Type", "application/json");
- const result = await response.json();
- console.log("Success:", result);
- } catch (error) {
- console.error("Error:", error);
- }
-}
+const myRequest = new Request("https://example.org/post", {
+ method: "POST",
+ body: JSON.stringify({ username: "example" }),
+ headers: myHeaders,
+});
-const data = { username: "example" };
-postJSON(data);
+const response = await fetch(myRequest);
```
-## ファイルのアップロード
-
-ファイルは HTML の ` ` input 要素と、{{domxref("FormData.FormData","FormData()")}} と {{domxref("fetch()")}} を使ってアップロードできます。
+これは、2 つ目の引数を使用してプロパティの一部を変更しながら、 別のリクエストからリクエストを作成することができるということでもあります。
```js
-async function upload(formData) {
+async function post(request) {
try {
- const response = await fetch("https://example.com/profile/avatar", {
- method: "PUT",
- body: formData,
- });
+ const response = await fetch(request);
const result = await response.json();
- console.log("Success:", result);
+ console.log("成功:", result);
} catch (error) {
- console.error("Error:", error);
+ console.error("エラー:", error);
}
}
-const formData = new FormData();
-const fileField = document.querySelector('input[type="file"]');
+const request1 = new Request("https://example.org/post", {
+ method: "POST",
+ headers: {
+ "Content-Type": "application/json",
+ },
+ body: JSON.stringify({ username: "example1" }),
+});
-formData.append("username", "abc123");
-formData.append("avatar", fileField.files[0]);
+const request2 = new Request(request1, {
+ body: JSON.stringify({ username: "example2" }),
+});
-upload(formData);
+post(request1);
+post(request2);
```
-## 複数のファイルのアップロード
+## リクエストの中止
+
+リクエストを中止できるようにするには、{{domxref("AbortController")}} を作成し、{{domxref("AbortSignal")}} をリクエストの `signal` プロパティに割り当てます。
-ファイルのアップロードは、 HTML の ` ` 入力要素と {{domxref("FormData.FormData","FormData()")}} と {{domxref("fetch()")}} を使用して行うことができます。
+リクエストを中止するには、コントローラーの {{domxref("AbortController.abort()", "abort()")}} メソッドを呼び出します。`fetch()` を呼び出すと、例外 `AbortError` が発生してプロミスが拒否されます。
```js
-async function uploadMultiple(formData) {
+const controller = new AbortController();
+
+const fetchButton = document.querySelector("#fetch");
+fetchButton.addEventListener("click", async () => {
try {
- const response = await fetch("https://example.com/posts", {
- method: "POST",
- body: formData,
+ console.log("フェッチを開始");
+ const response = await fetch("https://example.org/get", {
+ signal: controller.signal,
});
- const result = await response.json();
- console.log("Success:", result);
- } catch (error) {
- console.error("Error:", error);
+ console.log(`レスポンス: ${response.status}`);
+ } catch (e) {
+ console.error(`エラー: ${e}`);
}
-}
-
-const photos = document.querySelector('input[type="file"][multiple]');
-const formData = new FormData();
-
-formData.append("title", "My Vegas Vacation");
-
-for (const [i, photo] of Array.from(photos.files).entries()) {
- formData.append(`photos_${i}`, photo);
-}
+});
-uploadMultiple(formData);
+const cancelButton = document.querySelector("#cancel");
+cancelButton.addEventListener("click", () => {
+ controller.abort();
+ console.log("フェッチを中止");
+});
```
-### テキストファイルの 1 行ずつの処理
-
-レスポンスから読み込まれる塊は、行の境界できれいに分割されておらず、文字列ではなく Uint8Array になっています。テキストファイルを読み取って一行ずつ処理したい場合、これらの複雑な処理を行うのはあなた次第です。次の例は、行イテレーターを作成することでこれを行う方法の一つを示しています(簡単にするため、テキストは UTF-8 であると仮定しており、読み取りエラーは処理していません)。
+`fetch()` が履行された後で、レスポンス本体を読み込む前にリクエストが中止された場合、レスポンス本体を読み込もうとすると `AbortError` 例外が発生して拒否されます。
```js
-async function* makeTextFileLineIterator(fileURL) {
- const utf8Decoder = new TextDecoder("utf-8");
- const response = await fetch(fileURL);
- const reader = response.body.getReader();
- let { value: chunk, done: readerDone } = await reader.read();
- chunk = chunk ? utf8Decoder.decode(chunk) : "";
+async function get() {
+ const controller = new AbortController();
+ const request = new Request("https://example.org/get", {
+ signal: controller.signal,
+ });
- const newline = /\r?\n/gm;
- let startIndex = 0;
- let result;
+ const response = await fetch(request);
+ controller.abort();
+ // 次の行では `AbortError` が発生
+ const text = await response.text();
+ console.log(text);
+}
+```
- while (true) {
- const result = newline.exec(chunk);
- if (!result) {
- if (readerDone) break;
- const remainder = chunk.substr(startIndex);
- ({ value: chunk, done: readerDone } = await reader.read());
- chunk = remainder + (chunk ? utf8Decoder.decode(chunk) : "");
- startIndex = newline.lastIndex = 0;
- continue;
- }
- yield chunk.substring(startIndex, result.index);
- startIndex = newline.lastIndex;
- }
+## レスポンスの処理
- if (startIndex < chunk.length) {
- // Last line didn't end in a newline char
- yield chunk.substr(startIndex);
- }
-}
+ブラウザーがサーバーからレスポンスステータスとヘッダーを受け取るとすぐに(潜在的にはレスポンス本体を受け取る前に)、`fetch()` が返すプロミスは {{domxref("Response")}} オブジェクトで履行されます。
-async function run() {
- for await (const line of makeTextFileLineIterator(urlOfFile)) {
- processLine(line);
- }
-}
+### レスポンスステータスのチェック
-run();
-```
+`fetch()` が返すプロミスは、ネットワークエラーや不正なスキームなどのエラーでは拒否されます。しかし、サーバーが {{httpstatus("404")}} のようなエラーで応答した場合、 `fetch()` は `Response` で履行されるので、レスポンス本体を読み込む前にステータスを調べる必要があります。
-## フェッチが成功したかの確認
+{{domxref("Response.status")}} プロパティはステータスコードを数値で指示し、{{domxref("Response.ok")}} プロパティはステータスが [200 番台](/ja/docs/Web/HTTP/Status#成功レスポンス)の場合は `true` を返します。
-{{domxref("fetch()")}} のプロミスは、ネットワークエラーに遭遇したりサーバー側の CORS の設定(通常はアクセス権の問題など)が間違っていたりすると、 {{jsxref("TypeError")}} で拒否されます。例えば、 404 はネットワークエラーにはなりません。 `fetch()` が成功したかどうかを正確に判定するには、プロミスが解決された後で、 {{domxref("Response.ok")}} プロパティが true になっているかを確認してください。次のようなコードになるでしょう。
+よくあるパターンは、`ok` の値を調べて `false` なら例外を発生させることです。
```js
-async function fetchImage() {
+async function getData() {
+ const url = "https://example.org/products.json";
try {
- const response = await fetch("flowers.jpg");
+ const response = await fetch(url);
if (!response.ok) {
- throw new Error("Network response was not OK");
+ throw new Error(`レスポンスステータス: ${response.status}`);
}
- const myBlob = await response.blob();
- myImage.src = URL.createObjectURL(myBlob);
+ // ...
} catch (error) {
- console.error("There has been a problem with your fetch operation:", error);
+ console.error(error.message);
}
}
```
-## 独自のリクエストオブジェクトの提供
+### レスポンス型のチェック
+
+レスポンスには {{domxref("Response.type", "type")}} プロパティがあり、以下のいずれかになります。
+
+- `basic`: リクエストが同一オリジンリクエストだった。
+- `cors`: リクエストがオリジン間の CORS リクエストだった。
+- `opaque`: リクエストは `no-cors` モードで行われた単純なオリジン間リクエストだった。
+- `opaqueredirect`: リクエストで `redirect` オプションが `manual` に設定されており、サーバーが[リダイレクトステータス](/ja/docs/Web/HTTP/Status#リダイレクトメッセージ)を返した。
+
+型はレスポンスに入りうる内容を、以下のように決定します。
+
+- 基本レスポンスは{{glossary("Forbidden response header name", "禁止レスポンスヘッダー名")}}リストにあるレスポンスヘッダーを除外します。
+
+- CORS レスポンスは {{glossary("CORS-safelisted response header", "CORS セーフリストレスポンスヘッダー")}}リストのレスポンスヘッダーのみを含みます。
-`fetch()` の呼び出しに、リクエストしたいリソースへのパスを渡す代わりに、{{domxref("Request.Request","Request()")}} コンストラクターを使用して Request オブジェクトを作成し、 `fetch()` メソッドの引数として渡すこともできます。
+- 不透明なレスポンスと不透明なリダイレクトレスポンスは `status` が `0`、ヘッダーリストが空、そして本体が `null` になります。
+
+### ヘッダーのチェック
+
+リクエストと同じように、レスポンスにも {{domxref("Response.headers", "headers")}} オブジェクトである {{domxref("Headers")}} プロパティがあり、 レスポンス型に基づく除外に従って、スクリプトに公開されるレスポンスヘッダーが格納されます。
+
+この一般的な用途は、本体を読もうとする前にコンテンツ型を調べることです。
```js
-async function fetchImage(request) {
+async function fetchJSON(request) {
try {
const response = await fetch(request);
- if (!response.ok) {
- throw new Error("Network response was not OK");
+ const contentType = response.headers.get("content-type");
+ if (!contentType || !contentType.includes("application/json")) {
+ throw new TypeError("残念、受信したのは JSON ではなかった!");
}
- const myBlob = await response.blob();
- myImage.src = URL.createObjectURL(myBlob);
+ // それ以外の場合、本体を JSON として読み取れる
} catch (error) {
- console.error("Error:", error);
+ console.error("エラー:", error);
}
}
-
-const myHeaders = new Headers();
-
-const myRequest = new Request("flowers.jpg", {
- method: "GET",
- headers: myHeaders,
- mode: "cors",
- cache: "default",
-});
-
-fetchImage(myRequest);
```
-`Request()` は、 `fetch()` メソッドとまったく同じ引数を受け入れます。既存のリクエストオブジェクトを渡して、コピーを作成することもできます。
-
-```js
-const anotherRequest = new Request(myRequest, myInit);
-```
+### レスポンス本体の読み取り
-リクエストとレスポンスの本体は一度しか使用できないので、これはかなり有益なことです。
-このようにコピーを作成することで、リクエストやレスポンスを効果的に使用することができ、使用した場合には `init` オプションを変更することができます。
-コピーは本体が読み込まれる前に作成されなければなりません。
+`Response` インターフェイスには、本体のコンテンツ全体を様々な形式で取得するためのメソッドがあります。
-> **メモ:** {{domxref("Request.clone","clone()")}} メソッドを利用してコピーを生成することもできます。コピーを作成するどちらの方法でも、元のリクエストまたはレスポンスの 本体がすでに読まれている場合は失敗しますが、複製されたレスポンスまたは リクエストの本体を読んでも、元で読み取り済みとマークされることはありません。
+- {{domxref("Response.arrayBuffer()")}}
+- {{domxref("Response.blob()")}}
+- {{domxref("Response.formData()")}}
+- {{domxref("Response.json()")}}
+- {{domxref("Response.text()")}}
-## Headers
+これらはすべて非同期メソッドで、本体のコンテンツで履行される {{jsxref("Promise")}} を返します。
-{{domxref("Headers")}} インターフェイスでは、 {{domxref("Headers.Headers","Headers()")}} コンストラクターを使用して、ヘッダーオブジェクトを作成することができます。ヘッダーオブジェクトは、シンプルな複数の名前と値のマップです。
+この例では、画像を読み取って {{domxref("Blob")}} として読み込み、それを使用してオブジェクト URL を作成することができます。
```js
-const content = "Hello World";
-const myHeaders = new Headers();
-myHeaders.append("Content-Type", "text/plain");
-myHeaders.append("Content-Length", content.length.toString());
-myHeaders.append("X-Custom-Header", "ProcessThisImmediately");
-```
+const image = document.querySelector("img");
-コンストラクターに配列の配列またはオブジェクトリテラルを渡すことで、同じことが実現できます。
+const url = "flowers.jpg";
-```js
-const myHeaders = new Headers({
- "Content-Type": "text/plain",
- "Content-Length": content.length.toString(),
- "X-Custom-Header": "ProcessThisImmediately",
-});
+async function setImage() {
+ try {
+ const response = await fetch(url);
+ if (!response.ok) {
+ throw new Error(`レスポンスステータス: ${response.status}`);
+ }
+ const blob = await response.blob();
+ const objectURL = URL.createObjectURL(blob);
+ image.src = objectURL;
+ } catch (e) {
+ console.error(e);
+ }
+}
```
-ヘッダーの中身を見たり、検索することができます。
-
-```js
-console.log(myHeaders.has("Content-Type")); // true
-console.log(myHeaders.has("Set-Cookie")); // false
-myHeaders.set("Content-Type", "text/html");
-myHeaders.append("X-Custom-Header", "AnotherValue");
+このメソッドでは、レスポンス本体が適切な形式でない場合に例外が発生します。例えば、JSONとして解釈できないレスポンスに対して `json()` を呼び出した場合などです。
-console.log(myHeaders.get("Content-Length")); // 11
-console.log(myHeaders.get("X-Custom-Header")); // ['ProcessThisImmediately', 'AnotherValue']
+### レスポンス本体のストリーミング
-myHeaders.delete("X-Custom-Header");
-console.log(myHeaders.get("X-Custom-Header")); // null
-```
+リクエスト本体とレスポンス本体は、実際には {{domxref("ReadableStream")}} オブジェクトであり、それらを読むときは常にコンテンツをストリーミングしています。これはメモリー効率が良くなります。呼び出し側が `json()` のようなメソッドを使用してレスポンスを取得する前に、 ブラウザーがレスポンス全体をメモリーにバッファリングする必要がないからです。
-いくつかの操作は{{domxref("Service_Worker_API","サービスワーカー", "", 1)}}でしか役立ちませんが、ヘッダーを操作するためのより良い API を提供しています。
+また、これは呼び出し側がコンテンツを受信したときに増加しながら処理できることを意味しています。
-Headers のメソッドはすべて、有効な HTTP ヘッダーではない名前が渡されたときは `TypeError` が発生します。 immutable ガード([下記参照](#ガード))がかかっている場合に変更操作を行った場合も `TypeError` が発生します。それ以外の場合は、暗黙に失敗します。例を示します。
+例えば、大きなテキストファイルを読み取って、それを何か方法で処理したり、ユーザーに表示したりする `GET` リクエストを考えてみましょう。
```js
-const myResponse = Response.error();
-try {
- myResponse.headers.set("Origin", "http://mybank.com");
-} catch (e) {
- console.log("銀行のふりをしないで下さい!");
+const url = "https://www.example.org/a-large-file.txt";
+
+async function fetchText(url) {
+ try {
+ const response = await fetch(url);
+ if (!response.ok) {
+ throw new Error(`レスポンスステータス: ${response.status}`);
+ }
+
+ const text = await response.text();
+ console.log(text);
+ } catch (e) {
+ console.error(e);
+ }
}
```
-ヘッダーの良い使用方法としては、以下のように、処理を行う前に、コンテンツタイプが正しいかどうか判定する等の使い方があります。
+上記のように {{domxref("Response.text()")}} を使用することができますが、ファイル全体を受信するまで待たなければなりません。
+
+代わりにレスポンスをストリーミングすると、本体をネットワークから受信した塊のままで処理することができます。
```js
-async function fetchJSON(request) {
+const url = "https://www.example.org/a-large-file.txt";
+
+async function fetchTextAsStream(url) {
try {
- const response = await fetch(request);
- const contentType = response.headers.get("content-type");
- if (!contentType || !contentType.includes("application/json")) {
- throw new TypeError("Oops, we haven't got JSON!");
+ const response = await fetch(url);
+ if (!response.ok) {
+ throw new Error(`レスポンスステータス: ${response.status}`);
}
- const jsonData = await response.json();
- // process your data further
- } catch (error) {
- console.error("Error:", error);
+
+ const stream = response.body.pipeThrough(new TextDecoderStream());
+ for await (const value of stream) {
+ console.log(value);
+ }
+ } catch (e) {
+ console.error(e);
}
}
```
-### ガード
-
-ヘッダーは、リクエストで送信でき、レスポンスで受信できます。また、どの情報が変更できる(または、すべき)かといったさまざまな制限があります。そのため、ヘッダーには _guard_ プロパティがあります。これはリクエストやレスポンスに含まれませんが、ヘッダーオブジェクトでできる変更操作に影響を与えます。
-
-設定できるガード値には以下のものがあります。
-
-- `none`: 既定値です。
-- `request`: リクエストから得たヘッダーオブジェクト ({{domxref("Request.headers")}}) を保護します。
-- `request-no-cors`: {{domxref("Request.mode")}} が `no-cors` で生成されたリクエストから得たヘッダーオブジェクトを保護します。
-- `response`: レスポンスから得たヘッダーオブジェクト ({{domxref("Response.headers")}}) を保護します。
-- `immutable`: ヘッダーを読み取り専用にします。主にサービスワーカーで使用されます。
+この例では、{{jsxref("Statements/for-await...of", "iterate asynchronously", "", "nocode")}} ストリームを処理し、到着したそれぞれの塊を処理しています。
-> **メモ:** `response` のガードされたヘッダーオブジェクトに `Content-Length` ヘッダーを追加したり設定したりすることはできません。同様に、レスポンスヘッダーに `Set-Cookie` を挿入することもできません。サービスワーカーは合成されたレスポンスでクッキーを設定することはできません。
+このように本体に直接アクセスすると、レスポンスの生のバイト列を取得し、それを自分で変換しなければならないことに注意しましょう。この場合、{{domxref("ReadableStream.pipeThrough()")}} を呼び出して {{domxref("TextDecoderStream")}} にレスポンスを通し、UTF-8 エンコードされた本体データをテキストとしてデコードします。
-## Response オブジェクト
+### テキストファイルを 1 行ずつ処理する
-すでに見てきたように、 {{domxref("Response")}} インスタンスは、 `fetch()` プロミスが解決 (resolve) されたときに返値として渡されます。
+下記の例では、テキストリソースを取得し、それを行ごとに処理し、正規表現を使って行末を探しています。分かりやすいように、テキストは UTF-8 を想定し、読み取りエラーは処理しません。
-使用できる主なレスポンスプロパティには、以下のものがあります。
+```js
+async function* makeTextFileLineIterator(fileURL) {
+ const response = await fetch(fileURL);
+ const reader = response.body.pipeThrough(new TextDecoderStream()).getReader();
-- {{domxref("Response.status")}} — 整数値 (既定値は 200) で、 HTTP ステータスコードが入ります。
-- {{domxref("Response.statusText")}} — HTTP ステータスコードに対応するメッセージの文字列 (既定値は "")。なお、 HTTP/2 ではステータスメッセージに[対応していません](https://fetch.spec.whatwg.org/#concept-response-status-message)。
-- {{domxref("Response.ok")}} — 上述の例で使用したように、これは HTTP ステータスコードが 200-299 の範囲にあるかどうかをチェックする略記法です。これは論理値を返します。
+ let { value: chunk, done: readerDone } = await reader.read();
+ chunk = chunk || "";
-Response オブジェクトは JavaScript で動的に作ることもできます。これは{{domxref("Service_Worker_API", "サービスワーカー", "", 1)}}で非常に役立ちます。例えばリクエストを受け取ったときに {{domxref("FetchEvent.respondWith","respondWith()")}} メソッドによってカスタマイズされたレスポンスを返すようなときに役立ちます。
+ const newline = /\r?\n/gm;
+ let startIndex = 0;
+ let result;
-```js
-const myBody = new Blob();
-
-addEventListener("fetch", (event) => {
- // ServiceWorker intercepting a fetch
- event.respondWith(
- new Response(myBody, {
- headers: { "Content-Type": "text/plain" },
- }),
- );
-});
-```
+ while (true) {
+ const result = newline.exec(chunk);
+ if (!result) {
+ if (readerDone) break;
+ const remainder = chunk.substr(startIndex);
+ ({ value: chunk, done: readerDone } = await reader.read());
+ chunk = remainder + (chunk || "");
+ startIndex = newline.lastIndex = 0;
+ continue;
+ }
+ yield chunk.substring(startIndex, result.index);
+ startIndex = newline.lastIndex;
+ }
-{{domxref("Response.Response","Response()")}} コンストラクターは、オプションとして 2 つの引数をとることができます。レスポンス本体と初期化オブジェクトです。 ({{domxref("Request.Request","Request()")}} が受け取れるものと似ています。)
+ if (startIndex < chunk.length) {
+ // Last line didn't end in a newline char
+ yield chunk.substring(startIndex);
+ }
+}
-> **メモ:** 静的メソッド {{domxref("Response/error_static","error()")}} は単純にエラーレスポンスを返します。同様に {{domxref("Response/redirect_static","redirect()")}} メソッドも 指定した URL にリダイレクトするレスポンスを返します。これらはサービスワーカーにのみ関連しています。
+async function run(urlOfFile) {
+ for await (const line of makeTextFileLineIterator(urlOfFile)) {
+ processLine(line);
+ }
+}
-## 本体
+function processLine(line) {
+ console.log(line);
+}
-リクエストにもレスポンスにも本体データが含まれています。本体は以下のタイプのいずれかのインスタンスです。
+run("https://www.example.org/a-large-file.txt");
+```
-- {{jsxref("ArrayBuffer")}}
-- {{jsxref("TypedArray")}} (Uint8Array など)
-- {{jsxref("DataView")}}
-- {{domxref("Blob")}}
-- {{domxref("File")}}
-- {{jsxref("String")}}、または文字列リテラル
-- {{domxref("URLSearchParams")}}
-- {{domxref("FormData")}}
+### ロックされ妨害されたストリーム
-{{domxref("Request")}} および {{domxref("Response")}} インターフェイスは本体を展開するために以下のメソッドを持っています。これらはすべて最終的に実際の内容で解決されるプロミスを返します。
+リクエスト本体とレスポンス本体がストリームであることの結果は以下のとおりです:
-- {{domxref("Request.arrayBuffer()")}} / {{domxref("Response.arrayBuffer()")}}
-- {{domxref("Request.blob()")}} / {{domxref("Response.blob()")}}
-- {{domxref("Request.formData()")}} / {{domxref("Response.formData()")}}
-- {{domxref("Request.json()")}} / {{domxref("Response.json()")}}
-- {{domxref("Request.text()")}} / {{domxref("Response.text()")}}
+- `ReadableStream.getReader()` を使用してストリームにリーダーが接続されている場合、そのストリームはロックされ、他の誰もストリームを読むことができません。
+- もしストリームから何らかのコンテンツが読み取られた場合、ストリームは妨害され、ストリームから読み取ることはできません。
-これらはテキストでないデータを XHR よりはるかに楽に扱うことができます。
+これは、同じレスポンス(またはリクエスト)本体を複数回読み取ることは不可能であるということです。
-リクエスト本体は、 body 引数を渡すことによって設定することができます。
+```js example-bad
+async function getData() {
+ const url = "https://example.org/products.json";
+ try {
+ const response = await fetch(url);
+ if (!response.ok) {
+ throw new Error(`レスポンスステータス: ${response.status}`);
+ }
-```js
-const form = new FormData(document.getElementById("login-form"));
-fetch("/login", {
- method: "POST",
- body: form,
-});
+ const json1 = await response.json();
+ const json2 = await response.json(); // 例外が発生
+ } catch (error) {
+ console.error(error.message);
+ }
+}
```
-リクエストとレスポンス(および `fetch()` 関数の拡張)は、自動的にコンテンツ種別を決定しようとします。リクエストもまた、指定されていなければ自動で `Content-Type` ヘッダーを設定しようとします。
+本体を複数回読み込む必要がある場合は、本体を読み込む前に {{domxref("Response.clone()")}} を呼び出す必要があります。
-## 使用可能かどうかの判別
+```js
+async function getData() {
+ const url = "https://example.org/products.json";
+ try {
+ const response1 = await fetch(url);
+ if (!response1.ok) {
+ throw new Error(`レスポンスステータス: ${response1.status}`);
+ }
-Fetch API が利用できるかどうかは、{{domxref("Headers")}}、{{domxref("Request")}}、{{domxref("Response")}}、{{domxref("fetch()")}} のいずれかが {{domxref("Window")}} もしくは {{domxref("Worker")}} のスコープで参照できるかどうかによって判断できます。例を挙げます。
+ const response2 = response1.clone();
-```js
-if (window.fetch) {
- // ここで fetch リクエストを実行
-} else {
- // XMLHttpRequest で何か実行する?
+ const json1 = await response1.json();
+ const json2 = await response2.json();
+ } catch (error) {
+ console.error(error.message);
+ }
}
```
-## `jQuery.ajax()` との差異
+これは[サービスワーカーのオフラインキャッシュ実装](/ja/docs/Web/Progressive_web_apps/Guides/Caching)でよくあるパターンです。サービスワーカーはアプリにレスポンスを返しますが、同時にレスポンスをキャッシュすることも望んでいます。そのため、レスポンスを複製して元を返し、複製をキャッシュします。
-`fetch` の仕様は、 `jQuery.ajax()` とは特に以下の点で異なっています。
+```js
+async function cacheFirst(request) {
+ const cachedResponse = await caches.match(request);
+ if (cachedResponse) {
+ return cachedResponse;
+ }
+ try {
+ const networkResponse = await fetch(request);
+ if (networkResponse.ok) {
+ const cache = await caches.open("MyCache_1");
+ cache.put(request, networkResponse.clone());
+ }
+ return networkResponse;
+ } catch (error) {
+ return Response.error();
+ }
+}
-- `fetch()` から返されるプロミスは、レスポンスが HTTP 404 や 500 を返す HTTP エラーステータスの場合でも拒否されません。サーバーがヘッダーで応答すると、プロミスは直ちに正常に解決します(レスポンスが 200-299 の範囲にない場合は、レスポンスの {{domxref("Response/ok", "ok")}} プロパティが `false` に設定されます)。拒否されるのは、ネットワーク障害があった場合や、何かがリクエストの完了を妨げた場合のみです。
-- [`credentials`](/ja/docs/Web/API/fetch#credentials) オプションを `include` に設定しない限り、`fetch()` は次のように動作します。
- - オリジン間リクエストではクッキーを送信しません。
- - オリジン間のレスポンスでは、送り返されたクッキーを設定しません。
- - 2018 年 8 月現在、既定の資格情報ポリシーは same-origin に変更されています。
+self.addEventListener("fetch", (event) => {
+ if (precachedResources.includes(url.pathname)) {
+ event.respondWith(cacheFirst(event.request));
+ }
+});
+```
## 関連情報
- [サービスワーカー API](/ja/docs/Web/API/Service_Worker_API)
-- [HTTP アクセス制御 (CORS)](/ja/docs/Web/HTTP/CORS)
+- [ストリーム API](/ja/docs/Web/API/Streams_API)
+- [CORS](/ja/docs/Web/HTTP/CORS)
- [HTTP](/ja/docs/Web/HTTP)
-- [フェッチのポリフィル](https://github.com/github/fetch)
- [Fetch の例 (GitHub)](https://github.com/mdn/dom-examples/tree/main/fetch)
From 1156a9efaf5ec790c12a631702181b44dd0ce25b Mon Sep 17 00:00:00 2001
From: Masahiro FUJIMOTO
Date: Sun, 21 Jul 2024 13:14:56 +0900
Subject: [PATCH 034/185] =?UTF-8?q?2024/07/17=20=E6=99=82=E7=82=B9?=
=?UTF-8?q?=E3=81=AE=E8=8B=B1=E8=AA=9E=E7=89=88=E3=81=AB=E5=9F=BA=E3=81=A5?=
=?UTF-8?q?=E3=81=8D=E6=9B=B4=E6=96=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../ja/web/api/abortcontroller/abort/index.md | 10 ++--
.../abortcontroller/abortcontroller/index.md | 6 +--
files/ja/web/api/abortcontroller/index.md | 54 ++++++++++++-------
.../web/api/abortcontroller/signal/index.md | 8 +--
4 files changed, 48 insertions(+), 30 deletions(-)
diff --git a/files/ja/web/api/abortcontroller/abort/index.md b/files/ja/web/api/abortcontroller/abort/index.md
index 55e5e2b0e0a186..30b50b6ade5109 100644
--- a/files/ja/web/api/abortcontroller/abort/index.md
+++ b/files/ja/web/api/abortcontroller/abort/index.md
@@ -3,13 +3,13 @@ title: "AbortController: abort() メソッド"
short-title: abort()
slug: Web/API/AbortController/abort
l10n:
- sourceCommit: 135b8311a5e3d12789e8421845be3ce026ef72b8
+ sourceCommit: c0e43030605b6f12bc4d550c0d5b8bf8a633eff3
---
-{{APIRef("DOM")}}
+{{APIRef("DOM")}}{{AvailableInWorkers}}
-**`abort()`** は {{domxref("AbortController")}} インターフェイスのメソッドで、 DOM リクエストを完了前に中止します。
-これは[フェッチリクエスト](/ja/docs/Web/API/fetch)、あらゆるレスポンス本体の消費、ストリームを中止することができます。
+**`abort()`** は {{domxref("AbortController")}} インターフェイスのメソッドで、非同期操作を完了前に中止します。
+これは[フェッチリクエスト](/ja/docs/Web/API/Window/fetch)、あらゆるレスポンス本体の消費、ストリームを中止することができます。
## 構文
@@ -34,7 +34,7 @@ abort(reason)
最初に {{domxref("AbortController.AbortController","AbortController()")}} コンストラクターを使用してコントローラーを作成し、関連する {{domxref("AbortSignal")}} オブジェクトへの参照を {{domxref("AbortController.signal")}} プロパティを使用して取り込みます。
-[フェッチリクエスト](/ja/docs/Web/API/fetch)が開始されると、 `AbortSignal` をリクエストのオプションオブジェクト(下記の `{signal}`)にオプションとして渡します。これにより、シグナルとコントローラーをそのフェッチリクエストと関連付け、 2 つ目のイベントリスナーで下記のように {{domxref("AbortController.abort()")}} を呼び出すことでフェッチを中断できるようになります。
+[フェッチリクエスト](/ja/docs/Web/API/Window/fetch)が開始されると、 `AbortSignal` をリクエストのオプションオブジェクト(下記の `{signal}`)にオプションとして渡します。これにより、シグナルとコントローラーをそのフェッチリクエストと関連付け、 2 つ目のイベントリスナーで下記のように {{domxref("AbortController.abort()")}} を呼び出すことでフェッチを中断できるようになります。
```js
const controller = new AbortController();
diff --git a/files/ja/web/api/abortcontroller/abortcontroller/index.md b/files/ja/web/api/abortcontroller/abortcontroller/index.md
index 91b115980d88b9..c5efb513d061b8 100644
--- a/files/ja/web/api/abortcontroller/abortcontroller/index.md
+++ b/files/ja/web/api/abortcontroller/abortcontroller/index.md
@@ -3,10 +3,10 @@ title: "AbortController: AbortController() コンストラクター"
short-title: AbortController()
slug: Web/API/AbortController/AbortController
l10n:
- sourceCommit: 135b8311a5e3d12789e8421845be3ce026ef72b8
+ sourceCommit: c0e43030605b6f12bc4d550c0d5b8bf8a633eff3
---
-{{APIRef("DOM")}}
+{{APIRef("DOM")}}{{AvailableInWorkers}}
**`AbortController()`** は、新しい {{domxref("AbortController")}} オブジェクトインスタンスを生成します。
@@ -26,7 +26,7 @@ new AbortController()
最初に {{domxref("AbortController.AbortController","AbortController()")}} コンストラクターを使用してコントローラーを作成し、関連する {{domxref("AbortSignal")}} オブジェクトへの参照を {{domxref("AbortController.signal")}} プロパティを使用して取り込みます。
-[フェッチリクエスト](/ja/docs/Web/API/fetch)が開始されると、 `AbortSignal` をリクエストのオプションオブジェクト(下記の `{ signal }`)にオプションとして渡します。これにより、シグナルとコントローラーをそのフェッチリクエストと関連付け、 2 つ目のイベントリスナーで下記のように {{domxref("AbortController.abort()")}} を呼び出すことでフェッチを中断できるようになります。
+[フェッチリクエスト](/ja/docs/Web/API/Window/fetch)が開始されると、 `AbortSignal` をリクエストのオプションオブジェクト(下記の `{ signal }`)にオプションとして渡します。これにより、シグナルとコントローラーをそのフェッチリクエストと関連付け、 2 つ目のイベントリスナーで下記のように {{domxref("AbortController.abort()")}} を呼び出すことでフェッチを中断できるようになります。
```js
const controller = new AbortController();
diff --git a/files/ja/web/api/abortcontroller/index.md b/files/ja/web/api/abortcontroller/index.md
index 96e1f5d984b554..6064b77d78fe6f 100644
--- a/files/ja/web/api/abortcontroller/index.md
+++ b/files/ja/web/api/abortcontroller/index.md
@@ -2,29 +2,29 @@
title: AbortController
slug: Web/API/AbortController
l10n:
- sourceCommit: bca8d1ab2bc4f5a1ef6b39c454b0229539178e98
+ sourceCommit: c0e43030605b6f12bc4d550c0d5b8bf8a633eff3
---
-{{APIRef("DOM")}}
+{{APIRef("DOM")}}{{AvailableInWorkers}}
**`AbortController`** インターフェイスは 1 つ以上のウェブリクエストをいつでも中断することを可能にするコントローラーオブジェクトを表します。
-新しい `AbortController` オブジェクトを新しく生成するには、 {{domxref("AbortController.AbortController()", "AbortController()")}} コンストラクターを使うことができます。 DOM リクエストとの送信は、 {{domxref("AbortSignal")}} オブジェクトを使って行われます。
+新しい `AbortController` オブジェクトは、 {{domxref("AbortController.AbortController()", "AbortController()")}} コンストラクターを使って新しく生成することができます。非同期操作の通信は、{{domxref("AbortSignal")}} オブジェクトを使って行われます。
## コンストラクター
-- {{domxref("AbortController()")}}
+- {{domxref("AbortController.AbortController()", "AbortController()")}}
- : 新しい `AbortController` オブジェクトインスタンスを生成します。
-## プロパティ
+## インスタンスプロパティ
- {{domxref("AbortController.signal")}} {{ReadOnlyInline}}
- - : {{domxref("AbortSignal")}} オブジェクトのインスタンスを返します。 このオブジェクトは、 DOM リクエストの送信や中断に使用します。
+ - : {{domxref("AbortSignal")}} オブジェクトのインスタンスを返します。 このオブジェクトは、非同期操作の通信や中断に使用します。
-## メソッド
+## インスタンスメソッド
- {{domxref("AbortController.abort()")}}
- - : DOM リクエストが完了する前に中断します。これは、[フェッチリクエスト](/ja/docs/Web/API/fetch)、あらゆるレスポンス本体やストリームを中断することができます。
+ - : 非同期操作が完了する前に中断します。これは、[フェッチリクエスト](/ja/docs/Web/API/Window/fetch)や、あらゆるレスポンス本体やストリームを中断することができます。
## 例
@@ -34,7 +34,9 @@ l10n:
まず {{domxref("AbortController.AbortController","AbortController()")}} コンストラクターを使ってコントローラーを生成し、 {{domxref("AbortController.signal")}} プロパティを使用して関連する {{domxref("AbortSignal")}} オブジェクトへの参照を取得します。
-[フェッチリクエスト](/ja/docs/Web/API/fetch)が行われると、リクエストのオプションオブジェクト(下記 `{signal}` を参照)の内部のオプションとして `AbortSignal` を渡します。これによりシグナルと読み込みリクエストのコントローラーは関連付き、 {{domxref("AbortController.abort()")}} を呼び出すことで下記の 2 つ目のイベントリスナーに見られるように中断が許可されます。
+[フェッチリクエスト](/ja/docs/Web/API/Window/fetch)が行われると、リクエストのオプションオブジェクト(下記 `{signal}` を参照)の内部のオプションとして `AbortSignal` を渡します。これによりシグナルと読み込みリクエストのコントローラーは関連付き、 {{domxref("AbortController.abort()")}} を呼び出すことで下記の 2 つ目のイベントリスナーに見られるように中断が許可されます。
+
+`abort()` が呼び出されると、`fetch()` のプロミスは `AbortError` という名前の `DOMException` で拒否されます。
```js
let controller;
@@ -52,20 +54,36 @@ abortBtn.addEventListener("click", () => {
}
});
-function fetchVideo() {
+async function fetchVideo() {
controller = new AbortController();
const signal = controller.signal;
- fetch(url, { signal })
- .then((response) => {
- console.log("Download complete", response);
- })
- .catch((err) => {
- console.error(`Download error: ${err.message}`);
- });
+
+ try {
+ const response = await fetch(url, { signal });
+ console.log("Download complete", response);
+ // process response further
+ } catch (err) {
+ console.error(`Download error: ${err.message}`);
+ }
}
```
-> **メモ:** `abort()` が呼ばれると、`fetch()` のプロミスは `AbortError` と呼ばれる `DOMException` で失敗します。
+`fetch()` が履行された後で、レスポンス本体を読み込む前にリクエストが中止された場合、レスポンス本体を読み込もうとすると `AbortError` 例外が発生して拒否されます。
+
+```js
+async function get() {
+ const controller = new AbortController();
+ const request = new Request("https://example.org/get", {
+ signal: controller.signal,
+ });
+
+ const response = await fetch(request);
+ controller.abort();
+ // 次の行で `AbortError` が発生する
+ const text = await response.text();
+ console.log(text);
+}
+```
[GitHub に完全に動作する例](https://github.com/mdn/dom-examples/tree/main/abort-api)があります。また、[ライブでの実行](https://mdn.github.io/dom-examples/abort-api/)も確認してください。
diff --git a/files/ja/web/api/abortcontroller/signal/index.md b/files/ja/web/api/abortcontroller/signal/index.md
index 140a7ac9e7e640..2db5f05ece74d2 100644
--- a/files/ja/web/api/abortcontroller/signal/index.md
+++ b/files/ja/web/api/abortcontroller/signal/index.md
@@ -3,12 +3,12 @@ title: "AbortController: signal プロパティ"
short-title: signal
slug: Web/API/AbortController/signal
l10n:
- sourceCommit: 135b8311a5e3d12789e8421845be3ce026ef72b8
+ sourceCommit: c0e43030605b6f12bc4d550c0d5b8bf8a633eff3
---
-{{APIRef("DOM")}}
+{{APIRef("DOM")}}{{AvailableInWorkers}}
-**`signal`** は {{domxref("AbortController")}} インターフェイスの読み取り専用プロパティで、求めに応じて DOM リクエストと連携したり中止したりするために使用される {{domxref("AbortSignal")}} オブジェクトインスタンスを返します。
+**`signal`** は {{domxref("AbortController")}} インターフェイスの読み取り専用プロパティで、求めに応じて非同期操作とやりとりしたり中止したりするために使用される {{domxref("AbortSignal")}} オブジェクトインスタンスを返します。
## 値
@@ -20,7 +20,7 @@ l10n:
最初に {{domxref("AbortController.AbortController", "AbortController()")}} コンストラクターを使用してコントローラーを作成し、関連する {{domxref("AbortSignal")}} オブジェクトへの参照を {{domxref("AbortController.signal")}} プロパティを使用して取り込みます。
-[フェッチリクエスト](/ja/docs/Web/API/fetch)が開始されると、 `AbortSignal` をリクエストのオプションオブジェクト(下記の `{signal}`)にオプションとして渡します。これにより、シグナルとコントローラーをそのフェッチリクエストと関連付け、 2 つ目のイベントリスナーで下記のように {{domxref("AbortController.abort()")}} を呼び出すことでフェッチを中断できるようになります。
+[フェッチリクエスト](/ja/docs/Web/API/Window/fetch)が開始されると、 `AbortSignal` をリクエストのオプションオブジェクト(下記の `{signal}`)にオプションとして渡します。これにより、シグナルとコントローラーをそのフェッチリクエストと関連付け、 2 つ目のイベントリスナーで下記のように {{domxref("AbortController.abort()")}} を呼び出すことでフェッチを中断できるようになります。
```js
const controller = new AbortController();
From 720c17cfbff6650ad374c0c2de6fffbe6643b8f7 Mon Sep 17 00:00:00 2001
From: Masahiro FUJIMOTO
Date: Sun, 21 Jul 2024 14:09:02 +0900
Subject: [PATCH 035/185] =?UTF-8?q?2024/07/17=20=E6=99=82=E7=82=B9?=
=?UTF-8?q?=E3=81=AE=E8=8B=B1=E8=AA=9E=E7=89=88=E3=81=AB=E5=9F=BA=E3=81=A5?=
=?UTF-8?q?=E3=81=8D=E6=9B=B4=E6=96=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
files/ja/web/api/abortsignal/index.md | 165 +++++++++++++++++++-------
1 file changed, 121 insertions(+), 44 deletions(-)
diff --git a/files/ja/web/api/abortsignal/index.md b/files/ja/web/api/abortsignal/index.md
index 49286970da9ec0..a0b55d7e056f36 100644
--- a/files/ja/web/api/abortsignal/index.md
+++ b/files/ja/web/api/abortsignal/index.md
@@ -2,45 +2,49 @@
title: AbortSignal
slug: Web/API/AbortSignal
l10n:
- sourceCommit: a662e542a529a0f8c86b60d85abe0035093c86d1
+ sourceCommit: c0e43030605b6f12bc4d550c0d5b8bf8a633eff3
---
-{{APIRef("DOM")}}
+{{APIRef("DOM")}}{{AvailableInWorkers}}
-**`AbortSignal`** インターフェイスは DOM リクエスト(フェッチなど)と通信し、必要に応じて {{domxref("AbortController")}} オブジェクトを介して中止することを可能にするシグナルオブジェクトを表します。
+**`AbortSignal`** インターフェイスは非同期操作(フェッチリクエストなど)とやりとりし、必要に応じて {{domxref("AbortController")}} オブジェクトを介して中止することを可能にするシグナルオブジェクトを表します。
{{InheritanceDiagram}}
## インスタンスプロパティ
-_AbortSignal インターフェイスには、親インターフェイスである {{domxref("EventTarget")}} から継承しているプロパティもあります。_
+_親インターフェイスである {{domxref("EventTarget")}} から継承しているプロパティもあります。_
- {{domxref("AbortSignal.aborted")}} {{ReadOnlyInline}}
- - : 論理値で、シグナルが通信しているリクエスト(または複数のリクエスト)が中止されているか (`true`)、中止されていないか (`false`) を表します。
+ - : 論理値で、このシグナルが通信しているリクエスト(または複数のリクエスト)が中止されているか (`true`)、中止されていないか (`false`) を表します。
- {{domxref("AbortSignal.reason")}} {{ReadOnlyInline}}
- - : シグナルが中止されると、中止の理由を提供する JavaScript の値です。
+ - : シグナルが中止されたとき、中止の理由を提供する JavaScript の値です。
## 静的メソッド
-- {{domxref("AbortSignal.abort()")}}
- - : 既に中止と設定された **`AbortSignal`** を返します。
-- {{domxref("AbortSignal.any()")}}
- - : 指定された中止シグナルのいずれかが中止された時中止となる **`AbortSignal`** を返します。
-- {{domxref("AbortSignal.timeout()")}}
- - : 指定された時間の後で自動的に中止となる **`AbortSignal`** インターフェイスを返します。
+_親インターフェイスである {{domxref("EventTarget")}} から継承しているメソッドもあります。_
+
+- {{domxref("AbortSignal/abort_static", "AbortSignal.abort()")}}
+ - : 既に中止と設定された `AbortSignal` を返します。
+- {{domxref("AbortSignal/any_static", "AbortSignal.any()")}}
+ - : 指定された中止シグナルのいずれかが中止された時中止となる `AbortSignal` を返します。
+- {{domxref("AbortSignal/timeout_static", "AbortSignal.timeout()")}}
+ - : 指定された時間の後で自動的に中止となる `AbortSignal` インターフェイスを返します。
## インスタンスメソッド
-_**`AbortSignal`** インターフェイスには、親インターフェイスである {{domxref("EventTarget")}} から継承しているメソッドもあります。_
+_親インターフェイスである {{domxref("EventTarget")}} から継承しているメソッドもあります。_
- {{domxref("AbortSignal.throwIfAborted()")}}
- : シグナルが中止された場合、シグナルの中止理由 ({{domxref("AbortSignal.reason", "reason")}}) で例外を発生させ、それ以外の場合は何もしません。
## イベント
-[`addEventListener()`](/ja/docs/Web/API/EventTarget/addEventListener) を使うか、このインターフェイスの `onイベント名` プロパティにイベントリスナーを割り当てるかして、このイベントを待ち受けしてください。
+_親インターフェイスである {{DOMxRef("EventTarget")}} から継承しているイベントもあります。_
+
+{{domxref("EventTarget.addEventListener", "addEventListener()")}} を使うか、このインターフェイスの `onイベント名` プロパティにイベントリスナーを割り当てるかして、このイベントを待ち受けしてください。
-- [`abort`](/ja/docs/Web/API/AbortSignal/abort_event)
+- {{domxref("AbortSignal/abort_event", "abort")}}
- : このシグナルが通信している DOM リクエストが中断されたとき、呼び出されます。
`onabort` プロパティを介しても利用可能です。
@@ -52,42 +56,63 @@ _**`AbortSignal`** インターフェイスには、親インターフェイス
まず {{domxref("AbortController.AbortController","AbortController()")}} コンストラクターを使ってコントローラーを生成し、{{domxref("AbortController.signal")}} プロパティを使用して関連する {{domxref("AbortSignal")}} オブジェクトへの参照を取得します。
-[読み込みリクエスト](/ja/docs/Web/API/fetch) が初期化すると、 `AbortSignal` をリクエストのオプションオブジェクト(下記 `{signal}` を参照)の内部のオプションとして渡します。これによりシグナルと読み込みリクエストのコントローラーが関連付き、{{domxref("AbortController.abort()")}} を呼び出すことで下記の 2 つ目のイベントリスナーに見られるように中断が許可されます。
+[フェッチリクエスト](/ja/docs/Web/API/Window/fetch) が初期化すると、 `AbortSignal` をリクエストのオプションオブジェクト(下記 `{signal}` を参照)の内部のオプションとして渡します。これによりシグナルと読み込みリクエストのコントローラーが関連付き、{{domxref("AbortController.abort()")}} を呼び出すことで下記の 2 つ目のイベントリスナーに見られるように中断が許可されます。
下記では、フェッチ処理が 2 つ目のイベントリスナーで中止されていることがわかります。このイベントリスナーは、中止ボタン (`abortBtn`) がクリックされたときに起動します。
-```js
-const controller = new AbortController();
-const signal = controller.signal;
+`abort()` が呼び出されると、`fetch()` のプロミスは `AbortError` という名前の `DOMException` で拒否されます。
+```js
+let controller;
const url = "video.mp4";
+
const downloadBtn = document.querySelector(".download");
const abortBtn = document.querySelector(".abort");
downloadBtn.addEventListener("click", fetchVideo);
abortBtn.addEventListener("click", () => {
- controller.abort();
- console.log("Download aborted");
+ if (controller) {
+ controller.abort();
+ console.log("ダウンロードを中止しました");
+ }
});
-function fetchVideo() {
- fetch(url, { signal })
- .then((response) => {
- console.log("Download complete", response);
- })
- .catch((err) => {
- console.error(`Download error: ${err.message}`);
- });
+async function fetchVideo() {
+ controller = new AbortController();
+ const signal = controller.signal;
+
+ try {
+ const response = await fetch(url, { signal });
+ console.log("ダウンロードが完了しました", response);
+ // さらにレスポンスを処理
+ } catch (err) {
+ console.error(`ダウンロードエラー: ${err.message}`);
+ }
}
```
-> **メモ:** `abort()` が呼び出されると、`fetch()` のプロミスは `AbortError` で失敗します。
+`fetch()` が履行された後で、レスポンス本体を読み込む前にリクエストが中止された場合、レスポンス本体を読み込もうとすると `AbortError` 例外が発生して拒否されます。
+
+```js
+async function get() {
+ const controller = new AbortController();
+ const request = new Request("https://example.org/get", {
+ signal: controller.signal,
+ });
+
+ const response = await fetch(request);
+ controller.abort();
+ // 次の行で `AbortError` が発生する
+ const text = await response.text();
+ console.log(text);
+}
+```
-You can find a [full working example on GitHub](https://github.com/mdn/dom-examples/tree/main/abort-api); you can also see it [running live](https://mdn.github.io/dom-examples/abort-api/).
+[GitHub に完全に動作する例](https://github.com/mdn/dom-examples/tree/main/abort-api)があります。[実行可能な例](https://mdn.github.io/dom-examples/abort-api/)を見ることもできます。
### タイムアウトによるフェッチ操作の中止
-もしタイムアウトで処理を中断する必要がある場合は、静的な {{domxref("AbortSignal.timeout()") }} メソッドを使用することができます。
+もしタイムアウトで処理を中断する必要がある場合は、静的な {{domxref("AbortSignal/timeout_static", "AbortSignal.timeout()")}} メソッドを使用することができます。
これは、指定のミリ秒後に自動的にタイムアウトする `AbortSignal` を返すものです。
下記のコードでは、ファイルのダウンロードに成功するか、 5 秒後にタイムアウトエラーが発生した場合にどのように処理するかを示しています。
@@ -119,31 +144,83 @@ try {
### タイムアウトまたは明示的な中止を伴うフェッチの中止
-`fetch()` は複数のシグナルを組み合わせられるようには設計されていないので、 {{domxref("AbortController.abort()")}} の呼び出しまたは `AbortSignal` のタイムアウトのどちらかでダウンロードを中止することは「直接」はできません(ただし、前の例のように、停止ボタンなどのブラウザー内蔵の仕組みからタイムアウトシグナルを中止することができます)。
-
-複数のシグナルに対してトリガーを発生させるには、デイジーチェーン接続する必要があります。
-次のコードは、別個のタイマーのハンドラーで {{domxref("AbortController.abort()")}} を呼び出す方法を示しています。
+複数のシグナルから中止したい場合は、{{domxref("AbortSignal/any_static", "AbortSignal.any()")}}を使用して単一のシグナルに結合することができます。次の例では、 {{domxref("Window/fetch", "fetch")}} を使用してこの例を示しています。
```js
try {
const controller = new AbortController();
- const timeoutId = setTimeout(() => controller.abort(), 5000);
- const res = await fetch(url, { signal: controller.signal });
+ const timeoutSignal = AbortSignal.timeout(5000);
+ const res = await fetch(url, {
+ // どちらかのシグナルが中止されると、フェッチは中止される
+ signal: AbortSignal.any([controller.signal, timeoutSignal]),
+ });
const body = await res.json();
} catch (e) {
if (e.name === "AbortError") {
- // Notify the user of abort.
- // Note this will never be a timeout error!
+ // ユーザーに中止を通知
+ } else if (e.name === "TimeoutError") {
+ // ユーザーにタイムアウトを通知
} else {
- // A network error, or some other problem.
+ // ネットワークエラー、またはその他の問題
console.log(`Type: ${e.name}, Message: ${e.message}`);
}
-} finally {
- clearTimeout(timeoutId);
}
```
-> **メモ:** {{domxref("AbortSignal.timeout()")}} を使用したときとは異なり、最終的な中止がタイムアウトによって発生したのかどうかを判断する方法はありません。
+> **メモ:** {{domxref("AbortSignal/timeout_static", "AbortSignal.timeout()")}} を使用したときとは異なり、最終的な中止がタイムアウトによって発生したのかどうかを判断する方法はありません。
+
+### 中止可能な API の実装
+
+中止対応を必要とする API は `AbortSignal` オブジェクトを受け入れることができ、必要なときに中止シグナル処理を発生させるためにその状態を使用することができます。
+
+{{jsxref("Promise")}} ベースの API は、`AbortSignal` の中止 {{domxref("AbortSignal.reason", "reason")}} で未確定のプロミスを拒否することで、中止シグナルに応答する必要があります。
+例えば、次の `myCoolPromiseAPI` はシグナルを受け取ってプロミスを返します。
+シグナルが既に中止されている場合、または中止イベントが検出された場合、プロミスは直ちに拒否されます。
+そうでない場合は完全に完了し、プロミスを解決します。
+
+```js
+function myCoolPromiseAPI(/* …, */ { signal }) {
+ return new Promise((resolve, reject) => {
+ // シグナルがすでに中止されている場合は、プロミスを拒否するために直ちに例外を発生
+ if (signal.aborted) {
+ reject(signal.reason);
+ }
+
+ // API の主目的を実行
+ // 終了したら resolve(result) を呼び出す。
+
+ // 'abort' シグナルを監視
+ signal.addEventListener("abort", () => {
+ // 主な処理を停止
+ // 中止される理由でプロミスを拒否する
+ reject(signal.reason);
+ });
+ });
+}
+```
+
+このAPIは、次のように使用します。
+処理を中止するために {{domxref("AbortController.abort()")}} が呼び出されていることに注意しましょう。
+
+```js
+const controller = new AbortController();
+const signal = controller.signal;
+
+startSpinner();
+
+myCoolPromiseAPI({ /* …, */ signal })
+ .then((result) => {})
+ .catch((err) => {
+ if (err.name === "AbortError") return;
+ showUserErrorMessage();
+ })
+ .then(() => stopSpinner());
+
+controller.abort();
+```
+
+プロミスを返さない API も同じような反応をするかもしれません。
+場合によっては、そのシグナルを吸収する意味があるかもしれません。
## 仕様書
From 14bc7419dd92f4fb3d900eb313ec3d9d5233285d Mon Sep 17 00:00:00 2001
From: Masahiro FUJIMOTO
Date: Sun, 21 Jul 2024 14:11:13 +0900
Subject: [PATCH 036/185] =?UTF-8?q?2024/05/07=20=E6=99=82=E7=82=B9?=
=?UTF-8?q?=E3=81=AE=E8=8B=B1=E8=AA=9E=E7=89=88=E3=81=AB=E5=9F=BA=E3=81=A5?=
=?UTF-8?q?=E3=81=8D=E6=9B=B4=E6=96=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../web/api/abortsignal/abort_event/index.md | 5 +-
.../web/api/abortsignal/abort_static/index.md | 13 ++--
files/ja/web/api/abortsignal/aborted/index.md | 9 +--
.../web/api/abortsignal/any_static/index.md | 7 +-
.../api/abortsignal/throwifaborted/index.md | 64 ++-----------------
.../api/abortsignal/timeout_static/index.md | 18 +++---
6 files changed, 36 insertions(+), 80 deletions(-)
diff --git a/files/ja/web/api/abortsignal/abort_event/index.md b/files/ja/web/api/abortsignal/abort_event/index.md
index 7ec8d3e856de07..9aefd30a0b28e4 100644
--- a/files/ja/web/api/abortsignal/abort_event/index.md
+++ b/files/ja/web/api/abortsignal/abort_event/index.md
@@ -1,11 +1,12 @@
---
title: "AbortSignal: abort イベント"
+short-title: abort
slug: Web/API/AbortSignal/abort_event
l10n:
- sourceCommit: 02e1bfcad5fd0de845fb033d331c3c027afa2d6e
+ sourceCommit: 15f0b5552bc9c2ea1f32b0cd5ee840a7d43c887e
---
-{{APIRef("DOM")}}
+{{APIRef("DOM")}}{{AvailableInWorkers}}
**`abort`** は {{domxref("AbortSignal")}} のイベントで、関連するリクエストが中止されたとき、つまり {{domxref("AbortController.abort()")}} を使用して中止されたときに発行されます。
diff --git a/files/ja/web/api/abortsignal/abort_static/index.md b/files/ja/web/api/abortsignal/abort_static/index.md
index 8300cc0a31687b..0ac1e42a130b0b 100644
--- a/files/ja/web/api/abortsignal/abort_static/index.md
+++ b/files/ja/web/api/abortsignal/abort_static/index.md
@@ -1,11 +1,14 @@
---
-title: AbortSignal.abort()
+title: "AbortSignal: abort() 静的メソッド"
+short-title: abort()
slug: Web/API/AbortSignal/abort_static
+l10n:
+ sourceCommit: 15f0b5552bc9c2ea1f32b0cd5ee840a7d43c887e
---
-{{APIRef("DOM")}}
+{{APIRef("DOM")}}{{AvailableInWorkers}}
-静的な **`AbortSignal.abort()`** メソッドは、既に中止と設定されている(かつ {{domxref("AbortSignal/abort_event", "abort")}} イベントが発生していない) {{domxref("AbortSignal") }} を返します。
+**`AbortSignal.abort()`** は静的メソッドで、既に中止と設定されている(かつ {{domxref("AbortSignal/abort_event", "abort")}} イベントが発生していない) {{domxref("AbortSignal")}} を返します。
これは、以下のコードの一連で行うものです。
@@ -22,8 +25,8 @@ return controller.signal;
## 構文
```js-nolint
-abort()
-abort(reason)
+AbortSignal.abort()
+AbortSignal.abort(reason)
```
### 引数
diff --git a/files/ja/web/api/abortsignal/aborted/index.md b/files/ja/web/api/abortsignal/aborted/index.md
index 2542c175cc7396..6efddea518c5ee 100644
--- a/files/ja/web/api/abortsignal/aborted/index.md
+++ b/files/ja/web/api/abortsignal/aborted/index.md
@@ -1,13 +1,14 @@
---
-title: AbortSignal.aborted
+title: "AbortSignal: aborted プロパティ"
+short-title: aborted
slug: Web/API/AbortSignal/aborted
l10n:
- sourceCommit: 02e1bfcad5fd0de845fb033d331c3c027afa2d6e
+ sourceCommit: 15f0b5552bc9c2ea1f32b0cd5ee840a7d43c887e
---
-{{APIRef("DOM")}}
+{{APIRef("DOM")}}{{AvailableInWorkers}}
-**`aborted`** は読み取り専用プロパティで、そのシグナルが通信している DOM リクエストが中止されているか (`true`)、されていないか (`false`) を示す値を返します。
+**`aborted`** は読み取り専用プロパティで、そのシグナルがやりとりしている非同期操作が中止されているか (`true`)、されていないか (`false`) を示す値を返します。
## 値
diff --git a/files/ja/web/api/abortsignal/any_static/index.md b/files/ja/web/api/abortsignal/any_static/index.md
index 8916b8a8f4fed5..ee28ccbbf71755 100644
--- a/files/ja/web/api/abortsignal/any_static/index.md
+++ b/files/ja/web/api/abortsignal/any_static/index.md
@@ -1,13 +1,14 @@
---
title: "AbortSignal: any() 静的メソッド"
+short-title: any()
slug: Web/API/AbortSignal/any_static
l10n:
- sourceCommit: 32f666e453bdb8c93d305075453b6e304cae94de
+ sourceCommit: 15f0b5552bc9c2ea1f32b0cd5ee840a7d43c887e
---
-{{APIRef("DOM")}}
+{{APIRef("DOM")}}{{AvailableInWorkers}}
-静的メソッド **`AbortSignal.any()`** は、中止シグナルが入った反復可能オブジェクトを受け取り、{{domxref("AbortSignal")}} を返します。返される中止シグナルは、渡された反復可能オブジェクト内の中止シグナルのいずれかが中止された時中止されます。{{domxref("AbortSignal.reason", "中止の理由","","true")}}は、中止された最初のシグナルの理由に設定されます。渡された中止シグナルのいずれかが既に中止されている場合は、既に中止と設定されている {{domxref("AbortSignal")}} を返します。
+**`AbortSignal.any()`** は静的メソッドで、中止シグナルが入った反復可能オブジェクトを受け取り、{{domxref("AbortSignal")}} を返します。返される中止シグナルは、渡された反復可能オブジェクト内の中止シグナルのいずれかが中止された時中止されます。{{domxref("AbortSignal.reason", "中止の理由","","true")}}は、中止された最初のシグナルの理由に設定されます。渡された中止シグナルのいずれかが既に中止されている場合は、既に中止と設定されている {{domxref("AbortSignal")}} を返します。
## 構文
diff --git a/files/ja/web/api/abortsignal/throwifaborted/index.md b/files/ja/web/api/abortsignal/throwifaborted/index.md
index 11befad05d33e2..6756e60dabd0e6 100644
--- a/files/ja/web/api/abortsignal/throwifaborted/index.md
+++ b/files/ja/web/api/abortsignal/throwifaborted/index.md
@@ -1,17 +1,18 @@
---
-title: AbortSignal.throwIfAborted()
+title: "AbortSignal: throwIfAborted() メソッド"
+short-title: throwIfAborted()
slug: Web/API/AbortSignal/throwIfAborted
l10n:
- sourceCommit: 8d27f508bd2c6270918fb3b047d73b57e8b949d3
+ sourceCommit: 15f0b5552bc9c2ea1f32b0cd5ee840a7d43c887e
---
-{{APIRef("DOM")}}
+{{APIRef("DOM")}}{{AvailableInWorkers}}
-**`throwIfAborted()`**メソッドは、シグナルが中止された場合、シグナルの中止理由 ({{domxref("AbortSignal.reason", "reason")}}) の例外を発生させ、それ以外の場合は何もしません。
+**`throwIfAborted()`** メソッドは、シグナルが中止された場合、シグナルの中止理由 ({{domxref("AbortSignal.reason", "reason")}}) の例外を発生させ、それ以外の場合は何もしません。
中止に対応させる必要がある API は、{{domxref("AbortSignal")}} オブジェクトを受け入れ、 `throwIfAborted()` を使用して [`abort`](/ja/docs/Web/API/AbortSignal/abort_event) イベントが発生するとテストして例外を発生するようにすることができます。
-このメソッドは、シグナルを受け取る関数に渡すのではなく、コード内の特定の点で処理を中止するために使用することもできます。
+このメソッドは、シグナルを受け取る関数に渡すのではなく、コード内の特定の時点で処理を中止するために使用することもできます。
## 構文
@@ -54,59 +55,6 @@ async function waitForCondition(func, targetValue, { signal } = {}) {
ループを反復処理するたびに、 `throwIfAborted()` を使用して、もし処理が中止された場合にはシグナルの `reason` を例外として投げます(それ以外の場合は何もしません)。
シグナルが中止された場合、 `waitForCondition()` のプロミスが拒否されます。
-### 中止可能な API の実装
-
-中止することを対応する必要がある API は `AbortSignal` オブジェクトを受け入れ、必要なときにその状態を使用して中止シグナル処理を開始させることができます。
-
-{{jsxref("Promise")}} ベースの API は、`AbortSignal` の中止理由 ({{domxref("AbortSignal.reason", "reason")}}) で未確定のプロミスを拒否して、中止シグナルに応答する必要があります。
-例えば、シグナルを受け取ってプロミスを返す以下の `myCoolPromiseAPI` を考えてみましょう。
-シグナルが既に中止されている場合、あるいは中止イベントが検出された場合、プロミスは直ちに拒否されます。
-そうでなければ、プロミスは完全に終了し、プロミスを解決します。
-
-```js
-function myCoolPromiseAPI(/* … ,*/ { signal }) {
- return new Promise((resolve, reject) => {
- // If the signal is already aborted, immediately throw in order to reject the promise.
- if (signal.aborted) {
- reject(signal.reason);
- }
-
- // Perform the main purpose of the API
- // Call resolve(result) when done.
-
- // Watch for 'abort' signals
- signal.addEventListener("abort", () => {
- // Stop the main operation
- // Reject the promise with the abort reason.
- reject(signal.reason);
- });
- });
-}
-```
-
-そして、 API は次のように使用されるかもしれません。
-処理を中止するために {{domxref("AbortController.abort()")}} が呼び出されることに注意してください。
-
-```js
-const controller = new AbortController();
-const signal = controller.signal;
-
-startSpinner();
-
-myCoolPromiseAPI({ /* … ,*/ signal })
- .then((result) => {})
- .catch((err) => {
- if (err.name === "AbortError") return;
- showUserErrorMessage();
- })
- .then(() => stopSpinner());
-
-controller.abort();
-```
-
-プロミスを返さない API も同じように反応するかもしれません。
-場合によっては、そのシグナルを吸収することが意味を持つかもしれません。
-
## 仕様書
{{Specifications}}
diff --git a/files/ja/web/api/abortsignal/timeout_static/index.md b/files/ja/web/api/abortsignal/timeout_static/index.md
index 6488ee30755e54..007ebf59bc3bcf 100644
--- a/files/ja/web/api/abortsignal/timeout_static/index.md
+++ b/files/ja/web/api/abortsignal/timeout_static/index.md
@@ -1,24 +1,26 @@
---
-title: AbortSignal.timeout()
+title: "AbortSignal: timeout() 静的メソッド"
+short-title: timeout()
slug: Web/API/AbortSignal/timeout_static
+l10n:
+ sourceCommit: 15f0b5552bc9c2ea1f32b0cd5ee840a7d43c887e
---
-{{APIRef("DOM")}}
+{{APIRef("DOM")}}{{AvailableInWorkers}}
-静的な **`AbortSignal.timeout()`** メソッドは、指定した時間が経過すると自動的に中止する {{domxref("AbortSignal")}} を返すものです。
+**`AbortSignal.timeout()`** は静的メソッドで、指定した時間が経過すると自動的に中止する {{domxref("AbortSignal")}} を返すものです。
-このシグナルは、タイムアウト時には `TimeoutError` {{domxref("DOMException")}} で、ブラウザーの停止ボタン(または他にも組み込まれた「停止」処理)を押した場合には `AbortError` {{domxref("DOMException")}} で中止されます。
+このシグナルは、タイムアウト時には `TimeoutError` {{domxref("DOMException")}} で、ブラウザーの停止ボタン(または他の組み込まれた「停止」処理)を押した場合には `AbortError` {{domxref("DOMException")}} で中止されます。
これにより、通常ユーザーへの通知が必要なタイムアウトエラーと、そうでないユーザーによる中止の発生を UI で区別できます。
-タイムアウトは経過時間ではなく活動時間に基づきます。コードが実行されているワーカーがサスペンドされている場合や、文書がバックフォワードキャッシュ ("[bfcache](https://web.dev/bfcache/)") にある場合は、事実上一時停止されます。
+タイムアウトは経過時間ではなく活動時間に基づきます。コードが実行されているワーカーがサスペンドされている場合や、文書がバックフォワードキャッシュ ("[bfcache](https://web.dev/articles/bfcache)") にある場合は、事実上一時停止されます。
-> **メモ:** 執筆時点では、複数のシグナルを組み合わせる方法はありません。
-> つまり、タイムアウトシグナルを使用するか、{{domxref("AbortController.abort()")}}を呼び出してダウンロードを直接中止することはできません。
+複数のシグナルを組み合わせるには、{{domxref("AbortSignal/any_static", "AbortSignal.any()")}} を使用することができます。例えば、タイムアウトシグナルまたは {{domxref("AbortController.abort()")}} を呼び出してダウンロードを直接中止させることができます。
## 構文
```js-nolint
-timeout(time)
+AbortSignal.timeout(time)
```
### 引数
From 61486a25b27b0ec6b755db8bbc024d919b29a806 Mon Sep 17 00:00:00 2001
From: Masahiro FUJIMOTO
Date: Sun, 21 Jul 2024 22:01:45 +0900
Subject: [PATCH 037/185] =?UTF-8?q?2024/07/05=20=E6=99=82=E7=82=B9?=
=?UTF-8?q?=E3=81=AE=E8=8B=B1=E8=AA=9E=E7=89=88=E3=81=AB=E5=9F=BA=E3=81=A5?=
=?UTF-8?q?=E3=81=8D=E6=9B=B4=E6=96=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
files/ja/web/api/document/requeststorageaccessfor/index.md | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/files/ja/web/api/document/requeststorageaccessfor/index.md b/files/ja/web/api/document/requeststorageaccessfor/index.md
index 72465ea2bc091a..7c7a9bd9a8cfe8 100644
--- a/files/ja/web/api/document/requeststorageaccessfor/index.md
+++ b/files/ja/web/api/document/requeststorageaccessfor/index.md
@@ -3,7 +3,7 @@ title: "Document: requestStorageAccessFor() メソッド"
short-title: requestStorageAccessFor()
slug: Web/API/Document/requestStorageAccessFor
l10n:
- sourceCommit: b97c61b40d8b71532d54fe5af1eab4ca014605ec
+ sourceCommit: 0ebc78fd61acddbe9505330f006b706ac786456d
---
{{APIRef("Storage Access API")}}{{SeeCompatTable}}
@@ -84,7 +84,7 @@ function rSAFor() {
}
```
-`requestStorageAccessFor()` の呼び出しが成功した後、[CORS](/ja/docs/Web/HTTP/CORS) / [`crossorigin`](/ja/docs/Web/HTML/Attributes/crossorigin) を含む場合、クロスサイトリクエストはクッキーを入れることができます。このようなリクエストは [`credentials: "include"`](/ja/docs/Web/API/fetch#credentials) オプションを用い、リソースは `crossorigin="use-credentials"` 属性を記載しなければなりません。
+`requestStorageAccessFor()` の呼び出しが成功した後、[CORS](/ja/docs/Web/HTTP/CORS) / [`crossorigin`](/ja/docs/Web/HTML/Attributes/crossorigin) を含む場合、クロスサイトリクエストはクッキーを入れることができます。このようなリクエストは [`credentials: "include"`](/ja/docs/Web/API/RequestInit#credentials) オプションを用い、リソースは `crossorigin="use-credentials"` 属性を記載しなければなりません。
例えば、次のようにします。
From 4d69dea0a279b9cabcbb5e5676eb4c76fa5b4345 Mon Sep 17 00:00:00 2001
From: Masahiro FUJIMOTO
Date: Sun, 21 Jul 2024 22:17:49 +0900
Subject: [PATCH 038/185] =?UTF-8?q?2024/07/05=20=E6=99=82=E7=82=B9?=
=?UTF-8?q?=E3=81=AE=E8=8B=B1=E8=AA=9E=E7=89=88=E3=81=AB=E5=9F=BA=E3=81=A5?=
=?UTF-8?q?=E3=81=8D=E6=9B=B4=E6=96=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
files/ja/web/api/file/index.md | 36 +++++++++++-----------------------
1 file changed, 11 insertions(+), 25 deletions(-)
diff --git a/files/ja/web/api/file/index.md b/files/ja/web/api/file/index.md
index fb09cd0a48ec84..225efedded66b9 100644
--- a/files/ja/web/api/file/index.md
+++ b/files/ja/web/api/file/index.md
@@ -2,16 +2,16 @@
title: File
slug: Web/API/File
l10n:
- sourceCommit: 2a09bee9b36fd9a53c1bce641297021bfe274a33
+ sourceCommit: 0ebc78fd61acddbe9505330f006b706ac786456d
---
-{{APIRef("File API")}}
+{{APIRef("File API")}}{{AvailableInWorkers}}
**`File`** インターフェイスは、ファイルについての情報を提供したり、ウェブページ内の JavaScript からその内容にアクセスできるようにしたりします。
`File` オブジェクトは通常、{{HTMLElement("input")}} 要素を使用してファイルを選択した結果として返される {{DOMxRef("FileList")}} オブジェクト、またはドラッグ&ドロップ操作の {{DOMxRef("DataTransfer")}} オブジェクトから取得します。
-`File` オブジェクトは特別な種類の {{DOMxRef("Blob")}} オブジェクトであり、 Blob が利用できる場面ではどこでも利用できます。特に、{{DOMxRef("FileReader")}}、{{DOMxRef("URL.createObjectURL_static")}}、{{DOMxRef("createImageBitmap()")}}、{{DOMxRef("XMLHttpRequest", "", "send()")}} は、`Blob` と `File` の両方を受け付けます。
+`File` オブジェクトは特別な種類の {{DOMxRef("Blob")}} オブジェクトであり、 Blob が利用できる場面ではどこでも利用できます。特に、{{DOMxRef("FileReader")}}、{{DOMxRef("URL.createObjectURL_static", "URL.createObjectURL()")}}、{{DOMxRef("createImageBitmap()")}}、{{domxref("Window.fetch", "fetch()")}} の [`body`](/ja/docs/Web/API/RequestInit#body) オプション、{{DOMxRef("XMLHttpRequest.send()")}} は、`Blob` と `File` の両方を受け付けます。
詳しい情報や例は、[ウェブアプリケーションからのファイルの使用](/ja/docs/Web/API/File_API/Using_files_from_web_applications) を参照してください。
@@ -24,34 +24,20 @@ l10n:
## インスタンスプロパティ
-- {{DOMxRef("File.prototype.lastModified")}} {{ReadOnlyInline}}
+_`File` インターフェイスには {{DOMxRef("Blob")}} インターフェイスから継承したプロパティもあります。_
+
+- {{DOMxRef("File.lastModified")}} {{ReadOnlyInline}}
- : ファイルの最終更新時刻を、 UNIX 元期 (1970 年 1 月 1 日深夜) からの経過ミリ秒数で返します。
-- {{DOMxRef("File.prototype.lastModifiedDate")}} {{Deprecated_Inline}} {{ReadOnlyInline}} {{Non-standard_Inline}}
+- {{DOMxRef("File.lastModifiedDate")}} {{Deprecated_Inline}} {{ReadOnlyInline}} {{Non-standard_Inline}}
- : `File` オブジェクトが参照しているファイルの最終更新時刻の {{JSxRef("Date")}} を返します。
-- {{DOMxRef("File.prototype.name")}} {{ReadOnlyInline}}
+- {{DOMxRef("File.name")}} {{ReadOnlyInline}}
- : `File` オブジェクトが参照しているファイルの名前を返します。
-- {{DOMxRef("File.prototype.webkitRelativePath")}} {{ReadOnlyInline}}
- - : {{DOMxRef("File")}} の URL の相対パスを返します。
-
-`File` は {{DOMxRef("Blob")}} を実装しているので、以下のようなプロパティも利用できます。
-
-- {{DOMxRef("Blob.size")}} {{ReadOnlyInline}}
- - : ファイルのサイズをバイト単位で返します。
-- {{DOMxRef("File.prototype.type")}} {{ReadOnlyInline}}
- - : ファイルの [MIME](/ja/docs/Web/HTTP/Basics_of_HTTP/MIME_types) タイプを返します。
+- {{DOMxRef("File.webkitRelativePath")}} {{ReadOnlyInline}}
+ - : `File` の URL の相対パスを返します。
## インスタンスメソッド
-_`File` インターフェイスはメソッドを定義せず、{{DOMxRef("Blob")}} インターフェイスからメソッドを継承しています。_
-
-- {{DOMxRef("Blob.prototype.slice()", "Blob.prototype.slice([start[, end[, contentType]]])")}}
- - : ソース `Blob` の指定したバイト数の範囲のデータを含む新しい `Blob` オブジェクトを返します。
-- {{DOMxRef("Blob.prototype.stream()")}}
- - : `File` を {{DOMxRef("ReadableStream")}} に変換し、`File` の内容を読み込めるようにします。
-- {{DOMxRef("Blob.prototype.text()")}}
- - : `File` をストリームに変換し、最後まで読み込みます。これは、文字列(テキスト)で解決するプロミスを返します。
-- {{DOMxRef("Blob.prototype.arrayBuffer()")}}
- - : `File` をストリームに変換し、最後まで読み込みます。 {{jsxref("ArrayBuffer")}} で解決するプロミスを返します。
+_`File` インターフェイスには {{DOMxRef("Blob")}} インターフェイスから継承したメソッドもあります。_
## 仕様書
From a321f51937c285478e4a546b76738b3193972d24 Mon Sep 17 00:00:00 2001
From: Masahiro FUJIMOTO
Date: Sun, 21 Jul 2024 22:25:39 +0900
Subject: [PATCH 039/185] =?UTF-8?q?2023/12/02=20=E6=99=82=E7=82=B9?=
=?UTF-8?q?=E3=81=AE=E8=8B=B1=E8=AA=9E=E7=89=88=E3=81=AB=E5=9F=BA=E3=81=A5?=
=?UTF-8?q?=E3=81=8D=E6=9B=B4=E6=96=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
files/ja/web/api/file/file/index.md | 21 ++++++++++++---------
1 file changed, 12 insertions(+), 9 deletions(-)
diff --git a/files/ja/web/api/file/file/index.md b/files/ja/web/api/file/file/index.md
index dbf09db9c208e3..d3935d5a05f148 100644
--- a/files/ja/web/api/file/file/index.md
+++ b/files/ja/web/api/file/file/index.md
@@ -3,33 +3,36 @@ title: "File: File() コンストラクター"
short-title: File()
slug: Web/API/File/File
l10n:
- sourceCommit: 339595951b78774e951b1a9d215a6db6b856f6b2
+ sourceCommit: 8fd2ee72038310e3ecc387df235ffac1cb08775c
---
-{{APIRef("File")}}
+{{APIRef("File API")}}{{AvailableInWorkers}}
**`File()`** コンストラクターは、新しい {{domxref("File")}} オブジェクトのインスタンスを生成します。
## 構文
```js-nolint
-new File(bits, name)
-new File(bits, name, options)
+new File(fileBits, fileName)
+new File(fileBits, fileName, options)
```
### 引数
-- `bits`
- - : [反復可能](/ja/docs/Web/JavaScript/Reference/Iteration_protocols#反復可能プロトコル)オブジェクト、例えば {{jsxref("Array")}}、{{jsxref("ArrayBuffer")}}、{{jsxref("TypedArray")}}、{{jsxref("DataView")}}、{{domxref("Blob")}}、文字列、またはそのような要素を混合させたものを {{domxref("File")}} 内に格納します。なお、文字列は JavaScript の UTF-16 文字列ではなく、UTF-8 でエンコードされます。
-- `name`
+- `fileBits`
+ - : [反復可能](/ja/docs/Web/JavaScript/Reference/Iteration_protocols#反復可能プロトコル)オブジェクト、例えば {{jsxref("Array")}}、{{jsxref("ArrayBuffer")}}、{{jsxref("TypedArray")}}、{{jsxref("DataView")}}、{{domxref("Blob")}}、文字列、またはそのような要素を混合させたものを {{domxref("File")}} 内に格納します。
+ なお、文字列は JavaScript の UTF-16 文字列ではなく、UTF-8 でエンコードされます。
+- `fileName`
- : 文字列で、ファイル名またはファイルへのパスを表します。
- `options` {{optional_inline}}
- : ファイルのオプション属性を含むオプションオブジェクト。利用可能なオプションは以下の通りです。
- - `type`
+ - `type` {{optional_inline}}
- : ファイルの中に入るコンテンツの MIME タイプを表す文字列です。既定値は `""` です。
- - `lastModified`
+ - `endings` {{optional_inline}}
+ - : データがテキストの場合、コンテンツ内の改行文字 (`\n`) をどのように解釈するか。既定値である `transparent` は、改行文字を変更せずにblobにコピーします。改行文字をホストシステムのネイティブ規約に変換するには、値 `native` を指定します。
+ - `lastModified` {{optional_inline}}
- : UNIX 元期からのミリ秒単位で、ファイルが最後に更新された時刻を表す数値です。既定値は {{jsxref("Date.now()")}} です。
## 例
From b132104bf666b8bc364ab3d0a2cf88a7245336ba Mon Sep 17 00:00:00 2001
From: Masahiro FUJIMOTO
Date: Sun, 21 Jul 2024 22:32:53 +0900
Subject: [PATCH 040/185] =?UTF-8?q?2024/07/05=20=E6=99=82=E7=82=B9?=
=?UTF-8?q?=E3=81=AE=E8=8B=B1=E8=AA=9E=E7=89=88=E3=81=AB=E5=9F=BA=E3=81=A5?=
=?UTF-8?q?=E3=81=8D=E6=9B=B4=E6=96=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
files/ja/web/api/file/lastmodified/index.md | 16 +++++++------
.../ja/web/api/file/lastmodifieddate/index.md | 23 ++++++++++---------
2 files changed, 21 insertions(+), 18 deletions(-)
diff --git a/files/ja/web/api/file/lastmodified/index.md b/files/ja/web/api/file/lastmodified/index.md
index 1960b12530ac1a..ba61075adbe4ec 100644
--- a/files/ja/web/api/file/lastmodified/index.md
+++ b/files/ja/web/api/file/lastmodified/index.md
@@ -3,12 +3,12 @@ title: "File: lastModified プロパティ"
short-title: lastModified
slug: Web/API/File/lastModified
l10n:
- sourceCommit: 339595951b78774e951b1a9d215a6db6b856f6b2
+ sourceCommit: 3b5a1c0dfd59257c0a51052a9efa7b0108f8ecca
---
-{{APIRef("File")}}
+{{APIRef("File API")}}{{AvailableInWorkers}}
-**`File.lastModified`** は読み取り専用プロパティで、ファイルの最終更新日時を UNIX 元期(1970 年 1 月 1 日の深夜 0 時)からのミリ秒数で返します。最終更新日時が分からないファイルは、現在の日時を返します。
+**`lastModified`** は {{domxref("File")}} インターフェイスの読み取り専用プロパティで、ファイルの最終更新日時を UNIX 元期(1970 年 1 月 1 日の深夜 0 時)からのミリ秒数で返します。最終更新日時が分からないファイルは、現在の日時を返します。
## 値
@@ -74,12 +74,15 @@ console.log(fileWithoutDate.lastModified); // returns current time
## 時間の精度の低下
-タイミング攻撃やフィンガープリンティングに対する保護機能を提供するために、 `someFile.lastModified` の精度がブラウザーの設定に応じて丸められることがあります。
-Firefox では、`privacy.reduceTimerPrecision` 設定は既定で有効になっており、 Firefox 59 では既定で 20 us に設定されています。60 で 2 ms になります。
+タイミング攻撃や[フィンガープリンティング](/ja/docs/Glossary/Fingerprinting)に対する保護機能を提供するために、 `someFile.lastModified` の精度がブラウザーの設定に応じて丸められることがあります。
+Firefox では、`privacy.reduceTimerPrecision` 設定は既定で有効になっており、既定で 2 ミリ秒になります。この場合、精度は 100ms または `privacy.resistFingerprinting.reduceTimerPrecision.microseconds` の値のどちらか大きい方になります。
+
+例えば、時刻の精度を下げた場合、`someFile.lastModified` の結果は常に 2 の倍数になり、`privacy.resistFingerprinting` を有効にした場合は 100 の倍数(または `privacy.resistFingerprinting.reduceTimerPrecision.microseconds`)になります。
```js
// Firefox 60 での時間の制度の低下 (2ms)
someFile.lastModified;
+// 取りうる値:
// 1519211809934
// 1519211810362
// 1519211811670
@@ -87,14 +90,13 @@ someFile.lastModified;
// `privacy.resistFingerprinting` が有効な場合の時間の制度の低下
someFile.lastModified;
+// 取りうる値:
// 1519129853500
// 1519129858900
// 1519129864400
// …
```
-Firefox では、`privacy.resistFingerprinting` を有効にすることもできます。精度は 100ms か `privacy.resistFingerprinting.reduceTimerPrecision.microseconds` のいずれか大きい方の値になります。
-
## 仕様書
{{Specifications}}
diff --git a/files/ja/web/api/file/lastmodifieddate/index.md b/files/ja/web/api/file/lastmodifieddate/index.md
index 6b7f6c1323d7c4..f9ace3a00f6747 100644
--- a/files/ja/web/api/file/lastmodifieddate/index.md
+++ b/files/ja/web/api/file/lastmodifieddate/index.md
@@ -3,16 +3,16 @@ title: "File: lastModifiedDate プロパティ"
short-title: lastModifiedDate
slug: Web/API/File/lastModifiedDate
l10n:
- sourceCommit: acfe8c9f1f4145f77653a2bc64a9744b001358dc
+ sourceCommit: 3b5a1c0dfd59257c0a51052a9efa7b0108f8ecca
---
-{{APIRef("File API")}}{{Deprecated_Header}}{{Non-standard_Header}}
+{{APIRef("File API")}}{{AvailableInWorkers}}{{Deprecated_Header}}{{Non-standard_Header}}
-**`File.lastModifiedDate`** 読み取り専用プロパティは、ファイルの最終更新日を返します。最終更新日がわからないファイルは、現在の日付を返します。
+**`lastModifiedDate`** は {{domxref("File")}} インターフェイスの読み取り専用プロパティで、ファイルの最終更新日を返します。最終更新日がわからないファイルは、現在の日付を返します。
## 値
-[`Date`](/ja/docs/Web/JavaScript/Reference/Global_Objects/Date) オブジェクトで、ファイルが最後に変更された日時を表します。
+{{JSXRef("Global_Objects/Date", "Date")}} オブジェクトで、ファイルが最後に変更された日時を表します。
## 例
@@ -27,31 +27,32 @@ for (const file of fileInput.files) {
## 時間の精度の低下
-タイミング攻撃や[フィンガープリンティング](/ja/docs/Glossary/Fingerprinting)に対する保護機能を提供するために、 `someFile.lastModifiedDate.getTime()` の精度がブラウザーの設定に応じて丸められることがあります。
+タイミング攻撃や[フィンガープリンティング](/ja/docs/Glossary/Fingerprinting)に対する保護機能を提供するために、 `someFile.lastModified` の精度がブラウザーの設定に応じて丸められることがあります。
+Firefox では、`privacy.reduceTimerPrecision` 設定は既定で有効になっており、既定で 2 ミリ秒になります。この場合、精度は 100ms または `privacy.resistFingerprinting.reduceTimerPrecision.microseconds` の値のどちらか大きい方になります。
-Firefox では、`privacy.reduceTimerPrecision` 設定は既定で有効になっており、 Firefox 59 では既定で 20 us に設定されています。60 で 2 ms になります。
+例えば、時刻の精度を下げた場合、`someFile.lastModified` の結果は常に 2 の倍数になり、`privacy.resistFingerprinting` を有効にした場合は 100 の倍数(または `privacy.resistFingerprinting.reduceTimerPrecision.microseconds`)になります。
```js
// Firefox 60 での時間の制度の低下 (2ms)
-someFile.lastModifiedDate.getTime();
+someFile.lastModified;
+// 取りうる値:
// 1519211809934
// 1519211810362
// 1519211811670
// …
// `privacy.resistFingerprinting` が有効な場合の時間の制度の低下
-someFile.lastModifiedDate.getTime();
+someFile.lastModified;
+// 取りうる値:
// 1519129853500
// 1519129858900
// 1519129864400
// …
```
-Firefox では、`privacy.resistFingerprinting` を有効にすることもできます。精度は 100ms か `privacy.resistFingerprinting.reduceTimerPrecision.microseconds` のいずれか大きい方の値になります。
-
## 仕様書
-_ファイル API 仕様の初期のドラフトにありますが、このプロパティは削除されており、現在は非標準です。代わりに{{domxref("File.lastModified")}} を使用してください。_
+_ファイル API 仕様の初期の草稿にありますが、このプロパティは削除されており、現在は標準外です。代わりに {{domxref("File.lastModified")}} を使用してください。_
## ブラウザーの互換性
From 451de5bc9932d250374d6fa9a5d2737b2d1f1609 Mon Sep 17 00:00:00 2001
From: Masahiro FUJIMOTO
Date: Sun, 21 Jul 2024 22:39:01 +0900
Subject: [PATCH 041/185] =?UTF-8?q?2023/12/02=20=E6=99=82=E7=82=B9?=
=?UTF-8?q?=E3=81=AE=E8=8B=B1=E8=AA=9E=E7=89=88=E3=81=AB=E5=9F=BA=E3=81=A5?=
=?UTF-8?q?=E3=81=8D=E6=9B=B4=E6=96=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
files/ja/web/api/file/name/index.md | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/files/ja/web/api/file/name/index.md b/files/ja/web/api/file/name/index.md
index f6ad5518f74748..a64053155faf47 100644
--- a/files/ja/web/api/file/name/index.md
+++ b/files/ja/web/api/file/name/index.md
@@ -3,12 +3,12 @@ title: "File: name プロパティ"
short-title: name
slug: Web/API/File/name
l10n:
- sourceCommit: 339595951b78774e951b1a9d215a6db6b856f6b2
+ sourceCommit: 8fd2ee72038310e3ecc387df235ffac1cb08775c
---
-{{APIRef("File API")}}
+{{APIRef("File API")}}{{AvailableInWorkers}}
-{{domxref("File")}} オブジェクトによって表されるファイルの名前を返します。セキュリティ上の理由から、パスはこのプロパティから除外されます。
+**`name`** は {{domxref("File")}} インターフェイスの読み取り専用プロパティで、この {{domxref("File")}} オブジェクトによって表されるファイルの名前を返します。セキュリティ上の理由から、パスはこのプロパティから除外されます。
## 値
From 35c860e14ad4477f934e8872e6c3c527ef5e3f8e Mon Sep 17 00:00:00 2001
From: Masahiro FUJIMOTO
Date: Sun, 21 Jul 2024 22:42:16 +0900
Subject: [PATCH 042/185] =?UTF-8?q?2024/05/17=20=E6=99=82=E7=82=B9?=
=?UTF-8?q?=E3=81=AE=E8=8B=B1=E8=AA=9E=E7=89=88=E3=81=AB=E5=9F=BA=E3=81=A5?=
=?UTF-8?q?=E3=81=8D=E6=9B=B4=E6=96=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
files/ja/web/api/file/webkitrelativepath/index.md | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/files/ja/web/api/file/webkitrelativepath/index.md b/files/ja/web/api/file/webkitrelativepath/index.md
index 9086d006befbf2..b0f875eff607ab 100644
--- a/files/ja/web/api/file/webkitrelativepath/index.md
+++ b/files/ja/web/api/file/webkitrelativepath/index.md
@@ -3,12 +3,12 @@ title: "File: webkitRelativePath プロパティ"
short-title: webkitRelativePath
slug: Web/API/File/webkitRelativePath
l10n:
- sourceCommit: 339595951b78774e951b1a9d215a6db6b856f6b2
+ sourceCommit: 367b982b93c07f7f99e7bb768a6bf326fa5198e6
---
-{{APIRef("File API")}}
+{{APIRef("File and Directory Entries API")}}{{AvailableInWorkers}}
-**`File.webkitRelativePath`** は、[`webkitdirectory`](/ja/docs/Web/HTML/Element/input#webkitdirectory) 属性が設定された {{HTMLElement("input")}} 要素で、ユーザーが選択したディレクトリーに対するファイルのパスを指定する文字列を持つ読み取り専用のプロパティです。
+**`webkitRelativePath`** は {{domxref("File")}} インターフェイスの読み取り専用プロパティで、[`webkitdirectory`](/ja/docs/Web/HTML/Element/input#webkitdirectory) 属性が設定された {{HTMLElement("input")}} 要素において、ユーザーが選択したディレクトリーに対するファイルのパスを指定する文字列を保持します。
## 値
@@ -16,7 +16,7 @@ l10n:
## 例
-この例では、ユーザーが 1 つまたは複数のディレクトリーを選択することができるディレクトリーピッカーが表示されます。 {{domxref("HTMLElement/change_event", "change")}} イベントが発生すると、選択されたディレクトリ階層に含まれるすべてのファイルのリストが生成され、表示されます。
+この例では、ユーザーが 1 つまたは複数のディレクトリーを選択することができるディレクトリーピッカーが表示されます。 {{domxref("HTMLElement/change_event", "change")}} イベントが発生すると、選択されたディレクトリー階層に含まれるすべてのファイルのリストが生成され、表示されます。
### HTML
From 2631e4e90b1d57354e5fc71d283ae4cd44348d69 Mon Sep 17 00:00:00 2001
From: Masahiro FUJIMOTO
Date: Mon, 22 Jul 2024 08:05:11 +0900
Subject: [PATCH 043/185] =?UTF-8?q?=E8=A1=A8=E8=A8=98=E3=82=86=E3=82=8C?=
=?UTF-8?q?=E3=81=AE=E4=BF=AE=E6=AD=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../file_and_directory_entries_api/introduction/index.md | 2 +-
.../api/file_api/using_files_from_web_applications/index.md | 6 +++---
.../api/file_system_api/origin_private_file_system/index.md | 2 +-
files/ja/web/api/filereader/readystate/index.md | 2 +-
files/ja/web/api/filesystemfilehandle/index.md | 4 ++--
.../ja/web/api/filesystemsyncaccesshandle/truncate/index.md | 2 +-
files/ja/web/api/fontface/fontface/index.md | 2 +-
files/ja/web/api/fullscreen_api/index.md | 4 ++--
files/ja/web/api/gamepad_api/using_the_gamepad_api/index.md | 6 +++---
.../api/html_drag_and_drop_api/file_drag_and_drop/index.md | 2 +-
10 files changed, 16 insertions(+), 16 deletions(-)
diff --git a/files/ja/web/api/file_and_directory_entries_api/introduction/index.md b/files/ja/web/api/file_and_directory_entries_api/introduction/index.md
index 9688fe780f774b..ae1189d8307406 100644
--- a/files/ja/web/api/file_and_directory_entries_api/introduction/index.md
+++ b/files/ja/web/api/file_and_directory_entries_api/introduction/index.md
@@ -7,7 +7,7 @@ l10n:
{{DefaultAPISidebar("File and Directory Entries API")}}
-[ファイルとディレクトリー項目 API](/ja/docs/Web/API/File_and_Directory_Entries_API) は、ウェブアプリケーションがナビゲートできるローカルファイルシステムをシミュレートします。サンドボックス化された仮想ファイルシステムでファイルやディレクトリの読み取り、書き込み、作成ができるアプリを開発できます。
+[ファイルとディレクトリー項目 API](/ja/docs/Web/API/File_and_Directory_Entries_API) は、ウェブアプリケーションがナビゲートできるローカルファイルシステムをシミュレートします。サンドボックス化された仮想ファイルシステムでファイルやディレクトリーの読み取り、書き込み、作成ができるアプリを開発できます。
ファイルとディレクトリー項目 API は、他にも関連する API と対話します。このAPIはファイルライター API をベースに構築されており、さらにファイル API をベースに構築されています。それぞれの API は異なる機能を追加しています。これらの API はウェブアプリケーションにとって大きな進化を遂げ、これで大量のデータをキャッシュして処理できるようになりました。
diff --git a/files/ja/web/api/file_api/using_files_from_web_applications/index.md b/files/ja/web/api/file_api/using_files_from_web_applications/index.md
index 263c80938df12b..d0d521bcba6626 100644
--- a/files/ja/web/api/file_api/using_files_from_web_applications/index.md
+++ b/files/ja/web/api/file_api/using_files_from_web_applications/index.md
@@ -286,7 +286,7 @@ function handleFiles(files) {
各画像には CSS クラス `obj` が追加されており、DOM ツリーで簡単に見つけることができます。また、各画像に `file` 属性を追加し、画像の {{DOMxRef("File")}} を指定しています。これにより、後で実際にアップロードする画像を取得することができます。{{DOMxRef("Node.appendChild()")}} を使用して、文書のプレビュー領域に新しいサムネイルを追加します。
-次に、画像の読み込みと `img` 要素へのアタッチを非同期で処理するための {{DOMxRef("FileReader")}} を確立します。新しい `FileReader` オブジェクトを作成した後、その `onload` 関数を設定し、`readAsDataURL()` を呼び出してバックグラウンドで読み込み処理を開始します。画像ファイルのコンテンツ全体が読み込まれると、それらは `data:` URL に変換され、`onload` コールバックに渡されます。このルーチンの実装では、`img` 要素の `src` 属性が読み込まれた画像に設定され、その結果、画像がユーザの画面のサムネイルに表示されます。
+次に、画像の読み込みと `img` 要素へのアタッチを非同期で処理するための {{DOMxRef("FileReader")}} を確立します。新しい `FileReader` オブジェクトを作成した後、その `onload` 関数を設定し、`readAsDataURL()` を呼び出してバックグラウンドで読み込み処理を開始します。画像ファイルのコンテンツ全体が読み込まれると、それらは `data:` URL に変換され、`onload` コールバックに渡されます。このルーチンの実装では、`img` 要素の `src` 属性が読み込まれた画像に設定され、その結果、画像がユーザーの画面のサムネイルに表示されます。
## オブジェクト URL を利用する
@@ -308,7 +308,7 @@ URL.revokeObjectURL(objectURL);
この例では、オブジェクト URL を使用して画像のサムネイルを表示しています。さらに、ファイル名やサイズなどの他のファイル情報も表示します。
-インターフェースとなる HTML は次のようになります。
+インターフェイスとなる HTML は次のようになります。
```html
{
// ファイルのサイズを取得する
const fileSize = accessHandle.getSize();
- // ファイルの内容をバッファに読み込む
+ // ファイルの内容をバッファーに読み込む
const buffer = new DataView(new ArrayBuffer(fileSize));
const readBuffer = accessHandle.read(buffer, { at: 0 });
diff --git a/files/ja/web/api/filesystemsyncaccesshandle/truncate/index.md b/files/ja/web/api/filesystemsyncaccesshandle/truncate/index.md
index 1137f18ca3386b..48162648e94a35 100644
--- a/files/ja/web/api/filesystemsyncaccesshandle/truncate/index.md
+++ b/files/ja/web/api/filesystemsyncaccesshandle/truncate/index.md
@@ -27,7 +27,7 @@ truncate(newSize)
### 例外
- `InvalidStateError` {{domxref("DOMException")}}
- - : 対応するアクセスハンドルが既に閉じられているか、ファイルのバイナリデータの変更が失敗したとき投げられます。
+ - : 対応するアクセスハンドルが既に閉じられているか、ファイルのバイナリーデータの変更が失敗したとき投げられます。
- `QuotaExceededError` {{domxref("DOMException")}}
- : `newSize` がファイルのもとのサイズより大きく、ブラウザーの[ストレージ制限](/ja/docs/Web/API/Storage_API/Storage_quotas_and_eviction_criteria)を超えるとき投げられます。
diff --git a/files/ja/web/api/fontface/fontface/index.md b/files/ja/web/api/fontface/fontface/index.md
index 10cd628a7b7018..40d66e0de51032 100644
--- a/files/ja/web/api/fontface/fontface/index.md
+++ b/files/ja/web/api/fontface/fontface/index.md
@@ -63,7 +63,7 @@ new FontFace(family, source, descriptors)
### 例外
- `SyntaxError` {{domxref("DOMException")}}
- - : 記述子の文字列が、対応する {{cssxref("@font-face")}} 記述子の文法に照合しないか、指定するバイナリソースを読み込むことができない場合に発生します。
+ - : 記述子の文字列が、対応する {{cssxref("@font-face")}} 記述子の文法に照合しないか、指定するバイナリーソースを読み込むことができない場合に発生します。
このエラーでは {{domxref("FontFace.status")}} が `error` に設定されます。
## 例
diff --git a/files/ja/web/api/fullscreen_api/index.md b/files/ja/web/api/fullscreen_api/index.md
index 699148e04679f9..b5f915881fb9c4 100644
--- a/files/ja/web/api/fullscreen_api/index.md
+++ b/files/ja/web/api/fullscreen_api/index.md
@@ -11,7 +11,7 @@ l10n:
API の使い方についての詳細は、 [全画面 API ガイド](/ja/docs/Web/API/Fullscreen_API/Guide)をご覧ください。
-> **メモ:** この API の対応はブラウザーによって、ベンダー接頭辞が必要かどうか、最新の仕様を実装しているかどうかがいくらか異なっています。この API の実装状況の詳細は、[ブラウザーの互換性](#ブラウザーの互換性)の節を参照してください。ベンダーに依存せずに全画面 API にアクセスできる [Fscreen](https://github.com/rafgraph/fscreen) のようなライブラリのー使用を検討したほうが良いかもしれません。
+> **メモ:** この API の対応はブラウザーによって、ベンダー接頭辞が必要かどうか、最新の仕様を実装しているかどうかがいくらか異なっています。この API の実装状況の詳細は、[ブラウザーの互換性](#ブラウザーの互換性)の節を参照してください。ベンダーに依存せずに全画面 API にアクセスできる [Fscreen](https://github.com/rafgraph/fscreen) のようなライブラリーのー使用を検討したほうが良いかもしれません。
## インターフェイス
@@ -33,7 +33,7 @@ _全画面 API 自体に独自のインターフェイスはありません。
## インスタンスプロパティ
-_{{DOMxRef("Document")}} インターフェイスはこのインターフェースは、全画面モードに対応していて利用できるかどうか、全画面モードが現在有効であれば、どの要素が画面を使用しているかを判断するために使用できるプロパティを提供します_。
+_{{DOMxRef("Document")}} インターフェイスはこのインターフェイスは、全画面モードに対応していて利用できるかどうか、全画面モードが現在有効であれば、どの要素が画面を使用しているかを判断するために使用できるプロパティを提供します_。
- {{DOMxRef("Document.fullscreenElement")}} / {{DOMxRef("ShadowRoot.fullscreenElement")}}
- : `fullscreenElement` プロパティで、現在全画面モードで表示されている DOM (またはシャドウ DOM)上の要素 ({{DOMxRef("Element")}}) が分かります。これが `null` の場合、文書(またはシャドウ DOM)は全画面モードになっていません。
diff --git a/files/ja/web/api/gamepad_api/using_the_gamepad_api/index.md b/files/ja/web/api/gamepad_api/using_the_gamepad_api/index.md
index d3606c25f3e113..5ad91d630d782a 100644
--- a/files/ja/web/api/gamepad_api/using_the_gamepad_api/index.md
+++ b/files/ja/web/api/gamepad_api/using_the_gamepad_api/index.md
@@ -107,14 +107,14 @@ window.addEventListener("gamepadconnected", (e) => {
- `id`: コントローラーに関する情報を含んだ文字列です。これは厳密には指定されていなく、Firefox では、コントローラーの USB ベンダと製品 ID を含んでいる 2 つの 4 桁 16 進数字列、およびドライバーから提供されるようなコントローラーの名前といった 3 つの情報が、ダッシュ (`-`) により分離され含まれています。この情報はユーザーへの有益なフィードバックを表示するとともに、デバイスのコントロールのマッピングを見つけることができるようにします。
- `index`: 現在システムに接続されているゲームパッドごとに固有の整数。この値は複数のコントローラーを区別するために使用できます。デバイスを切断してから新しいデバイスを接続すると、以前のインデックスが再利用されることに注意してください。
-- `mapping`: ブラウザがデバイス上のコントロールを既知のレイアウトに再マップしたかどうかを示す文字列。現在、サポートされている既知のレイアウト - [標準のゲームパッド](https://w3c.github.io/gamepad/gamepad.html#remapping)は 1 つしかありません。ブラウザがデバイス上のコントロールをそのレイアウトにマッピングできる場合、 `mapping` プロパティは文字列 `standard` に設定されます。
+- `mapping`: ブラウザーがデバイス上のコントロールを既知のレイアウトに再マップしたかどうかを示す文字列。現在、サポートされている既知のレイアウト - [標準のゲームパッド](https://w3c.github.io/gamepad/gamepad.html#remapping)は 1 つしかありません。ブラウザーがデバイス上のコントロールをそのレイアウトにマッピングできる場合、 `mapping` プロパティは文字列 `standard` に設定されます。
- `connected`:ゲームパッドがシステムに接続されているかどうかを示すブール値。もし接続されている場合は `True`。接続されていない場合は `False` が設定されます。
- `buttons`: デバイス上に存在するボタンを表す {{ domxref("GamepadButton") }} オブジェクトの配列。各 {{ domxref("GamepadButton") }} には、`pressed` プロパティと `value` のプロパティがあります。
- `pressed` プロパティは、ボタンが現在押されている (`true`) か押されていない (`false`) かを示すブール値です。>
- `value` プロパティは、現代の多くのゲームパッドのトリガなど、アナログボタンの表示を有効にするために使用される浮動小数点値です。値は 0.0..1.0 の範囲に正規化され、 0.0 は押されていないボタンを表し、 1.0 は完全に押されたボタンを表します。
-- `axes`: デバイス上に軸があるコントロールを表す配列 (例:アナログサムスティック)。 配列の各エントリは-1.0〜1.0 の範囲の浮動小数点値で、最小値 (-1.0) から最大値 (1.0) までの軸の位置を表します。
+- `axes`: デバイス上に軸があるコントロールを表す配列 (例:アナログサムスティック)。 配列の各エントリーは-1.0〜1.0 の範囲の浮動小数点値で、最小値 (-1.0) から最大値 (1.0) までの軸の位置を表します。
- `timestamp`: このゲームパッドのデータが最後に更新された時刻を表す {{ domxref("DOMHighResTimeStamp") }} を返します。この値により、開発者は `axes` と `button` のデータがハードウェアから更新されたかどうかを判断できます。 値は、 {{ domxref("PerformanceTiming") }} インターフェイスの `navigationStart` 属性との相対値でなければなりません。 値は単調に増加します。つまり、更新の順序を決定するために比較することができます。新しい値は常に古い値よりも大きいか等しいためです。このプロパティは現在 Firefox ではサポートされていません。
> **メモ:** Gamepad オブジェクトは、セキュリティ上の理由から {{ domxref("Window") }} オブジェクトではなく {{ domxref("Window/gamepadconnected_event", "gamepadconnected") }} イベントで使用できます。一度参照を取得すると、そのプロパティでゲームパッドの現在の状態に関する情報を照会できます。 このオブジェクトは、ゲームパッドの状態が変わるたびに更新されます。
@@ -123,7 +123,7 @@ window.addEventListener("gamepadconnected", (e) => {
1 つのゲームパッドの接続情報を表示する簡単な例を見てみましょう (後続のゲームパッド接続を無視します)。ゲームパッドの右側にある 4 つのゲームパッドボタンを使用してボールを画面の周りに移動できます。[デモをライブで見ることができ](http://chrisdavidmills.github.io/gamepad-buttons/)ことができ、Github で[ソースコードを見つけることができます](https://github.com/chrisdavidmills/gamepad-buttons/tree/master)。
-まず、いくつかの変数を宣言します。接続情報が書き込まれる `gamepadInfo` のパラグラフ、移動する `ball`、`requestAnimation Frame` の ID として機能する `start` 変数、ボールを移動するための位置変更子として機能する a および b 変数、および短縮形変数 これは、 {{ domxref("Window.requestAnimationFrame", "requestAnimationFrame()") }} および {{ domxref("Window.cancelAnimationFrame", "cancelAnimationFrame()") }} クロスブラウザフォークで使用されます。
+まず、いくつかの変数を宣言します。接続情報が書き込まれる `gamepadInfo` のパラグラフ、移動する `ball`、`requestAnimation Frame` の ID として機能する `start` 変数、ボールを移動するための位置変更子として機能する a および b 変数、および短縮形変数 これは、 {{ domxref("Window.requestAnimationFrame", "requestAnimationFrame()") }} および {{ domxref("Window.cancelAnimationFrame", "cancelAnimationFrame()") }} クロスブラウザーフォークで使用されます。
```js
const gamepadInfo = document.getElementById("gamepad-info");
diff --git a/files/ja/web/api/html_drag_and_drop_api/file_drag_and_drop/index.md b/files/ja/web/api/html_drag_and_drop_api/file_drag_and_drop/index.md
index be37744079a5c9..44dd5b815027cf 100644
--- a/files/ja/web/api/html_drag_and_drop_api/file_drag_and_drop/index.md
+++ b/files/ja/web/api/html_drag_and_drop_api/file_drag_and_drop/index.md
@@ -11,7 +11,7 @@ HTML ドラッグ & ドロップインターフェイスは、ウェブアプリ
ドラッグ & ドロップの主な手順は、ドロップゾーン(ファイルドロップの対象要素)を定義することと、 {{domxref("HTMLElement/drop_event", "drop")}} および {{domxref("HTMLElement/dragover_event", "dragover")}} イベントのイベントハンドラーを定義することです。これらの手順は、コード例を含め、下記で記述します。完全なソースコードは [MDN のドラッグ & ドロップリポジトリー](https://github.com/mdn/dom-examples/tree/main/drag-and-drop)で利用できます(プルリクエストや issue を歓迎します)。
-なお、 {{domxref("HTML_Drag_and_Drop_API","HTML ドラッグ & ドロップ", "", 1)}}では、ファイルのドラッグ & ドロップに対応するために 2 つの異なる形の API を定義しています。一方の API は {{domxref("DataTransfer")}} インターフェイスで、もう一方の API は {{domxref("DataTransferItem")}} と {{domxref("DataTransferItemList")}} インターフェイスです。この例では、両方の API の使用方法を説明します (そして、Gecko 固有のインターフェースは一切使用しません)。
+なお、 {{domxref("HTML_Drag_and_Drop_API","HTML ドラッグ & ドロップ", "", 1)}}では、ファイルのドラッグ & ドロップに対応するために 2 つの異なる形の API を定義しています。一方の API は {{domxref("DataTransfer")}} インターフェイスで、もう一方の API は {{domxref("DataTransferItem")}} と {{domxref("DataTransferItemList")}} インターフェイスです。この例では、両方の API の使用方法を説明します (そして、Gecko 固有のインターフェイスは一切使用しません)。
## ドロップゾーンの定義
From 79d35d74f13223642841b15465d17d353ff72c82 Mon Sep 17 00:00:00 2001
From: msh
Date: Thu, 25 Jul 2024 09:31:41 -0600
Subject: [PATCH 044/185] Fix translation of protocol name in Spanish docs
(#22473)
Corrected the translation of the protocol name from HTTP to "TCP" in the Spanish documentation.
---
files/es/web/http/connection_management_in_http_1.x/index.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/files/es/web/http/connection_management_in_http_1.x/index.md b/files/es/web/http/connection_management_in_http_1.x/index.md
index 69e7235ae2e42a..e9b269f273cdae 100644
--- a/files/es/web/http/connection_management_in_http_1.x/index.md
+++ b/files/es/web/http/connection_management_in_http_1.x/index.md
@@ -23,7 +23,7 @@ Un tema también relativo a esto, es el concepto de conexiones con protocolos HT
## Conexiones breves
-El modelo original de HTTP, y el modelo de HTTP/1.0, está basado, en conexiones breves. Cada petición HTTP, se completa estableciendo (iniciando, estableciendo y cerrando) su propia conexión. Esto supone que la coordinación en el protocolo HTTP (handshake), sucede de forma previa a cada petición HTTP.
+El modelo original de HTTP, y el modelo de HTTP/1.0, está basado, en conexiones breves. Cada petición HTTP, se completa estableciendo (iniciando, estableciendo y cerrando) su propia conexión. Esto supone que la coordinación en el protocolo TCP (handshake), sucede de forma previa a cada petición HTTP.
La coordinación o inicialización de una comunicación en el protocolo TCP, requiere un tiempo dado, pero al adaptarse el protocolo TCP a su carga de transmisión de datos, este incrementa su eficiencia cuando se mantiene la conexión en el tiempo, utilizándose una conexión para transmitir numerosos peticiones de datos. Las conexiones breves, no utilizan esta característica del protocolo TCP, y el rendimiento de la conexión es peor que en el caso óptimo, al estar constantemente necesitando iniciar conexiones para transmitir cada mensaje (esto se conoce como conexiones 'en frio', o en inglés: 'cold connections').
From b411c9c2e4a2a0882bb8a15bf59e49645254ae5c Mon Sep 17 00:00:00 2001
From: Eennou <80620931+Eennou@users.noreply.github.com>
Date: Fri, 26 Jul 2024 01:25:04 +0300
Subject: [PATCH 045/185] [ru] improve
`Learn/HTML/Introduction_to_HTML/Creating_hyperlinks` translation (#22599)
* Fixed some untranslated fragments
* [ru] improve wording and formatting
---------
Co-authored-by: Leonid Vinogradov
---
.../creating_hyperlinks/index.md | 26 ++++++++-----------
1 file changed, 11 insertions(+), 15 deletions(-)
diff --git a/files/ru/learn/html/introduction_to_html/creating_hyperlinks/index.md b/files/ru/learn/html/introduction_to_html/creating_hyperlinks/index.md
index 698fa3a9829501..2cb23d3e109f73 100644
--- a/files/ru/learn/html/introduction_to_html/creating_hyperlinks/index.md
+++ b/files/ru/learn/html/introduction_to_html/creating_hyperlinks/index.md
@@ -49,7 +49,7 @@ slug: Learn/HTML/Introduction_to_HTML/Creating_hyperlinks
### Блочные ссылки
-Как упоминалось ранее, вы можете превратить любой элемент в ссылку, даже {{Glossary("Block/CSS", "блочный элемент")}}. Если вы хотите превратить заголовок в ссылку, то оберните его в элемент (``):
+Как упоминалось ранее, почти любой контент может быть ссылкой, даже {{Glossary("Block/CSS", "блочный элемент")}}. Если вы хотите превратить заголовок в ссылку, то оберните его в элемент (` `):
```html
@@ -60,30 +60,26 @@ slug: Learn/HTML/Introduction_to_HTML/Creating_hyperlinks
```
-This turns the heading into a link:
+Это превратит заголовок в ссылку:
{{EmbedLiveSample('Блочные ссылки', '100%', 150)}}
### Добавляем информацию с помощью атрибута title
-Другим атрибутом, который вы можете добавить к своим ссылкам, является — `title`. Он предназначен для хранения полезной информации о ссылке. Например, какую информацию содержит страница или другие вещи, о которых вам нужно знать. Например:
+Другим атрибутом ссылок является `title`. Он может содержать дополнительную информацию о ссылке, например, описание страницы или другие вещи, о которых следует знать пользователю.
```html-nolint
Я создал ссылку на
- домашнюю страницу Mozilla .
+ домашнюю страницу Mozilla .
```
-Вот что получилось (описание появится, если навести курсор на ссылку):
+Результат описанного выше примера будет таким (описание появится, если навести курсор на ссылку):
{{EmbedLiveSample('Добавляем информацию с помощью атрибута title', '100%', 150)}}
-> **Примечание:** Описание из атрибута title отображается только при наведении курсора, значит люди, полагающиеся на клавиатурные элементы управления для навигации по веб-страницам, будут испытывать трудности с доступом к информации, которую содержит title. Если информация заголовка действительно важна для удобства использования страницы, то вы должны представить её таким образом, который будет доступен для всех пользователей, например, поместив её в обычный текст.
+> **Примечание:** Описание из атрибута `title` отображается только при наведении курсора, значит люди, полагающиеся на клавиатурные элементы управления для навигации по веб-страницам, будут испытывать трудности с доступом к информации, которую содержит title. Если информация заголовка действительно важна для удобства использования страницы, то вы должны представить её таким образом, который будет доступен для всех пользователей, например, поместив её в обычный текст.
### Активное изучение: создаём собственную ссылку
@@ -195,13 +191,13 @@ _Относительный URL_ будет указывать на различ
_**Хороший** текст ссылки:_ [Скачать Firefox](https://firefox.com)
```html
- Скачать Firefox
+Скачать Firefox
```
_**Плохой** текст ссылки:_ [Нажми сюда](https://firefox.com/), чтобы скачать Firefox
```html
- Нажми сюда чтобы скачать Firefox
+Нажми сюда чтобы скачать Firefox
```
Советы:
@@ -301,12 +297,12 @@ _**Плохой** текст ссылки:_ [Нажми сюда](https://firefo
Помимо адреса электронной почты, вы можете предоставить другую информацию. Фактически, любые стандартные поля для отправки почты могут быть добавлены к указанному вами адресу `mailto`. Часто используемыми из них являются «subject», «cc» и «body» (которые не являются истинным полем заголовка, но позволяют указать дополнительную информацию для нового сообщения электронной почты). Каждое поле и его значение задаются в качестве условия запроса.
-Вот пример который включает cc(кому отправить копию сообщения, все получатели письма видят список тех кто это письмо получит), bcc(скрытый адрес получателя, никто из получателей не будет видеть полный список получателей письма), subject(тема письма) и body(текст сообщения):
+Вот пример, который содержит поля cc (кому отправить копию сообщения, все получатели письма видят список тех кто это письмо получит), bcc (скрытый адрес получателя, никто из получателей не будет видеть полный список получателей письма), subject (тема письма) и body (текст сообщения):
```html
- Send mail with cc, bcc, subject and body
+ Отправить письмо с полями cc, bcc, subject и body
```
From 98b5b6bed3f4157ed2471fedb1e77602c18e5291 Mon Sep 17 00:00:00 2001
From: A1lo
Date: Fri, 26 Jul 2024 10:33:10 +0800
Subject: [PATCH 046/185] chore(zh-cn): remove image links to the image itself
(#22558)
---
files/zh-cn/glossary/color_wheel/index.md | 4 ++--
files/zh-cn/glossary/sql_injection/index.md | 6 ++++--
.../web_mechanics/what_is_a_web_server/index.md | 4 ++--
files/zh-cn/web/api/webrtc_api/connectivity/index.md | 6 ++++--
.../api/webrtc_api/signaling_and_video_calling/index.md | 4 ++--
files/zh-cn/web/api/window/prompt/index.md | 2 +-
files/zh-cn/web/css/border-image-slice/index.md | 2 +-
files/zh-cn/web/css/mask-border-slice/index.md | 2 +-
files/zh-cn/web/html/content_categories/index.md | 2 +-
files/zh-cn/web/media/formats/video_codecs/index.md | 8 ++++----
10 files changed, 22 insertions(+), 18 deletions(-)
diff --git a/files/zh-cn/glossary/color_wheel/index.md b/files/zh-cn/glossary/color_wheel/index.md
index 2cdb1e67635916..25263123adf1a1 100644
--- a/files/zh-cn/glossary/color_wheel/index.md
+++ b/files/zh-cn/glossary/color_wheel/index.md
@@ -2,7 +2,7 @@
title: 色环
slug: Glossary/Color_wheel
l10n:
- sourceCommit: 7a551aaa034fbada3eb99e6fc924a0313b78307f
+ sourceCommit: b2af4eb16dd4c399ed81f67efd49777fa6ae9030
---
{{GlossarySidebar}}
@@ -17,7 +17,7 @@ l10n:
在计算机领域中,色环被用于*颜色选择器*,比如 macOS 上的默认颜色选择器:
-[![macOS 上的默认颜色选择器](color_wheel_macos.png)](/zh-CN/docs/Glossary/Color_wheel/color_wheel_macos.png)
+![macOS 上的默认颜色选择器](color_wheel_macos.png)
## 参见
diff --git a/files/zh-cn/glossary/sql_injection/index.md b/files/zh-cn/glossary/sql_injection/index.md
index 2a25c70180cadc..83265cc115150e 100644
--- a/files/zh-cn/glossary/sql_injection/index.md
+++ b/files/zh-cn/glossary/sql_injection/index.md
@@ -2,7 +2,7 @@
title: SQL 注入
slug: Glossary/SQL_Injection
l10n:
- sourceCommit: ada5fa5ef15eadd44b549ecf906423b4a2092f34
+ sourceCommit: b2af4eb16dd4c399ed81f67efd49777fa6ae9030
---
{{GlossarySidebar}}
@@ -11,7 +11,9 @@ SQL 注入利用了未能验证用户输入的 Web 应用程序。黑客可以
SQL 注入可以获得对数据库的未经授权的访问,或直接从数据库检索信息。许多数据泄露事件都是由于 SQL 注入造成的。
-[![显示最常见漏洞的饼状图:SQL 注入占 50%,跨站脚本占 42%,源代码泄露占 7%。](sql_inj_xss.gif)](https://cdn.acunetix.com/wp_content/uploads/2010/09/sql_inj_xss.gif)
+![显示最常见漏洞的饼状图:SQL 注入占 50%,跨站脚本占 42%,源代码泄露占 7%。](sql_inj_xss.gif)
+
+[原始来源](https://cdn.acunetix.com/wp_content/uploads/2010/09/sql_inj_xss.gif)
## 如何实现
diff --git a/files/zh-cn/learn/common_questions/web_mechanics/what_is_a_web_server/index.md b/files/zh-cn/learn/common_questions/web_mechanics/what_is_a_web_server/index.md
index 07558dbbda833d..102e3de062c509 100644
--- a/files/zh-cn/learn/common_questions/web_mechanics/what_is_a_web_server/index.md
+++ b/files/zh-cn/learn/common_questions/web_mechanics/what_is_a_web_server/index.md
@@ -2,7 +2,7 @@
title: 什么是 web 服务器?
slug: Learn/Common_questions/Web_mechanics/What_is_a_web_server
l10n:
- sourceCommit: bb026bcb88b7f45374d602301b7b0db5a49ff303
+ sourceCommit: b2af4eb16dd4c399ed81f67efd49777fa6ae9030
---
{{QuicklinksWithSubPages("/zh-CN/docs/Learn/Common_questions")}}
@@ -88,7 +88,7 @@ HTTP 为客户和服务器间的如何沟通提供清晰的规则。我们会在
1. 当收到一个请求时,HTTP 服务器首先要检查所请求的 URL 是否与一个存在的文件相匹配。
2. 如果是,网络服务器会传送文件内容回到浏览器。如果不是,服务器会检查是否应该动态生成请求所需的文件(参见[静态和动态内容](#静态和动态内容))。
3. 如果两种处理都不可能,网络服务器会返回一个错误信息到浏览器,最常见的是 {{HTTPStatus("404", "404 Not Found")}}。404 错误太常见以至于很多网页设计者花费许多时间去设计 404 错误页面。
- [![MDN 404 页面示例](mdn-404.jpg)](/zh-CN/docs/Web/HTTP/Status/404)
+ ![MDN 404 页面示例](mdn-404.jpg)
### 静态和动态内容
diff --git a/files/zh-cn/web/api/webrtc_api/connectivity/index.md b/files/zh-cn/web/api/webrtc_api/connectivity/index.md
index ea82033a3fd0f0..0d6f92bf231079 100644
--- a/files/zh-cn/web/api/webrtc_api/connectivity/index.md
+++ b/files/zh-cn/web/api/webrtc_api/connectivity/index.md
@@ -63,6 +63,8 @@ WebRTC 连接上的端点配置称为**会话描述**。该描述包括关于要
> **备注:** 一般来说,使用 TCP 的 ICE 候选者只有当 UDP 不可用或被限制使其不适用于媒体流时才会被使用。不是所有的浏览器都支持 ICE over TCP。
-## The entire exchange in a complicated diagram
+## 整个交换的复杂图表
-[![A complete architectural diagram showing the whole WebRTC process.](webrtc-complete-diagram.png)](https://hacks.mozilla.org/wp-content/uploads/2013/07/webrtc-complete-diagram.png)
+![展示 WebRTC 完整流程的架构图。](webrtc-complete-diagram.png)
+
+[原始来源](https://hacks.mozilla.org/2013/07/webrtc-and-the-ocean-of-acronyms/)
diff --git a/files/zh-cn/web/api/webrtc_api/signaling_and_video_calling/index.md b/files/zh-cn/web/api/webrtc_api/signaling_and_video_calling/index.md
index 886b84a9007f0b..7fceb3efb1d293 100644
--- a/files/zh-cn/web/api/webrtc_api/signaling_and_video_calling/index.md
+++ b/files/zh-cn/web/api/webrtc_api/signaling_and_video_calling/index.md
@@ -133,7 +133,7 @@ if (sendToClients) {
假设 Naomi 和 Priya 正在使用聊天软件进行讨论,Naomi 决定在两人之间打开一个视频通话。以下是预期的事件顺序:
-[![Diagram of the signaling process](webrtc_-_signaling_diagram.svg)](webrtc_-_signaling_diagram.svg)
+![信令流程图](webrtc_-_signaling_diagram.svg)
在本文的整个过程中,我们将看到更详细的信息。
@@ -141,7 +141,7 @@ if (sendToClients) {
当每端的 ICE 层开始发送候选时,它会在链中的各个点之间进行交换,如下所示:
-[![Diagram of ICE candidate exchange process](webrtc_-_ice_candidate_exchange.svg)](webrtc_-_ice_candidate_exchange.svg)
+![ICE 候选交换流程图](webrtc_-_ice_candidate_exchange.svg)
每一端从本地的 ICE 层接收候选时,都会将其发送给另一方;不存在轮流或成批的候选。一旦两端就一个候选达成一致,双方就都可以用此候选来交换媒体数据,媒体数据就开始流动。即使在媒体数据已经开始流动之后,每一端都会继续向候选发送消息,直到他们没有选择的余地。这样做是为了找到比最初选择的更好的选择。
diff --git a/files/zh-cn/web/api/window/prompt/index.md b/files/zh-cn/web/api/window/prompt/index.md
index 66b437c31c2573..e7020e865fcd1b 100644
--- a/files/zh-cn/web/api/window/prompt/index.md
+++ b/files/zh-cn/web/api/window/prompt/index.md
@@ -48,7 +48,7 @@ sign = window.prompt("你觉得很幸运吗?", "是的"); // 打开显示提
以上提示框显示如下(在 macOS 的 Chrome 浏览器上):
-[![macOS 上 Chrome 中的 prompt() 对话框](prompt.png)](prompt.png)
+![macOS 上 Chrome 中的 prompt() 对话框](prompt.png)
## 注意事项
diff --git a/files/zh-cn/web/css/border-image-slice/index.md b/files/zh-cn/web/css/border-image-slice/index.md
index 63fe3893613d18..9cb869055874b0 100644
--- a/files/zh-cn/web/css/border-image-slice/index.md
+++ b/files/zh-cn/web/css/border-image-slice/index.md
@@ -11,7 +11,7 @@ slug: Web/CSS/border-image-slice
切分过程会将图像分割为 9 个区域:四个角、四个边(edges)以及中心区域。四条切片线,从它们各自的侧面设置给定距离,控制区域的大小。
-[![The nine regions defined by the border-image or border-image-slice properties](border-image-slice.png)](border-image-slice.png)
+![由 border-image 或 border-image-slice 属性定义的九个区域](border-image-slice.png)
上图说明了每个区域的位置。
diff --git a/files/zh-cn/web/css/mask-border-slice/index.md b/files/zh-cn/web/css/mask-border-slice/index.md
index d21e5de0e24fd0..31db5839de314b 100644
--- a/files/zh-cn/web/css/mask-border-slice/index.md
+++ b/files/zh-cn/web/css/mask-border-slice/index.md
@@ -57,7 +57,7 @@ mask-border-slice: unset;
切片过程总共创建九个区域:四个角、四条边和一个中间区域。四条切片线从各自的边上设置一定的距离,控制区域的大小。
-[![由 border-image 或 border-image-slice 属性定义的九个区域](border-image-slice.png)](border-image-slice.png)
+![由 border-image 或 border-image-slice 属性定义的九个区域](border-image-slice.png)
- 1-4 区为边角区域。每个区域只使用一次,以形成最终边框图像的边角。
- 5-8 区为边缘区域。这些区域会在最终边框图像中进行[重复、缩放或其他修改](/zh-CN/docs/Web/CSS/mask-border-repeat),以匹配元素的尺寸。
diff --git a/files/zh-cn/web/html/content_categories/index.md b/files/zh-cn/web/html/content_categories/index.md
index eff42fb08f0fec..07b3bf51095a8c 100644
--- a/files/zh-cn/web/html/content_categories/index.md
+++ b/files/zh-cn/web/html/content_categories/index.md
@@ -17,7 +17,7 @@ l10n:
> **备注:** 对这些内容类别及其功能的更详细的讨论超出了本文的范围;如果你向了解这些内容,请阅读 [HTML 规范的相关部分](https://html.spec.whatwg.org/multipage/dom.html#kinds-of-content)。
-[![显示各种内容类别相互之间是如何关联的维恩图。后面的部分以文本形式解释这些关系。](content_categories_venn.png)](/zh-CN/docs/Web/HTML/Content_categories/content_categories_venn.png)
+![显示各种内容类别相互之间是如何关联的维恩图。后面的部分以文本形式解释这些关系。](content_categories_venn.png)
## 主内容分类
diff --git a/files/zh-cn/web/media/formats/video_codecs/index.md b/files/zh-cn/web/media/formats/video_codecs/index.md
index 3d17c022d13152..8f1856d7a76939 100644
--- a/files/zh-cn/web/media/formats/video_codecs/index.md
+++ b/files/zh-cn/web/media/formats/video_codecs/index.md
@@ -293,7 +293,7 @@ slug: Web/Media/Formats/Video_codecs
有损压缩算法会引入[**振铃效应**](https://zh.wikipedia.org/wiki/振鈴效應),即对象外部区域被压缩算法生成的彩色像素污染的效果。当算法使用跨越对象与其背景之间的清晰边界的块时,就会发生这种情况。这在较高的压缩级别下尤其常见。
-[![振铃效应示例](ringing-effects.png)](ringing-effects.png)
+![振铃效应示例](ringing-effects.png)
请注意上方星星边缘周围的蓝色和粉红色条纹(以及步进和其他重要的压缩伪影)。那些边缘是振铃效应。振铃效应在某些方面类似于[飞蚊噪声](#飞蚊噪声),除了振铃效果或多或少稳定不变,而蚊子噪音闪烁和移动。
@@ -303,7 +303,7 @@ slug: Web/Media/Formats/Video_codecs
**分色**发生在压缩导致渐变中颜色细节丢失时。图像不是通过区域中的各种颜色进行平滑过渡,而是呈现为块状的,带有接近图像原始外观的颜色斑点。
-[![](posterize-effect.jpg)](posterize-effect.jpg)
+![分辨率模糊的秃鹰照片。](posterize-effect.jpg)
请注意上面照片中秃鹰(以及背景中的雪鸮)羽毛中颜色的块状。由于这些后化鬼影,在很大程度上丢失了羽毛的细节。
@@ -311,7 +311,7 @@ slug: Web/Media/Formats/Video_codecs
**轮廓**或**色带**是一种特殊的分色形式,其中色块在图像中形成条带或条纹。当视频使用了低精度的量化配置进行编码时,就会发生这种情况。压缩后的视频的内容中呈现出“分层”的外观,其中不是平滑的渐变和过渡,而是从颜色到颜色的过渡是突然的,导致出现色条。
-[![压缩引入轮廓的图像示例](contouring-effect.jpg)](contouring-effect.jpg)
+![压缩引入轮廓的图像示例](contouring-effect.jpg)
在上面的示例图像中,请注意天空如何具有不同深浅的蓝色带,而不是随着天空颜色向地平线变化而形成一致的渐变。这就是轮廓效果。
@@ -319,7 +319,7 @@ slug: Web/Media/Formats/Video_codecs
**飞蚊噪声**是一种时间鬼影,表现为噪声或**边缘繁忙**,表现为闪烁的朦胧或闪烁,大致跟随在具有硬边缘或前景对象和背景之间的尖锐过渡的对象的边缘之外。效果在外观上可能类似于[振铃效应](#振铃效应)。
-![](mosquito-effect-sm.png)
+![因压缩而引入飞蚊噪声的图像示例。](mosquito-effect-sm.png)
上面的照片显示了许多地方的飞蚊噪音,包括在桥梁周围的天空中。在右上角,插图显示了图像中出现蚊子噪声的部分的特写。
From a035b7633cc7b1ddea0e8ec2448b736b31a320ff Mon Sep 17 00:00:00 2001
From: Jongha Kim
Date: Fri, 26 Jul 2024 11:53:08 +0900
Subject: [PATCH 047/185] =?UTF-8?q?[ko]=20Math.cosh()=20=EC=8B=A0=EA=B7=9C?=
=?UTF-8?q?=20=EB=B2=88=EC=97=AD=20=EC=99=B8=20(#22556)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* [ko] Math.cosh() 신규 번역 외
- Math.cosh() 신규 번역
- Math.floor() 최신화
* 리뷰사항 수정
---
.../global_objects/math/cosh/index.md | 67 ++++++++
.../global_objects/math/floor/index.md | 153 +++++++++---------
2 files changed, 141 insertions(+), 79 deletions(-)
create mode 100644 files/ko/web/javascript/reference/global_objects/math/cosh/index.md
diff --git a/files/ko/web/javascript/reference/global_objects/math/cosh/index.md b/files/ko/web/javascript/reference/global_objects/math/cosh/index.md
new file mode 100644
index 00000000000000..f298ddbf65a255
--- /dev/null
+++ b/files/ko/web/javascript/reference/global_objects/math/cosh/index.md
@@ -0,0 +1,67 @@
+---
+title: Math.cosh()
+slug: Web/JavaScript/Reference/Global_Objects/Math/cosh
+l10n:
+ sourceCommit: 761b9047d78876cbd153be811efb1aa77b419877
+---
+
+{{JSRef}}
+
+**`Math.cosh()`** 정적 메서드는 숫자의 쌍곡 코사인을 반환합니다. 이는 아래와 같습니다.
+
+
+
+ 𝙼𝚊𝚝𝚑.𝚌𝚘𝚜𝚑 ( 𝚡 ) = cosh ( x ) = e x + e − x 2 \mathtt{\operatorname{Math.cosh}(x)} = \cosh(x) = \frac{\mathrm{e}^x + \mathrm{e}^{-x}}{2}
+
+
+
+{{EmbedInteractiveExample("pages/js/math-cosh.html")}}
+
+## 구문
+
+```js-nolint
+Math.cosh(x)
+```
+
+### 매개 변수
+
+- `x`
+ - : 숫자.
+
+### 반환 값
+
+`x`의 쌍곡 코사인.
+
+## 설명
+
+`Math`의 정적 메서드이기 때문에 `cosh()`는 생성한 `Math` 객체(`Math`는 생성자가 아닙니다)의 메서드를 사용하기보다는 언제나 `Math.cosh()`를 사용하세요.
+
+## 예제
+
+### Math.cosh() 사용하기
+
+```js
+Math.cosh(-Infinity); // Infinity
+Math.cosh(-1); // 1.5430806348152437
+Math.cosh(-0); // 1
+Math.cosh(0); // 1
+Math.cosh(1); // 1.5430806348152437
+Math.cosh(Infinity); // Infinity
+```
+
+## 명세서
+
+{{Specifications}}
+
+## 브라우저 호환성
+
+{{Compat}}
+
+## 같이 보기
+
+- [`core-js`에서의 `Math.cosh` 폴리필](https://github.com/zloirock/core-js#ecmascript-math)
+- {{jsxref("Math.acosh()")}}
+- {{jsxref("Math.asinh()")}}
+- {{jsxref("Math.atanh()")}}
+- {{jsxref("Math.sinh()")}}
+- {{jsxref("Math.tanh()")}}
diff --git a/files/ko/web/javascript/reference/global_objects/math/floor/index.md b/files/ko/web/javascript/reference/global_objects/math/floor/index.md
index ddd7cfdfacceae..b6d93afb3a826b 100644
--- a/files/ko/web/javascript/reference/global_objects/math/floor/index.md
+++ b/files/ko/web/javascript/reference/global_objects/math/floor/index.md
@@ -1,18 +1,20 @@
---
title: Math.floor()
slug: Web/JavaScript/Reference/Global_Objects/Math/floor
+l10n:
+ sourceCommit: 6a0f9553932823cd0c4dcf695d4b4813474964fb
---
{{JSRef}}
-**`Math.floor()`** 함수는 주어진 숫자와 같거나 작은 정수 중에서 가장 큰 수를 반환합니다.
+**`Math.floor()`** 정적 메서드는 언제나 버림 처리하고 주어진 숫자와 같거나 작은 정수 중에서 가장 큰 수를 반환합니다.
{{EmbedInteractiveExample("pages/js/math-floor.html")}}
## 구문
-```js
-Math.floor(x);
+```js-nolint
+Math.floor(x)
```
### 매개변수
@@ -22,100 +24,93 @@ Math.floor(x);
### 반환 값
-주어진 수 이하의 가장 큰 정수.
+`x`와 같거나 작은 정수 중 가장 큰 수. [`-Math.ceil(-x)`](/ko/docs/Web/JavaScript/Reference/Global_Objects/Math/ceil)와 같은 값입니다.
## 설명
-`floor()`는 `Math`의 정적 메서드이므로, 사용자가 생성한 `Math` 객체의 메서드로 호출할 수 없고 항상 `Math.floor()`를 사용해야 합니다. (`Math`는 생성자가 아닙니다)
-
-> **참고:** `Math.floor(null)`은 {{jsxref("NaN")}} 대신 0을 반환합니다.
+`floor()`는 `Math`의 정적 메서드이므로, 생성한 `Math` 객체(`Math`는 생성자가 아닙니다)의 메서드 보다는 항상 `Math.floor()`를 사용하세요.
## 예제
-### `Math.floor()` 사용하기
+### Math.floor() 사용하기
```js
-Math.floor(45.95); // 45
-Math.floor(45.05); // 45
-Math.floor(4); // 4
-Math.floor(-45.05); // -46
+Math.floor(-Infinity); // -Infinity
Math.floor(-45.95); // -46
+Math.floor(-45.05); // -46
+Math.floor(-0); // -0
+Math.floor(0); // 0
+Math.floor(4); // 4
+Math.floor(45.05); // 45
+Math.floor(45.95); // 45
+Math.floor(Infinity); // Infinity
```
### 십진수 조절
-```js
-// Closure
-(function () {
- /**
- * 십진수 조절
- *
- * @param {String} type 조정 타입.
- * @param {Number} value 숫자.
- * @param {Integer} exp 지수 (10 로그의 조정값).
- * @returns {Number} 조정값
- */
- function decimalAdjust(type, value, exp) {
- // exp가 undefined 또는 0인 경우...
- if (typeof exp === "undefined" || +exp === 0) {
- return Math[type](value);
- }
- value = +value;
- exp = +exp;
- // 값이 숫자가 아니거나 정수형이 아닌 경우...
- if (isNaN(value) || !(typeof exp === "number" && exp % 1 === 0)) {
- return NaN;
- }
- // Shift
- value = value.toString().split("e");
- value = Math[type](+(value[0] + "e" + (value[1] ? +value[1] - exp : -exp)));
- // Shift back
- value = value.toString().split("e");
- return +(value[0] + "e" + (value[1] ? +value[1] + exp : exp));
- }
+이 예시에서, 우리는 `Math.floor()`, `Math.ceil()`, 그리고 `Math.round()`를 확장한 메서드인 `decimalAdjust()`를 구현합니다. 세 가지 `Math` 함수가 항상 입력을 정수 단위로 조정하는 반면, `decimalAdjust`는 숫자를 조정해야 하는 소수점 왼쪽의 자릿수를 지정하는 `exp` 매개변수를 받습니다. 예를 들어, `-1`은 소수점 이후 한 자리를 남긴다는 의미입니다 ("× 10-1 "와 같이). 또한, `type` 매개변수를 통해 조정 방식 - `round`, `floor`, 또는 `ceil` - 을 선택할 수 있습니다.
- // 십진수 round
- if (!Math.round10) {
- Math.round10 = function (value, exp) {
- return decimalAdjust("round", value, exp);
- };
- }
- // 십진수 floor
- if (!Math.floor10) {
- Math.floor10 = function (value, exp) {
- return decimalAdjust("floor", value, exp);
- };
+이는 숫자에 10의 거듭제곱을 곱한 다음, 결과를 가장 가까운 정수로 반올림하고, 그 다음 10의 거듭제곱으로 나누는 방식으로 작동합니다. 정밀도를 더 잘 유지하기 위해, 이 방법은 Number의 [`toString()`](/ko/docs/Web/JavaScript/Reference/Global_Objects/Number/toString) 메서드를 활용합니다. 이 메서드는 큰 숫자나 작은 숫자를 과학적 표기법(예: `6.02e23`)으로 표현합니다.
+
+```js
+/**
+ * 명시된 자리수의 숫자 조정하기
+ *
+ * @param {"round" | "floor" | "ceil"} type 조정의 유형.
+ * @param {number} value 숫자 값.
+ * @param {number} exp 지수(조정 기준의 10 로그)입니다.
+ * @returns {number} 조정된 값.
+ */
+function decimalAdjust(type, value, exp) {
+ type = String(type);
+ if (!["round", "floor", "ceil"].includes(type)) {
+ throw new TypeError(
+ "The type of decimal adjustment must be one of 'round', 'floor', or 'ceil'.",
+ );
}
- // 십진수 ceil
- if (!Math.ceil10) {
- Math.ceil10 = function (value, exp) {
- return decimalAdjust("ceil", value, exp);
- };
+ exp = Number(exp);
+ value = Number(value);
+ if (exp % 1 !== 0 || Number.isNaN(value)) {
+ return NaN;
+ } else if (exp === 0) {
+ return Math[type](value);
}
-})();
-
-// Round
-Math.round10(55.55, -1); // 55.6
-Math.round10(55.549, -1); // 55.5
-Math.round10(55, 1); // 60
-Math.round10(54.9, 1); // 50
-Math.round10(-55.55, -1); // -55.5
-Math.round10(-55.551, -1); // -55.6
-Math.round10(-55, 1); // -50
-Math.round10(-55.1, 1); // -60
-// Floor
-Math.floor10(55.59, -1); // 55.5
-Math.floor10(59, 1); // 50
-Math.floor10(-55.51, -1); // -55.6
-Math.floor10(-51, 1); // -60
-// Ceil
-Math.ceil10(55.51, -1); // 55.6
-Math.ceil10(51, 1); // 60
-Math.ceil10(-55.59, -1); // -55.5
-Math.ceil10(-59, 1); // -50
+ const [magnitude, exponent = 0] = value.toString().split("e");
+ const adjustedValue = Math[type](`${magnitude}e${exponent - exp}`);
+ // 뒤로 이동
+ const [newMagnitude, newExponent = 0] = adjustedValue.toString().split("e");
+ return Number(`${newMagnitude}e${+newExponent + exp}`);
+}
+
+// 십진법 반올림
+const round10 = (value, exp) => decimalAdjust("round", value, exp);
+// 십진법 버림
+const floor10 = (value, exp) => decimalAdjust("floor", value, exp);
+// 십진법 올림
+const ceil10 = (value, exp) => decimalAdjust("ceil", value, exp);
+
+// 반올림
+round10(55.55, -1); // 55.6
+round10(55.549, -1); // 55.5
+round10(55, 1); // 60
+round10(54.9, 1); // 50
+round10(-55.55, -1); // -55.5
+round10(-55.551, -1); // -55.6
+round10(-55, 1); // -50
+round10(-55.1, 1); // -60
+// 버립
+floor10(55.59, -1); // 55.5
+floor10(59, 1); // 50
+floor10(-55.51, -1); // -55.6
+floor10(-51, 1); // -60
+// 올림
+ceil10(55.51, -1); // 55.6
+ceil10(51, 1); // 60
+ceil10(-55.59, -1); // -55.5
+ceil10(-59, 1); // -50
```
-## 명세
+## 명세서
{{Specifications}}
From 8ee1f23262098be83239b1e24253a87a07d19b70 Mon Sep 17 00:00:00 2001
From: Jongha Kim
Date: Fri, 26 Jul 2024 11:54:01 +0900
Subject: [PATCH 048/185] =?UTF-8?q?[ko]=20Intl.Locale.prototype.getCalenda?=
=?UTF-8?q?rs()=20=EC=8B=A0=EA=B7=9C=20=EB=B2=88=EC=97=AD=20(#22531)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* [ko] Intl.Locale.prototype.getCalendars() 신규 번역
- Intl.Locale.prototype.getCalendars() 신규 번역
* 리뷰 반영
---
.../intl/locale/getcalendars/index.md | 100 ++++++++++++++++++
1 file changed, 100 insertions(+)
create mode 100644 files/ko/web/javascript/reference/global_objects/intl/locale/getcalendars/index.md
diff --git a/files/ko/web/javascript/reference/global_objects/intl/locale/getcalendars/index.md b/files/ko/web/javascript/reference/global_objects/intl/locale/getcalendars/index.md
new file mode 100644
index 00000000000000..7109a1f4f37275
--- /dev/null
+++ b/files/ko/web/javascript/reference/global_objects/intl/locale/getcalendars/index.md
@@ -0,0 +1,100 @@
+---
+title: Intl.Locale.prototype.getCalendars()
+slug: Web/JavaScript/Reference/Global_Objects/Intl/Locale/getCalendars
+l10n:
+ sourceCommit: 27180875516cc311342e74b596bfb589b7211e0c
+---
+
+{{JSRef}}
+
+{{jsxref("Intl.Locale")}} 인스턴스의 **`getCalendars()`** 메서드는 이 로케일에 대한 하나 이상의 고유한 캘린더 식별자 목록을 반환합니다.
+
+> **참고:** 일부 브라우저의 일부 버전에서는 이 메서드가 `calendars`라는 접근자 속성으로 구현되었습니다. 그러나 이 메서드는 접근할 때마다 새로운 배열을 반환하기 때문에 `locale.calendars === locale.calendars`가 `false`를 반환하는 상황을 방지하기 위해 이제 메서드로 구현되었습니다. 자세한 내용은 [브라우저 호환성 표](#브라우저_호환성)를 참조하세요.
+
+## 구문
+
+```js-nolint
+getCalendars()
+```
+
+### 매개변수
+
+없음.
+
+### 반환 값
+
+`Locale`에 일반적으로 사용되는 모든 달력을 나타내는 문자열 배열로, 내림차순 기본 설정으로 정렬됩니다. `Locale`에 이미 [`calender`](/ko/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale/calendar)가 있는 경우 반환된 배열에는 해당 단일 값이 포함됩니다.
+
+아래는 지원되는 캘린더 목록입니다.
+
+### 지원하는 달력 유형
+
+- `buddhist`
+ - : 태국 불교 달력
+- `chinese`
+ - : 전통 중국력
+- `coptic`
+ - : 콥트 달력
+- `dangi`
+ - : 전통 한국력
+- `ethioaa`
+ - : 에디오피아력, 아메테 알렘력 (기원전 약 5493년경)
+- `ethiopic`
+ - : 에디오피아력, 아메테 미흐렛력 (기원후 약 8년경)
+- `gregory`
+ - : 그레고리안력
+- `hebrew`
+ - : 전통 히브리력
+- `indian`
+ - : 인도력
+- `islamic`
+ - : 이슬람력
+- `islamic-umalqura`
+ - : 이슬람력, Umm al-Qura
+- `islamic-tbla`
+ - : 이슬람력, 표 형식 (윤년 [2,5,7,10,13,16,18,21,24,26,29] - 천문학적 기원)
+- `islamic-civil`
+ - : 이슬람력, 표 형식 (윤년 [2,5,7,10,13,16,18,21,24,26,29] - 민간 기원)
+- `islamic-rgsa`
+ - : 이슬람력, 사우디아라비아 달 관측법
+- `iso8601`
+ - : ISO 달력 (ISO 8601 달력 주 규칙을 사용한 그레고리안력)
+- `japanese`
+ - : 일본 제국력
+- `persian`
+ - : 페르시안력
+- `roc`
+ - : 민간용(계산식) 아랍 달력
+- `islamicc`
+ - : 민간용(계산식) 아랍 달력
+ > **경고:** `islamicc` 달력 키는 더 이상 사용하지 않습니다. `islamic-civil`를 사용해주세요.
+
+## 예제
+
+### 지원하는 달력 목록 얻기
+
+`Locale` 객체에 `calendar`가 없는 경우, `getCalendars()`는 주어진 `Locale`에 대해 일반적으로 사용되는 모든 캘린더를 나열합니다. `calendar`를 명시적으로 설정하는 예제는 [`calendar` 예제](/ko/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale/calendar#예제)를 참고하세요.
+
+```js
+const arEG = new Intl.Locale("ar-EG");
+console.log(arEG.getCalendars()); // ["gregory", "coptic", "islamic", "islamic-civil", "islamic-tbla"]
+```
+
+```js
+const jaJP = new Intl.Locale("ja-JP");
+console.log(jaJP.getCalendars()); // ["gregory", "japanese"]
+```
+
+## 명세서
+
+{{Specifications}}
+
+## 브라우저 호환성
+
+{{Compat}}
+
+## 같이 보기
+
+- {{jsxref("Intl.Locale")}}
+- [`Intl.Locale.prototype.calendar`](/ko/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale/calendar)
+- 유니코드 로케일 데이터 마크업 언어 명세에서의 [유니코드 달력 식별자](https://www.unicode.org/reports/tr35/#UnicodeCalendarIdentifier)
From 15114d628f019ffe86c40b73b1fdf44a589d62bc Mon Sep 17 00:00:00 2001
From: Vivi
Date: Fri, 26 Jul 2024 11:54:54 +0900
Subject: [PATCH 049/185] =?UTF-8?q?[ko]=20doublecolon=20view=20transition?=
=?UTF-8?q?=20old=20=EB=B2=88=EC=97=AD=20(#22522)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* [ko] doublecolon view transition old 번역
* [fix] lint
* Update files/ko/web/css/_doublecolon_view-transition-old/index.md
Co-authored-by: 1ilsang <1ilsang@naver.com>
---------
Co-authored-by: 1ilsang <1ilsang@naver.com>
---
.../_doublecolon_view-transition-old/index.md | 120 ++++++++++++++++++
1 file changed, 120 insertions(+)
create mode 100644 files/ko/web/css/_doublecolon_view-transition-old/index.md
diff --git a/files/ko/web/css/_doublecolon_view-transition-old/index.md b/files/ko/web/css/_doublecolon_view-transition-old/index.md
new file mode 100644
index 00000000000000..4d2f8e9350f60e
--- /dev/null
+++ b/files/ko/web/css/_doublecolon_view-transition-old/index.md
@@ -0,0 +1,120 @@
+---
+title: "::view-transition-old"
+slug: Web/CSS/::view-transition-old
+l10n:
+ sourceCommit: 722311032dbf520bf6aeba3d1f432aca38779ffd
+---
+
+{{CSSRef}}{{SeeCompatTable}}
+
+**`::view-transition-old`** [CSS](/ko/docs/Web/CSS) [의사 요소](/ko/docs/Web/CSS/Pseudo-elements)는 전환 이전의 상태를 나타내는 스냅샷, 즉 뷰 전환의 과거 뷰 상태를 나타냅니다.
+
+뷰 전환이 이루어지는 동안, `::view-transition-old` 는 [뷰 전환 의사 요소 트리](/ko/docs/Web/API/View_Transitions_API/Using#the_view_transition_pseudo-element_tree) 에 기술된 것처럼 연관된 의사 요소 트리에 포함됩니다. 이는 {{cssxref("::view-transition-image-pair")}} 의 자식 요소로만 존재하고, 다른 자식 요소는 가질 수 없습니다.
+
+이 속성은 재배치된 요소이기 때문에, {{cssxref("object-fit")}} 와 {{cssxref("object-position")}} 같은 속성으로 조작할 수 있습니다. 이 요소의 자연 치수는 콘텐츠의 크기와 동일합니다.
+
+UA 스타일시트에서 다음과 같은 스타일을 기본으로 부여 받습니다.
+
+```css
+:root::view-transition-old(*),
+:root::view-transition-new(*) {
+ position: absolute;
+ inset-block-start: 0;
+ inline-size: 100%;
+ block-size: auto;
+
+ animation-duration: inherit;
+ animation-fill-mode: inherit;
+ animation-delay: inherit;
+}
+
+/* 2개의 이미지가 존재할 때 블렌딩을 위한 키프레임 */
+@keyframes -ua-mix-blend-mode-plus-lighter {
+ from {
+ mix-blend-mode: plus-lighter;
+ }
+ to {
+ mix-blend-mode: plus-lighter;
+ }
+}
+
+@keyframes -ua-view-transition-fade-out {
+ to {
+ opacity: 0;
+ }
+}
+```
+
+> **참고:** 추가적인 뷰 전환 스타일은 `::view-transition-old` 의 애니메이션을 설정할 수 있습니다. 뷰 전환 스타일은 뷰 전환이 이루어지는 동안 동적으로 생성됩니다. 더 많은 정보는 [전환 의사 요소 설정](https://drafts.csswg.org/css-view-transitions-1/#setup-transition-pseudo-elements)과 [의사 요소 스타일 업데이트](https://drafts.csswg.org/css-view-transitions-1/#update-pseudo-element-styles) 섹션 명세서를 참고하여 확인할 수 있습니다.
+
+## 구문
+
+```css-nolint
+::view-transition-old() {
+ /* ... */
+}
+```
+
+`` 는 다음 값들을 가질 수 있습니다.
+
+- `*`
+ - : 의사 요소를 모든 뷰 전환 그룹에 대해 일치하도록 합니다.
+- `root`
+ - : 의사 요소를 사용자 에이전트가 생성한 기본 `root` 뷰 전환 스냅샷 그룹과 일치하도록 합니다. 이 그룹은 페이지 전체의 뷰 전환을 포함하고, {{cssxref("view-transition-name")}} 속성을 통해 고유한 뷰 전환 스냅샷 그룹에 할당되지 않은 모든 요소를 포함합니다.
+- {{cssxref("custom-ident")}}
+ - : {{cssxref("view-transition-name")}} 속성을 통해 의사 요소를 주어진 {{cssxref("custom-ident")}} 로부터 할당받아 생성된 특정 뷰 전환 스냅샷 그룹과 일치하도록 합니다.
+
+## 예제
+
+```css
+figcaption {
+ view-transition-name: figure-caption;
+}
+
+@keyframes grow-x {
+ from {
+ transform: scaleX(0);
+ }
+ to {
+ transform: scaleX(1);
+ }
+}
+
+@keyframes shrink-x {
+ from {
+ transform: scaleX(1);
+ }
+ to {
+ transform: scaleX(0);
+ }
+}
+
+::view-transition-old(figure-caption),
+::view-transition-new(figure-caption) {
+ height: auto;
+ right: 0;
+ left: auto;
+ transform-origin: right center;
+}
+
+::view-transition-old(figure-caption) {
+ animation: 0.25s linear both shrink-x;
+}
+
+::view-transition-new(figure-caption) {
+ animation: 0.25s 0.25s linear both grow-x;
+}
+```
+
+## 명세서
+
+{{Specifications}}
+
+## 브라우저 호환성
+
+{{Compat}}
+
+## 같이 보기
+
+- [뷰 전환 API](/ko/docs/Web/API/View_Transitions_API)
+- [뷰 전환 API와 부드럽고 간단한 트랜지션](https://developer.chrome.com/docs/web-platform/view-transitions/)
From 313a2d23686670a6ab455c1cc86daf525ee0356b Mon Sep 17 00:00:00 2001
From: Tianyi Tao
Date: Fri, 26 Jul 2024 12:37:19 +0800
Subject: [PATCH 050/185] [zh-cn]: update the translation of "What is a Domain
Name?" (#21029)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: A1lo
---
.../what_is_a_domain_name/index.md | 160 ++++++++++--------
1 file changed, 89 insertions(+), 71 deletions(-)
diff --git a/files/zh-cn/learn/common_questions/web_mechanics/what_is_a_domain_name/index.md b/files/zh-cn/learn/common_questions/web_mechanics/what_is_a_domain_name/index.md
index ecc4bb2deecb00..1a157bde52f12a 100644
--- a/files/zh-cn/learn/common_questions/web_mechanics/what_is_a_domain_name/index.md
+++ b/files/zh-cn/learn/common_questions/web_mechanics/what_is_a_domain_name/index.md
@@ -1,154 +1,172 @@
---
title: 什么是域名?
slug: Learn/Common_questions/Web_mechanics/What_is_a_domain_name
+l10n:
+ sourceCommit: 9de3d03957f1d66f02f45400a6981372aa368c1f
---
{{QuicklinksWithSubPages("/zh-CN/docs/Learn/Common_questions")}}
-本文中我们讨论了域名是什么,域名是如何被构建的,以及如何获得一个域名。
-
前提:
- 首先你得知道
- 互联网是怎么工作的
- 并理解
- 什么是 URL 。
+ >并理解什么是 URL 。
目标:
- 学习域名是什么,域名的工作方式,以及域名的重要性。
+ 学习域名是什么、域名的工作方式,以及域名的重要性。
## 概述
-域名(Domain names)是互联网基础架构的关键部分。它们为互联网上任何可用的网页服务器提供了方便人类理解的地址。
+域名(Domain name)是互联网基础架构的关键部分。它们为互联网上任何可用的 Web 服务器提供了方便人类理解的地址。
-任何连上互联网的电脑都可以通过一个公共{{Glossary("IP")}}地址访问到,对于 IPv4 地址来说,这个地址有 32 位(它们通常写成四个范围在 0\~255 以内,由点分隔的数字组成,比如 173.194.121.32),而对于 IPv6 来说,这个地址有 128 位,通常写成八组由冒号分隔的四个十六进制数 (e.g., `2027:0da8:8b73:0000:0000:8a2e:0370:1337`). 计算机可以很容易地处理这些 IP 地址,但是对一个人来说很难找出谁在操控这些服务器以及这些网站提供什么服务。IP 地址很难记忆而且可能会随着时间的推移发生改变。为了解决这些问题,我们使用方便记忆的地址,称作域名。
+任何连上互联网的电脑都可以通过一个公共 {{Glossary("IP Address", "IP 地址")}}访问到,可以 IPv4 地址(例如,`192.0.2.172`)或 IPv6 地址(例如,`2001:db8:8b73:0000:0000:8a2e:0370:1337`)。
-## 自主学习
+计算机可以很容易地处理这些 IP 地址,但是对一个人来说很难找出谁在操控这些服务器以及这些网站提供什么服务。IP 地址很难记忆而且可能会随着时间的推移发生改变。
-_还没有可用的资料。[请考虑贡献一个](/zh-CN/docs/MDN/Community/Contributing/Getting_started)。_
+为了解决这些问题,我们使用人类可读的地址,称作域名。
## 深入探索
### 域名的结构
-一个域名是由几部分(有可能只是一部分,也许是两部分,三部分...)组成的简单结构,它被点分隔,不同于中文书写顺序,它**需要从右到左阅读**。
+一个域名是由几部分(有可能只有一部分、两部分、三部分……)组成的简单结构,以点分隔,并**从右到左阅读**:
-![Anatomy of the MDN domain name](structure.png)
+![MDN 域名剖析](structure.png)
域名的每一部分都提供着特定信息。
-{{Glossary("TLD")}} (Top-Level Domain,顶级域名)
+- {{Glossary("TLD")}}(Top-Level Domain,顶级域名)
+
+ - : 顶级域名可以告诉用户域名所提供的服务的一般目的。最通用的顶级域名(`.com`、`.org`、`.net`)不需要 Web 服务满足特定的标准,但一些顶级域名则执行更严格的政策(因此它们的目的更加明确)。比如:
+
+ - 地区的顶级域名,如 `.us`、`.fr` 或 `.sh`,可以要求必须提供给定语言的服务或者托管在指定国家——它们应该表示特定语言或国家的资源。
+ - 包含 `.gov` 的顶级域名只能被政府部门使用。
+ - `.edu` 顶级域名只能为教育或学术机构使用。
+
+ 顶级域名既可以包含拉丁字母,也可以包含特殊字符。顶级域名最长可以达到 63 个字符,虽然大多数都是两到三个字符。
-顶级域名可以告诉用户域名所提供的服务类型。最通用的顶级域名(.com, .org, .net)不需要 web 服务器满足严格的标准,但一些顶级域名则执行更严格的政策。比如:
+ 顶级域名的完整列表[由 ICANN 维护](https://www.icann.org/resources/pages/tlds-2012-02-25-en)。
-- 地区的顶级域名,如.us,.fr,或.sh,可以要求必须提供给定语言的服务器或者托管在指定国家。这些 TLD 通常表明对应的网页服务从属于何种语言或哪个地区。
-- 包含.gov 的顶级域名只能被政府部门使用。
-- .edu 只能为教育或研究机构使用。
+- 标签(或组成部分)
-顶级域名既可以包含拉丁字母,也可以包含特殊字符。顶级域名最长可以达到 63 个字符,不过为了使用方便,大多数顶级域名都是两到三个字符。
+ - : 标签都是紧随着 TLD 的。标签由 1 到 63 个大小写不敏感的字符组成,这些字符包含字母 `A` 到 `z`、数字 `0` 到 `9`,甚至“-”这个符号(当然,“-”不应该出现在标签开头或者标签的结尾)。`a`、`97` 和 `hello-strange-person-16-how-are-you` 都是有效的示例标签。
-顶级域名的完整列表是[ICANN](https://www.icann.org/resources/pages/tlds-2012-02-25-en)维护的。
+ 刚好位于 TLD 前面的标签也被称为*二级域名*(SLD)。
-- 标签 (或者说是组件)
- - : 标签都是紧随着 TLD 的。标签由 1 到 63 个大小写不敏感的字符组成,这些字符包含字母 A-z,数字 0-9,甚至“-”这个符号(当然,“-”不应该出现在标签开头或者标签的结尾)。举几个例子,`a`,`97`,或者 `hello-strange-person-16-how-are-you` 都是合法的标签。
-- Secondary Level Domain, 二级域名
- - : 刚好位于 TLD 前面的标签也被称为二级域名 (SLD)。一个域名可以有多个标签(或者说是组件),没有强制规定必须要 3 个标签来构成域名。例如,www\.inf.ed.ac.uk 是一个正确的域名。当拥有了“上级”部分 (例如 [mozilla.org](https://mozilla.org)),你还可以创建另外的域名 (有时被称为 "子域名") (例如 [developer.mozilla.org](/)).
+ 一个域名可以有多个标签(或组成部分)。没有强制规定必须要 3 个标签来构成域名。例如,[informatics.ed.ac.uk](https://informatics.ed.ac.uk/) 是一个有效的域名。对于任何由你控制的域名(例如 [mozilla.org](https://mozilla.org)),你可以创建包含不同内容的“子域名”(例如 [developer.mozilla.org](/)、[iot.mozilla.org](https://iot.mozilla.org/) 或 [bugzilla.mozilla.org](https://bugzilla.mozilla.org))。
### 购买域名
#### 谁拥有域名?
-你不能真正地“购买一个域名”,你只能花钱获得一个域名在一年或多年内的使用权。不过你可以延长你的使用权,同时你的续期将优先于其他人的使用申请。但你从来都没有拥有过域名。
+你不能真正地“购买一个域名”。这样做是为了让未使用的域名最终可以重新被其他人使用。如果每个域名都被购买,那么 Web 很快就会充满未使用的、被锁定且无法被任何人使用的域名。
-被称为域名注册商的公司通过域名登记来记录连接你和你的域名的技术与管理信息。
+不过你可用花钱获得一个域名在一年或多年内的使用权。你可以延长你的使用权,同时你的续期将优先于其他人的申请。但你从来都没有拥有过域名。
-> **备注:** 对于一些域名,它可能不归属于某个域名注册商来负责记录。比如说,每个在.fire 下的域名由 Amazon 管理。
+被称为域名注册商的公司通过域名注册来记录连接你和你的域名的技术与管理信息。
+
+> [!NOTE]
+> 对于一些域名,它可能不归属于某个域名注册商来负责记录。比如说,每个在 `.fire` 下的域名由 Amazon 管理。
#### 找个可用的域名
想要知道一个给定的域名是否可用,
-- 去域名注册商的网站。它们大多会提供"whois"服务,告诉你一个域名是否可用。
-- 另外,如果你使用系统的内置 shell,可以在里面输入 whois 命令,下面显示的是 mozilla.org 网站的结果:
+- 去域名注册商的网站。它们大多会提供“whois”服务,告诉你一个域名是否可用。
+- 另外,如果你使用系统的内置 shell,可以在里面输入 `whois` 命令,下面显示的是 `mozilla.org` 的结果:
+
+ ```bash
+ whois mozilla.org
+ ```
+
+ 输出如下:
+
+ ```plain
+ Domain Name:MOZILLA.ORG
+ Domain ID: D1409563-LROR
+ Creation Date: 1998-01-24T05:00:00Z
+ Updated Date: 2013-12-08T01:16:57Z
+ Registry Expiry Date: 2015-01-23T05:00:00Z
+ Sponsoring Registrar:MarkMonitor Inc. (R37-LROR)
+ Sponsoring Registrar IANA ID: 292
+ WHOIS Server:
+ Referral URL:
+ Domain Status: clientDeleteProhibited
+ Domain Status: clientTransferProhibited
+ Domain Status: clientUpdateProhibited
+ Registrant ID:mmr-33684
+ Registrant Name:DNS Admin
+ Registrant Organization:Mozilla Foundation
+ Registrant Street: 650 Castro St Ste 300
+ Registrant City:Mountain View
+ Registrant State/Province:CA
+ Registrant Postal Code:94041
+ Registrant Country:US
+ Registrant Phone:+1.6509030800
+ ```
+
+正如你所见,我不能注册 `mozilla.org`,因为 Mozilla 基金会已经注册它了。
+
+另外,如果你想看看我能不能注册 `afunkydomainname.org`:
```bash
-$ whois mozilla.org
-Domain Name:MOZILLA.ORG
-Domain ID: D1409563-LROR
-Creation Date: 1998-01-24T05:00:00Z
-Updated Date: 2013-12-08T01:16:57Z
-Registry Expiry Date: 2015-01-23T05:00:00Z
-Sponsoring Registrar:MarkMonitor Inc. (R37-LROR)
-Sponsoring Registrar IANA ID: 292
-WHOIS Server:
-Referral URL:
-Domain Status: clientDeleteProhibited
-Domain Status: clientTransferProhibited
-Domain Status: clientUpdateProhibited
-Registrant ID:mmr-33684
-Registrant Name:DNS Admin
-Registrant Organization:Mozilla Foundation
-Registrant Street: 650 Castro St Ste 300
-Registrant City:Mountain View
-Registrant State/Province:CA
-Registrant Postal Code:94041
-Registrant Country:US
-Registrant Phone:+1.6509030800
+whois afunkydomainname.org
```
-正如你所见,我不能注册`mozilla.org`,因为 Mozilla 基金会已经注册它了。
-
-另外,如果你想看看我能不能注册`afunkydomainname.org`:
+输出如下(在撰写本文时):
-```bash
-$ whois afunkydomainname.org
+```plain
NOT FOUND
```
-正如你所见,(在本文写作时)这个域名在 whois 数据库中不存在,所以我们可以要求去注册它。祝你好运吧!
+正如你所见,这个域名在 `whois` 数据库中不存在,所以我们可以要求去注册它。祝你好运吧!
#### 获得一个域名
过程很简单:
1. 去域名注册商的网站。
-2. 通常那些网站上都有突出的"获得域名"宣传,点击它。
-3. 按要求仔细填表。一定要**仔细检查**你是否有将你想要的域名拼错。一旦你给错误域名付款了,便为时已晚!
+2. 通常那些网站上都有突出的“获得域名”宣传,点击它。
+3. 按要求仔细填表。特别是要确保你没有将你想要的域名拼错。一旦付款,便为时已晚!
4. 注册商将会在域名正确注册后通知你。数小时之内,所有 DNS 服务器都会收到你的 DNS 信息。
-> **备注:** 在这个过程中注册商会要求你的真实住址。请保证你正确地填写了,因为在一些国家,如果你没有提供合法的地址,注册商会关闭你的域名。
+> [!NOTE]
+> 在这个过程中注册商会要求你的真实地址。请保证你正确地填写了,因为在一些国家,如果你没有提供有效的地址,注册商会关闭你的域名。
#### DNS 刷新
-DNS 数据库存储在全球每个 DNS 服务器上,所有这些服务器都源于 (refer to) 几个被称为“权威名称服务器”或“顶级 DNS 服务器”。只要你的注册商创建或更新给定域名的任何信息,信息就必须在每个 DNS 数据库中刷新。知道给定域名的每个 DNS 服务器都会存储一段时间的信息,然后再次刷新(DNS 服务器再次查询权威服务器)。因此,知道此域名的 DNS 服务器需要一些时间才能获取最新信息。
+DNS 数据库存储在全球每个 DNS 服务器上,所有这些服务器都源于(refer to)几个被称为“权威名称服务器”或“顶级 DNS 服务器”的特殊服务器——它们就像管理系统的主服务器。
-> **备注:** 这个时间一般被称为**传播时间**。然而这个术语是不精准的,因为更新本身没有传播 (top → down)。被你电脑 (down) 查询的 DNS 服务器只在他需要的时候才从权威服务器 (top) 中获取信息。
+每当你的注册商为特定域名创建或更新任何信息时,该信息必须在每个 DNS 数据库中刷新。知道特定域名的每个 DNS 服务器在自动失效并刷新之前都会存储其信息一段时间(DNS 服务器会查询权威服务器,并从中获取更新的信息)。因此,对于知道此域名的 DNS 服务器来说,获取最新信息需要一些时间。
### DNS 请求如何工作?
正如我们所看到的,当你想在浏览器中展示一个网页的时候,输入域名比输入 IP 简单多了。让我们看一下这个过程:
-1. 在你的浏览器地址栏输入`mozilla.org`。
-2. 你的浏览器询问你的计算机是否已经识别此域名所确定的 IP 地址(使用本地 DNS 缓存)。如果是的话,这个域名被转换为 IP 地址,然后浏览器与网络服务器交换内容。结束。
-3. 如果你的电脑不知道 `mozilla.org` 域名背后的 IP, 它会询问一个 DNS 服务器,这个服务器的工作就是告诉你的电脑已经注册的域名所匹配的 IP。
-4. 现在电脑知道了要请求的 IP 地址,你的浏览器能够与网络服务器交换内容。
+1. 在你的浏览器地址栏输入 `mozilla.org`。
+2. 你的浏览器询问你的计算机是否已经识别此域名所确定的 IP 地址(使用本地 DNS 缓存)。如果是的话,这个域名被转换为 IP 地址,然后浏览器与 Web 服务器协商内容。结束。
+3. 如果你的电脑不知道 `mozilla.org` 域名背后的 IP,它会询问 DNS 服务器,这个服务器的工作就是告诉你的电脑已经注册的域名所匹配的 IP。
+4. 现在电脑知道了要请求的 IP 地址,你的浏览器能够与 Web 服务器协商内容。
-![Explanation of the steps needed to obtain the result to a DNS request](2014-10-dns-request2.png)
+![获取 DNS 请求结果所需步骤的说明](2014-10-dns-request2.png)
## 下一步
好了,我们讲了许多有关的步骤和结构。接下来。
-- 如果你想亲自实践,现在最好开始深入设计和探索 [对一个网页的剖析](/zh-CN/docs/Learn/Common_questions/Design_and_accessibility/Common_web_layouts)。
-- 关于建站需要的花销这类问题的讨论也是有价值的。请参考 [建站需要花费多少钱](/zh-CN/docs/Learn/Common_questions/Tools_and_setup/How_much_does_it_cost)。
-- 或者在维基百科上阅读更多关于 [域名](http://en.wikipedia.org/wiki/Domain_name)。
+- 如果你想亲自实践,现在最好开始深入设计和探索[网页的结构](/zh-CN/docs/Learn/Common_questions/Design_and_accessibility/Common_web_layouts)。
+- 关于建站需要的花销这类问题的讨论也是有价值的。请参考[建站需要花费多少钱](/zh-CN/docs/Learn/Common_questions/Tools_and_setup/How_much_does_it_cost)。
+- 或者在维基百科上阅读更多关于[域名](https://zh.wikipedia.org/wiki/域名)。
+- 你也可以在[这里](https://howdns.works/)找到有关 DNS 工作原理的有趣且丰富多彩的解释。
From 422d7b5709f93eb6b7cb8070ee9fd28739627e56 Mon Sep 17 00:00:00 2001
From: Tianyi Tao
Date: Fri, 26 Jul 2024 12:52:04 +0800
Subject: [PATCH 051/185] [zh-cn]: update the translation of
`CanvasRenderingContext2D.shadowColor` property (#21964)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: A1lo
---
.../shadowcolor/index.md | 77 +++++++++++++++----
1 file changed, 64 insertions(+), 13 deletions(-)
diff --git a/files/zh-cn/web/api/canvasrenderingcontext2d/shadowcolor/index.md b/files/zh-cn/web/api/canvasrenderingcontext2d/shadowcolor/index.md
index b984ebb1eeffe4..fdc10b09a92b9e 100644
--- a/files/zh-cn/web/api/canvasrenderingcontext2d/shadowcolor/index.md
+++ b/files/zh-cn/web/api/canvasrenderingcontext2d/shadowcolor/index.md
@@ -1,26 +1,28 @@
---
-title: CanvasRenderingContext2D.shadowColor
+title: CanvasRenderingContext2D:shadowColor 属性
slug: Web/API/CanvasRenderingContext2D/shadowColor
+l10n:
+ sourceCommit: c7edf2734fccb185c5e93ee114ea3d5edc0177b5
---
{{APIRef}}
-**`CanvasRenderingContext2D.shadowColor`** 是 Canvas 2D API 描述阴影颜色的属性。
+Canvas 2D API 的 **`CanvasRenderingContext2D.shadowColor`** 属性用于描述阴影颜色。
-## 语法
+请注意,在进行填充时,阴影的渲染不透明度会受到 {{domxref("CanvasRenderingContext2D.fillStyle", "fillStyle")}} 颜色的不透明度的影响;或在进行描边时,受到 {{domxref("CanvasRenderingContext2D.strokeStyle", "strokeStyle")}} 颜色的不透明度的影响。
-```
-ctx.shadowColor = color;
-```
+> [!NOTE]
+> 只有当 `shadowColor` 属性设置为非透明值时,阴影才会被绘制。其中的 {{domxref("CanvasRenderingContext2D.shadowBlur", "shadowBlur")}}、{{domxref("CanvasRenderingContext2D.shadowOffsetX", "shadowOffsetX")}} 或 {{domxref("CanvasRenderingContext2D.shadowOffsetY", "shadowOffsetY")}} 属性中至少有一个必须是非零的。
-- `color`
- - : 可以转换成 CSS {{cssxref("<color>")}} 值的{{domxref("DOMString")}} 字符串。默认值是 fully-transparent black.
+## 值
+
+一个被解析为 [CSS](/zh-CN/docs/Web/CSS) {{cssxref("<color>")}} 值的字符串。默认值是完全透明的黑色。
## 示例
### 为形状添加阴影
-这是一段简单的代码片段,使用 `shadowColor` 属性设置阴影的颜色。注意:shadowColor 属性设置成不透明的,并且 {{domxref("CanvasRenderingContext2D.shadowBlur", "shadowBlur")}}、 {{domxref("CanvasRenderingContext2D.shadowOffsetX", "shadowOffsetX")}} 或者 {{domxref("CanvasRenderingContext2D.shadowOffsetY", "shadowOffsetY")}} 属性不为 0,阴影才会被绘制。
+这个例子向两个正方形添加阴影;第一个是填充的,第二个是描边的。`shadowColor` 属性设置阴影的颜色,而 `shadowOffsetX` 和 `shadowOffsetY` 设置阴影相对于形状的位置。
#### HTML
@@ -34,15 +36,15 @@ ctx.shadowColor = color;
const canvas = document.getElementById("canvas");
const ctx = canvas.getContext("2d");
-// Shadow
+// 阴影
ctx.shadowColor = "red";
ctx.shadowOffsetX = 10;
ctx.shadowOffsetY = 10;
-// Filled rectangle
+// 填充的矩形
ctx.fillRect(20, 20, 100, 100);
-// Stroked rectangle
+// 描边的矩形
ctx.lineWidth = 6;
ctx.strokeRect(170, 20, 100, 100);
```
@@ -51,6 +53,44 @@ ctx.strokeRect(170, 20, 100, 100);
{{ EmbedLiveSample('为形状添加阴影', 700, 180) }}
+### 半透明形状上的阴影
+
+阴影的不透明度受其父对象透明级别的影响(即使 `shadowColor` 指定了完全不透明的值)。这个例子描绘并填充了一个带有半透明颜色的矩形。
+
+#### HTML
+
+```html
+
+```
+
+#### JavaScript
+
+填充矩形的阴影的 alpha 值为 `.8 * .2`,即 `.16`。描边矩形的阴影的 alpha 值为 `.8 * .6`,即 `.48`。
+
+```js
+const canvas = document.getElementById("canvas");
+const ctx = canvas.getContext("2d");
+
+// 阴影
+ctx.shadowColor = "rgba(255, 0, 0, 0.8)";
+ctx.shadowBlur = 8;
+ctx.shadowOffsetX = 30;
+ctx.shadowOffsetY = 20;
+
+// 填充的矩形
+ctx.fillStyle = "rgba(0, 255, 0, 0.2)";
+ctx.fillRect(10, 10, 150, 100);
+
+// 描边的矩形
+ctx.lineWidth = 10;
+ctx.strokeStyle = "rgba(0, 0, 255, 0.6)";
+ctx.strokeRect(10, 10, 150, 100);
+```
+
+#### 结果
+
+{{ EmbedLiveSample('半透明形状上的阴影', 700, 180) }}
+
## 规范
{{Specifications}}
@@ -59,6 +99,17 @@ ctx.strokeRect(170, 20, 100, 100);
{{Compat}}
+### WebKit/Blink 特定注意事项
+
+在基于 WebKit 和 Blink 的浏览器中,除了这个属性外,还实现了一个非标准且已废弃的方法 `ctx.setShadow()`。
+
+```js
+setShadow(width, height, blur, color, alpha);
+setShadow(width, height, blur, graylevel, alpha);
+setShadow(width, height, blur, r, g, b, a);
+setShadow(width, height, blur, c, m, y, k, a);
+```
+
## 参见
-- 接口定义,{{domxref("CanvasRenderingContext2D")}}.
+- 定义该属性的接口:{{domxref("CanvasRenderingContext2D")}}
From c384af416d288761295bb7028083001e316b1aa2 Mon Sep 17 00:00:00 2001
From: Tianyi Tao
Date: Fri, 26 Jul 2024 13:00:57 +0800
Subject: [PATCH 052/185] [zh-cn]: create the translation of
`CanvasRenderingContext2D.getContextAttribute()` method (#22001)
Co-authored-by: A1lo
---
.../getcontextattributes/index.md | 87 +++++++++++++++++++
1 file changed, 87 insertions(+)
create mode 100644 files/zh-cn/web/api/canvasrenderingcontext2d/getcontextattributes/index.md
diff --git a/files/zh-cn/web/api/canvasrenderingcontext2d/getcontextattributes/index.md b/files/zh-cn/web/api/canvasrenderingcontext2d/getcontextattributes/index.md
new file mode 100644
index 00000000000000..37486f050ea097
--- /dev/null
+++ b/files/zh-cn/web/api/canvasrenderingcontext2d/getcontextattributes/index.md
@@ -0,0 +1,87 @@
+---
+title: CanvasRenderingContext2D:getContextAttributes() 方法
+slug: Web/API/CanvasRenderingContext2D/getContextAttributes
+l10n:
+ sourceCommit: ba09b113ee91eee477894ef2ac028bbc63f480b5
+---
+
+{{APIRef("WebGL")}}
+
+**`CanvasRenderingContext2D.getContextAttributes()`** 方法返回一个包含上下文使用的属性的对象。
+
+请注意,使用 [`HTMLCanvasElement.getContext()`](/zh-CN/docs/Web/API/HTMLCanvasElement/getContext) 创建上下文时可能会请求上下文的属性,但实际支持和使用的属性可能会有所不同。
+
+## 语法
+
+```js-nolint
+getContextAttributes()
+```
+
+### 参数
+
+无。
+
+### 返回值
+
+一个 `CanvasRenderingContext2DSettings` 对象,包含实际的上下文参数。它包括以下成员:
+
+- `alpha` {{optional_inline}}
+ - : 一个布尔值,指示画布是否包含 alpha 通道。如果为 `false`,背景总是不透明的,这可以加快对透明内容和图像的绘制速度。
+- `colorSpace` {{optional_inline}}
+ - : 指定渲染上下文的色彩空间。可能的值有:
+ - `srgb`:表示 [sRGB 色彩空间](https://zh.wikipedia.org/wiki/SRGB)
+ - `display-p3`:表示 [Display-P3 色彩空间](https://zh.wikipedia.org/wiki/DCI-P3)
+- `desynchronized` {{optional_inline}}
+ - : 一个布尔值,指示用户代理通过将画布绘制周期与事件循环解耦,从而减少了延迟。
+- `willReadFrequently` {{optional_inline}}
+ - : 一个布尔值,指示该画布是否使用软件加速(而不是硬件加速)来支持通过 {{domxref("CanvasRenderingContext2D.getImageData", "getImageData()")}} 的频繁读取操作。
+
+## 示例
+
+此示例展示了如何在创建画布上下文时指定上下文属性,并调用 `getContextAttributes()` 方法来读取浏览器实际使用的参数。
+
+```html hidden
+
+```
+
+```js hidden
+const logElement = document.getElementById("log");
+function log(text) {
+ logElement.innerText += text;
+}
+```
+
+首先我们使用 [`HTMLCanvasElement.getContext()`](/zh-CN/docs/Web/API/HTMLCanvasElement/getContext) 创建一个上下文,仅指定一个上下文属性。
+
+```js
+let canvas = document.createElement("canvas");
+let ctx = canvas.getContext("2d", { alpha: false });
+```
+
+如果浏览器支持 `getContextAttributes()` 方法,则使用它来读取浏览器实际使用的属性(包括我们显式指定的属性):
+
+```js
+if (ctx.getContextAttributes) {
+ const attributes = ctx.getContextAttributes();
+ log(JSON.stringify(attributes));
+} else {
+ log("不支持 CanvasRenderingContext2D.getContextAttributes()");
+}
+```
+
+根据浏览器支持的属性,下面的日志应显示类似于 `{alpha: false, colorSpace: 'srgb', desynchronized: false, willReadFrequently: false}` 的字符串。
+
+{{EmbedLiveSample('示例','100%','50')}}
+
+## 规范
+
+{{Specifications}}
+
+## 浏览器兼容性
+
+{{Compat}}
+
+## 参见
+
+- [`HTMLCanvasElement.getContext()`](/zh-CN/docs/Web/API/HTMLCanvasElement/getContext)
+- [`WebGLRenderingContext.getContextAttributes()`](/zh-CN/docs/Web/API/WebGLRenderingContext/getContextAttributes)
From 84a257031b52c0b1526f4b0573f4f7f0165f91d2 Mon Sep 17 00:00:00 2001
From: hanyujie2002
Date: Fri, 26 Jul 2024 15:02:29 +0800
Subject: [PATCH 053/185] zh-cn: update translation of feature detection
(#22484)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: A1lo
---
.../feature_detection/index.md | 211 ++++--------------
1 file changed, 39 insertions(+), 172 deletions(-)
diff --git a/files/zh-cn/learn/tools_and_testing/cross_browser_testing/feature_detection/index.md b/files/zh-cn/learn/tools_and_testing/cross_browser_testing/feature_detection/index.md
index ac0fd560eefddb..b7b3daa943e11c 100644
--- a/files/zh-cn/learn/tools_and_testing/cross_browser_testing/feature_detection/index.md
+++ b/files/zh-cn/learn/tools_and_testing/cross_browser_testing/feature_detection/index.md
@@ -1,11 +1,13 @@
---
title: 实现特性检测
slug: Learn/Tools_and_testing/Cross_browser_testing/Feature_detection
+l10n:
+ sourceCommit: cde9330e9bbaddea72febf44dcc3a7db16fe1a11
---
{{LearnSidebar}}{{PreviousMenuNext("Learn/Tools_and_testing/Cross_browser_testing/Accessibility","Learn/Tools_and_testing/Cross_browser_testing/Automated_testing", "Learn/Tools_and_testing/Cross_browser_testing")}}
-特性检测涉及到确定浏览器是否支持某个代码块,并根据是否支持(或不支持)运行不同的代码,从而使浏览器能够始终提供工作体验,而不是在某些浏览器中崩溃/出错。本文详细介绍了如何编写自己的简单特性检测,如何使用库来加速实现,以及特性检测的本地功能,如 `@supports`。
+特性检测包括确定浏览器是否支持某个代码块,并根据支持(或不支持)运行不同的代码,这样浏览器就能始终提供正常的使用体验,而不会在某些浏览器中崩溃或出错。本文详细介绍了如何编写自己的简单特征检测、如何使用库加快实现速度,以及原生的特征检测特性(如 `@supports`)。
@@ -16,10 +18,10 @@ slug: Learn/Tools_and_testing/Cross_browser_testing/Feature_detection
href="/zh-CN/docs/Learn/CSS"
>CSS
- 以及 JavaScript 语言,对JavaScript 语言,了解顶层的跨浏览器测试 原则有充分了解。
+ >跨浏览器测试原则。
@@ -33,9 +35,9 @@ slug: Learn/Tools_and_testing/Cross_browser_testing/Feature_detection
## 特性检测的概念
-特性检测的思想是,你可以运行一个测试来确定当前浏览器是否支持某个特性,然后有条件地运行代码,以便在*支持*该特性的浏览器和*不支持*该特性的浏览器中提供可接受的体验,如果不这样做,在不支持你在代码中使用的特性的浏览器中将无法正确地显示你的网站,从而产生糟糕的用户体验。
+特性检测的理念在于,通过执行一个测试来确认当前浏览器是否支持某项特性。然后,根据测试结果有条件地执行代码,确保在*支持*该特性的浏览器和*不支持*的浏览器中都能提供一个可接受的用户体验。如果不采取这种做法,那么在那些不支持你代码中所用特性的浏览器上,你的网站将无法正确显示,从而导致糟糕的用户体验。
-让我们回顾一下,看看我们在[处理常见的 JavaScript 问题](/zh-CN/docs/Learn/Tools_and_testing/Cross_browser_testing/JavaScript#特性检测)中提到的例子——[地理位置 API](/zh-CN/docs/Web/API/Geolocation_API)(它暴露了网络浏览器所运行设备的可用位置数据)有其主要入口点。全局 [Navigator](/zh-CN/docs/Web/API/Navigator) 对象上有一个 `geolocation` 属性。因此,你可以通过使用类似以下的方法来检测浏览器是否支持地理位置:
+让我们回顾一下我们在[处理常见 JavaScript 问题](/zh-CN/docs/Learn/Tools_and_testing/Cross_browser_testing/JavaScript#特性检测)一文中提及的例子——[地理位置 API](/zh-CN/docs/Web/API/Geolocation_API)(它能够访问运行网页浏览器的设备的位置数据),其主要使用入口点是全局 [Navigator](/zh-CN/docs/Web/API/Navigator) 对象上的 `geolocation` 属性。因此,你可以使用类似以下的方法来检测浏览器是否支持地理位置特性:
```js
if ("geolocation" in navigator) {
@@ -43,41 +45,39 @@ if ("geolocation" in navigator) {
// 使用如 Google Maps API 显示地图上的位置
});
} else {
- // 为用户提供静态地图的选择
+ // 为用户提供静态地图
}
```
-要检测一个单一的特性,`if` 语句效果很好。对于复杂的应用,考虑使用一个成熟的特性检测库,而不是自己编写。Modernizr 是特性检测测试的工业标准,我们将在后面讲述一下。
-
-在我们继续之前,先说一件事——不要把特性检测和**浏览器嗅探**混淆起来(检测什么特定的浏览器在访问网站)——这是一种糟糕的做法,应该不惜一切代价加以阻止。参见[使用不良的浏览器嗅探代码](/zh-CN/docs/Learn/Tools_and_testing/Cross_browser_testing/JavaScript#使用不良的浏览器嗅探代码)以了解更多细节。
+在我们继续之前,先说一件事——不要把特性检测和**浏览器嗅探**(检测什么浏览器在访问网站)混淆起来——后者是一种糟糕的做法,应该不惜一切代价加以阻止。参见[不要嗅探浏览器](/zh-CN/docs/Learn/Tools_and_testing/Cross_browser_testing/JavaScript#不要嗅探浏览器)以了解更多细节。
## 撰写自己的特性检测代码
-在本节中,我们将研究如何在 CSS 和 JavaScript 中实现自己的特性检测测试。
+在本节中,我们将研究如何在 CSS 和 JavaScript 中实现特性检测测试。
### CSS
-你可以通过在 JavaScript 中测试 [_element.style.property_](/zh-CN/docs/Web/API/HTMLElement/style)(例如 `paragraph.style.rotate`)的存在来编写 CSS 特性测试。
+你可以通过在 JavaScript 中测试[_元素.style.属性_](/zh-CN/docs/Web/API/HTMLElement/style)(例如 `paragraph.style.rotate`)的存在来检测 CSS 特性。
-一个经典的例子可能是测试浏览器是否支持 [Subgrid](/zh-CN/docs/Web/CSS/CSS_grid_layout/Subgrid);对于支持 [`grid-template-columns`](/zh-CN/docs/Web/CSS/grid-template-columns) 和 [`grid-template-rows`](/zh-CN/docs/Web/CSS/grid-template-rows) 的 subgrid 值的浏览器,我们可以在布局上使用 subgrid。对于不使用 subgrid 的浏览器,我们可以使用普通的网格,它可以正常工作,但没有那么酷的外观。
+一个经典的例子可能是在浏览器中测试[子网格](/zh-CN/docs/Web/CSS/CSS_grid_layout/Subgrid)的支持情况。对于支持 [`grid-template-columns`](/zh-CN/docs/Web/CSS/grid-template-columns) 和 [`grid-template-rows`](/zh-CN/docs/Web/CSS/grid-template-rows) 属性的 `subgrid` 值的浏览器来说,我们可以在布局中使用子网格。对于不支持的浏览器,我们可以使用常规的网格布局,虽然不太酷,但也能正常工作。
-以此为例,如果支持该值,我们可以包含一个 subgrid 样式表,如果不支持,则包含一个普通网格样式表。为此,我们可以在 HTML 文件的头部包含两个样式表:一个是所有的样式表,另一个在不支持 subgrid 的情况下实现默认布局:
+以此为例,我们可用在支持该值的情况下包含子网格样式表,而在不支持的情况下包含常规网格样式表。要实现这一点,我们可以在 HTML 文件的 head 部分包含两个样式表:一个包含所有的样式,另一个在不支持子网格的情况下实现默认的布局。
```html
```
-这里,`basic-styling.css` 处理所有我们想给每个浏览器的样式。我们还有两个 CSS 文件,`grid-layout.css` 和 `subgrid-layout.css`,它们包含了我们想根据浏览器的支持程度有选择地应用的 CSS。
+这里,`basic-styling.css` 处理所有每个浏览器都支持的样式。我们还有两个额外的 CSS 文件,`grid-layout.css` 和 `subgrid-layout.css`,它们包含了我们想根据浏览器的支持程度有选择地应用的 CSS。
-我们使用 JavaScript 来测试对 subgrid 值的支持,然后根据浏览器的支持情况更新我们的条件样式表的 `href`。
+我们先使用 JavaScript 来测试对 subgrid 值的支持,然后根据浏览器的支持情况更新我们的条件样式表的 `href`。
我们可以在我们的文档中添加 `` 元素,填充以下 JavaScript:
```js
const conditional = document.querySelector(".conditional");
if (CSS.supports("grid-template-columns", "subgrid")) {
- conditional.setAttribute("href", "subgrid-layout.css.css");
+ conditional.setAttribute("href", "subgrid-layout.css");
}
```
@@ -85,7 +85,7 @@ if (CSS.supports("grid-template-columns", "subgrid")) {
#### @supports
-CSS 有一个原生的特性检测机制:{{cssxref("@supports")}} at-规则。这与[媒体查询](/zh-CN/docs/Web/CSS/CSS_media_queries)的工作方式类似,只是它不是根据分辨率、屏幕宽度或长宽比等媒体特性选择性地应用 CSS,而是根据是否支持某个 CSS 特性来选择性地应用 CSS,类似于 `CSS.supports()`。
+CSS 有一个原生的特性检测机制:{{cssxref("@supports")}} at-规则。它的工作方式与[媒体查询](/zh-CN/docs/Web/CSS/CSS_media_queries)类似,但不同的是,媒体查询是根据分辨率、屏幕宽度或{{glossary("aspect ratio", "长宽比")}}等媒体特性来选择性地应用 CSS,而 @supports 则是根据是否支持某个 CSS 特性来选择性地应用 CSS,类似于 `CSS.supports()`。
例如,我们可以使用 `@supports` 重写我们之前的例子:
@@ -112,9 +112,9 @@ CSS 有一个原生的特性检测机制:{{cssxref("@supports")}} at-规则。
}
```
-只有当前浏览器支持 `grid-template-columns: subgrid;` 声明时,这个 at-规则块才会应用里面的 CSS 规则。为了使一个带值的条件生效,你需要包含一个完整的声明(而不仅仅是一个属性名称),并且不包括结尾的分号。
+只有当浏览器支持 `grid-template-columns: subgrid;` 声明时,这个 at 规则块才会应用其中的 CSS 规则。为了使带有值的条件生效,你需要包含完整的声明(而不仅仅是属性名称),并且不包括结尾的分号。
-`@supports` 也支持 `AND`、`OR` 和 `NOT` 逻辑——如果 subgrid 选项不可用,另一个块应用常规网格布局:
+`@supports` 还支持 `AND`、`OR` 和 `NOT` 逻辑——如果 subgrid 选项不可用,则另一个代码块会应用常规网格布局:
```css
@supports not (grid-template-columns: subgrid) {
@@ -122,19 +122,19 @@ CSS 有一个原生的特性检测机制:{{cssxref("@supports")}} at-规则。
}
```
-这比前面的例子更方便,我们可以在 CSS 中进行所有的特性检测,不需要 JavaScript;而且我们可以在一个 CSS 文件中处理所有的逻辑,减少 HTTP 请求。由于这个原因,它是确定浏览器对 CSS 特性支持的首选方法。
+这比前面的例子更方便,因为我们可以在 CSS 中进行所有的特性检测,而不需要使用 JavaScript。此外,我们可以在一个 CSS 文件中处理所有的逻辑,从而减少 HTTP 请求。因此,这是确定浏览器对 CSS 特性支持的首选方法。
### JavaScript
-我们在前面已经看到了一个 JavaScript 特性检测测试的例子。一般来说,这种测试是通过几种常见的模式之一完成的。
+我们在前面已经看到了一个 JavaScript 特性检测的例子。一般来说,这种测试是通过几种常见的模式之一完成的。
-但请记住,有些特性是已知不可检测的,见 Modernizr 在 2016 年发布的[不可检测的列表](https://github.com/Modernizr/Modernizr/wiki/Undetectables)。
+常见的探测特性的模式包括:
- 对象的成员
- : 检查一个特定的方法或属性(通常是使用 API 的入口或你正在检测的其他特性)是否存在于其父 `Object` 中。
- 我们前面的例子使用这种模式来检测 [Geolocation](/zh-CN/docs/Web/API/Geolocation_API) 的支持,通过测试 [`navigator`](/zh-CN/docs/Web/API/Navigator) 对象的 `geolocation`成员:
+ 我们前面的例子使用这种模式(通过测试 [`navigator`](/zh-CN/docs/Web/API/Navigator) 对象的 `geolocation` 成员)来检测 [Geolocation](/zh-CN/docs/Web/API/Geolocation_API) 的支持:
```js
if ("geolocation" in navigator) {
@@ -157,19 +157,22 @@ CSS 有一个原生的特性检测机制:{{cssxref("@supports")}} at-规则。
}
```
- > **备注:** 上例中的双非运算符(`!!`)是一种将返回值强制转换为“适当的”布尔值的方法,而不是{{glossary("Truthy","真值")}}/{{glossary("Falsy","假值")}},后者可能使结果偏离。
+ > [!NOTE]
+ > 上例中的双非运算符(`!!`)是一种将返回值强制转换为“适当的”布尔值的方法,而不是{{glossary("Truthy","真值")}}/{{glossary("Falsy","假值")}},后者可能使结果偏离。
- 方法在元素上的特定返回值
- - : 使用 {{domxref("Document.createElement()")}} 在内存中创建一个元素,然后检查该元素上是否存在一个方法。如果有的话,检查它的返回值。请参阅[深入了解 HTML 视频格式检测](https://diveinto.html5doctor.com/detect.html#video-formats)中的特性测试,了解这种模式的一个例子。
+ - : 使用 {{domxref("Document.createElement()")}} 在内存中创建一个元素,然后检查该元素是否存在方法。如果有的话,检查它的返回值。请参阅[深入了解 HTML 视频格式检测](https://diveinto.html5doctor.com/detect.html#video-formats)中的特性测试,了解这种模式的一个例子。
- 元素保留分配的属性值
- : 使用 {{domxref("Document.createElement()")}} 在内存中创建一个元素,将一个属性设置为特定值,然后检查该值是否被保留。关于这种模式的例子,请参见[深入了解 HTML \ 类型检测](https://diveinto.html5doctor.com/detect.html#input-types)中的特性测试。
+不过要记住,有些特征是无法检测到的。在这种情况下,你需要使用其他的方法,例如使用 {{Glossary("Polyfill", "polyfill")}}。
+
#### matchMedia
-现在,我们还想提到 {{domxref("Window.matchMedia")}} 这个 JavaScript 特性。这是一个允许你在 JavaScript 内部运行媒体查询测试的属性。它看起来像这样:
+现在,我们还想提到 {{domxref("Window.matchMedia")}} 这个 JavaScript 特性。借助这个属性,你可以在 JavaScript 内部运行媒体查询测试。它看起来像这样:
```js
if (window.matchMedia("(max-width: 480px)").matches) {
@@ -177,13 +180,16 @@ if (window.matchMedia("(max-width: 480px)").matches) {
}
```
-举个例子,我们的 [Snapshot](https://github.com/chrisdavidmills/snapshot) 演示利用它来有选择地应用 Brick JavaScript 库,用它来处理 UI 布局,但只适用于小屏幕布局(480px 宽或以下)。我们首先使用 `media` 属性,仅在页面宽度为 480px 或更小的情况下,将 Brick CSS 应用于页面:
+举个例子,我们的 [Snapshot](https://github.com/chrisdavidmills/snapshot) 演示了如何有选择地应用 Brick JavaScript 库来处理 UI 布局,使其仅应用于小屏幕布局(宽度为 480px 或以下)。我们首先使用 `media` 属性,仅在页面宽度为 480px 或更小的情况下,将 Brick CSS 应用于页面:
-```css
-
+```html
+
```
-然后我们在 JavaScript 中多次使用 `matchMedia()`,只在小屏幕布局时运行 Brick 导航特性(在宽屏幕布局中,所有东西都可以一次看到,所以我们不需要在不同的视图之间导航)。
+然后我们在 JavaScript 中多次使用 `matchMedia()`,只在小屏幕布局时运行 Brick 导航功能(在宽屏幕布局中,所有内容都可以一次看到,所以我们不需要在不同的视图之间导航)。
```js
if (window.matchMedia("(max-width: 480px)").matches) {
@@ -191,149 +197,10 @@ if (window.matchMedia("(max-width: 480px)").matches) {
}
```
-## 使用 Modernizr 实现特性检测
-
-使用上述技术实现自己的特性检测测试是可能的。然而,你也可以使用一个专门的特性检测库,因为它使事情变得更加简单。所有特性检测库之母是 [Modernizr](https://modernizr.com/),它可以检测你所需要的一切。现在让我们来看看如何使用它。
-
-当你在尝试使用 Modernizr 时,你不妨使用开发版,它包括所有可能的特性检测测试。现在就来下载吧:
-
-1. 点击 [Development build](https://modernizr.com/download?do_not_use_in_production) 链接。
-2. 点击页面上方的粉色大型 _Build_ 按钮。
-3. 在出现的对话框中,点击顶部的 _Download_ 链接。
-
-把它保存在合理的地方,就像你在本系列其他指南那样使用一个目录。
-
-当你在生产环境中使用 Modernizr 时,你可以到你已经访问过的[下载页面](https://modernizr.com/download),点击加号按钮,只包括你需要的特性检测。然后,当你点击 _Build_ 按钮时,你将下载一个只包含这些特性检测的自定义构建,使文件大小更小。
-
-### CSS
-
-让我们来看看 Modernizr 在选择性应用 CSS 方面是如何工作的。
-
-1. 首先,复制提供的 [`supports-feature-detect.html`](https://github.com/mdn/learning-area/blob/main/tools-testing/cross-browser-testing/feature-detection/supports-feature-detect.html) 和 [`supports-styling.css`](https://github.com/mdn/learning-area/blob/main/tools-testing/cross-browser-testing/feature-detection/supports-styling.css) 文件中的内容。将它们保存为 `modernizr-css.html` 和 `modernizr-css.css`。
-2. 更新 HTML 中的 {{htmlelement("link")}} 元素,使其指向正确的 CSS 文件(你也应该将 {{htmlelement("title")}} 元素更新为更合适的内容!):
-
- ```html
-
- ```
-
-3. 在这个 ` ` 元素上面,添加一个 {{htmlelement("script")}} 元素,将 Modernizr 库应用到页面,如下图所示。这需要在任何可能使用它的 CSS(或 JavaScript)之前应用到页面上。
-
- ```html
-
- ```
-
-4. 现在编辑你的 `` 起始标签,使它改变成以下这样:
-
- ```html
-
- …
-
- ```
-
-此时,试着加载你的页面,你会对 Modernizr 在 CSS 特性方面的工作有一个概念。如果你看一下浏览器开发者工具的 DOM 检查器,你会发现 Modernizr 已经像这样更新了你的 `` 元素的 `class` 属性:
-
-```html
-
- …
-
-```
-
-它现在包含了大量的类,表示对不同技术特性的支持状态。举例来说,如果浏览器完全不支持 grid,`` 将被赋予 `no-cssgrid` 的类名。如果你在类列表中搜索,你还会看到其他与网格有关的类,比如:
-
-- `cssgridlegacy` 或 `no-cssgridlegacy`,取决于是否支持传统版本的网格。
-
-> **备注:** 你可以找到大部分类名的含义列表——见 [Modernizr 检测的特性](https://modernizr.com/docs#features)。
-
-不幸的是,Modernizr 并没有测试对一些新的 CSS 特性的支持,如容器查询、层叠层或子网格。如果它这样做了,我们将以如下方式更新我们的 `@supports` 例子:
-
-```css
-main {
- display: grid;
- grid-template-columns: repeat(9, 1fr);
- grid-template-rows: repeat(4, minmax(100px, auto));
-}
-
-.item {
- display: grid;
- grid-column: 2 / 7;
- grid-row: 2 / 4;
- grid-template-rows: repeat(3, 80px);
-}
-
-/* 支持 subgrid 的浏览器的属性 */
-.csssubgrid .item {
- grid-template-columns: subgrid;
-}
-
-.csssubgrid .subitem {
- grid-column: 3 / 6;
- grid-row: 1 / 3;
-}
-
-/* 不支持 subgrid 的浏览器的回落 */
-.no-csssubgrid .subitem {
- display: flex;
- flex: 33%;
-}
-```
-
-那么,这是如何工作的呢?因为所有这些类名都被放在了 `` 元素上,你可以使用特定的后代选择器来针对那些支持或不支持某个特性的浏览器。所以在这里,我们只对支持 subgrid 的浏览器应用最上面的规则,而对不支持的浏览器应用最下面的规则(`no-csssubgrid`)。
-
-> **备注:** Modernizr 的所有 HTML 和 JavaScript 特性测试都以类名的形式报告,因此,如果需要,你可以根据浏览器是否支持 HTML 或 JavaScript 特性,有选择地应用 CSS。
-
-### JavaScript
-
-Modernizr 也同样为实现 JavaScript 特性检测做了充分准备。它通过使全局的 `Modernizr` 对象对它所应用的页面可用,它包含了作为 `true`/`false` 属性的特性检测结果。
-
-例如,在浏览器中加载我们的 [`modernizr-css.html`](https://github.com/mdn/learning-area/blob/main/tools-testing/cross-browser-testing/feature-detection/modernizr-css.html) 示例,然后试着在你的 JavaScript 控制台中输入 `Modernizr.`,然后再输入其中的一些类名(这里也一样)。比如:
-
-```
-Modernizr.flexbox
-Modernizr.xhr2
-Modernizr.fetch
-```
-
-控制台将返回 `true`/`false` 值,表示你的浏览器是否支持这些特性。
-
-让我们看一个示例来说明你如何使用这些属性。
-
-1. 首先,将 [`modernizr-js.html`](https://github.com/mdn/learning-area/blob/main/tools-testing/cross-browser-testing/feature-detection/modernizr-js.html) 示例文件复制到本地。
-2. 使用 ``
![Author Form XSS test](author_create_form_alert_xss.png)
- > **备注:** 这一段代码并没有任何杀伤力,在执行的时候只会在浏览器中弹出一个警告提示框。如果这个警告提示框出现,则表明本网站存在可被 XSS 攻击的漏洞。
+ > [!NOTE]
+ > 这一段代码并没有任何杀伤力,在执行的时候只会在浏览器中弹出一个警告提示框。如果这个警告提示框出现,则表明本网站存在可被 XSS 攻击的漏洞。
5. 点击 **Submit** 按钮保存信息。
6. 保存后的作者信息将会显示为下图的样式。因为 XSS 防护措施的存在,注入代码中的`alert()`部分并没有执行,而只是用文本的方式直接显示了出来。![Author detail view XSS test](author_detail_alert_xss.png)
@@ -76,7 +78,8 @@ XSS 攻击也可能来自于其他不可信的数据来源,例如 cookies,We
CSRF(英语:Cross-site request forgery,通常简称:CSRF 或 XSRF) 攻击可以让恶意攻击者在用户不知情的情况下,使用用户的身份来进行系统操作。举个例子,现在有一名黑客想要在我们的本地图书馆中添加一些作者信息。
-> **备注:** 这个示例里面的黑客没有考虑对钱下手。而现实生活中的黑客则极有可能会产生更加危险的操作(例如,把钱转入他们自己的账户中等等)。
+> [!NOTE]
+> 这个示例里面的黑客没有考虑对钱下手。而现实生活中的黑客则极有可能会产生更加危险的操作(例如,把钱转入他们自己的账户中等等)。
为了实现这个目的,黑客可以创建一个类似于下面示例的 HTML 文件,这个文件包含了一个创建作者的表单 (类似我们在之前章节中用过的),并且一旦加载完毕就会立即进行提交。随后黑客可以将这个文件发送至所有的图书管理员,并且引诱他们打开这个文件 (文件中真的没有啥有害的信息)。如果任何一个已登录的图书管理员不慎打开了这个文件,那么文件中的表单就会利用图书管理员的身份来提交,随后就会创建出一个新的作者来。
diff --git a/files/zh-cn/learn/server-side/express_nodejs/deployment/index.md b/files/zh-cn/learn/server-side/express_nodejs/deployment/index.md
index d5f313ca929c27..2fa1bf641b8448 100644
--- a/files/zh-cn/learn/server-side/express_nodejs/deployment/index.md
+++ b/files/zh-cn/learn/server-side/express_nodejs/deployment/index.md
@@ -53,19 +53,22 @@ slug: Learn/Server-side/Express_Nodejs/deployment
这种可远程访问的计算/网络硬件,称为基础架构即服务(IaaS)。许多 IaaS 供应商,提供预安装特定操作系统的选项,你必须在其上,安装生产环境的其他组件。其他供应商,允许你选择功能更全面的环境,可能包括完整的 node 设置。
-> **备注:** 预构建环境,可以使你的网站设置变得非常简单,因为它们会减少配置,但可用选项可能会限制你使用不熟悉的服务器(或其他组件),并且可能基于较旧版本的操作系统。通常最好自己安装组件,以便获得所需的组件,并且当你需要升级系统的某些部分时,你可以知道从哪里开始!
+> [!NOTE]
+> 预构建环境,可以使你的网站设置变得非常简单,因为它们会减少配置,但可用选项可能会限制你使用不熟悉的服务器(或其他组件),并且可能基于较旧版本的操作系统。通常最好自己安装组件,以便获得所需的组件,并且当你需要升级系统的某些部分时,你可以知道从哪里开始!
其他托管服务提供商,支持 Express 作为平台即服务(PaaS)产品的一部分。使用此类托管时,你无需担心大多数生产环境(服务器,负载平衡器等),因为主机平台会为你处理这些问题。这使得部署非常简单,因为你只需要专注于 Web 应用程序,而不是任何其他服务器基础结构。
一些开发人员选择 IaaS,相对于 PaaS,IaaS 提供更高灵活性,而其他开发人员偏好 PaaS 的降低维护开销,和更轻松的扩展性。当你在一开始使用时,在 PaaS 系统上设置你的网站,要容易得多,因此我们将在本教程中使用 PaaS。
-> **备注:** 如果你选择 Node/Express 友好的托管服务提供商,他们应该提供,有关如何使用 Web 服务器,应用程序服务器,反向代理等不同配置,来设置 Express 网站的说明。例如,在[数字海洋 node 社区文档](https://www.digitalocean.com/community/tutorials?q=node)中,有许多各种配置的手把手指南。
+> [!NOTE]
+> 如果你选择 Node/Express 友好的托管服务提供商,他们应该提供,有关如何使用 Web 服务器,应用程序服务器,反向代理等不同配置,来设置 Express 网站的说明。例如,在[数字海洋 node 社区文档](https://www.digitalocean.com/community/tutorials?q=node)中,有许多各种配置的手把手指南。
## 选择一个主机供应商
众所周知,众多托管服务提供商,都积极支持或与 Node(和 Express)合作。这些供应商提供不同类型的环境(IaaS,PaaS),以及不同价格的不同级别的计算和网络资源。
-> **备注:** 有很多托管解决方案,他们的服务和定价,可能会随着时间而改变。虽然我们在下面介绍几个选项,但在选择托管服务提供商之前,有必要自己进行互联网搜索。
+> [!NOTE]
+> 有很多托管解决方案,他们的服务和定价,可能会随着时间而改变。虽然我们在下面介绍几个选项,但在选择托管服务提供商之前,有必要自己进行互联网搜索。
选择主机时需要考虑的一些事项:
@@ -83,7 +86,8 @@ slug: Learn/Server-side/Express_Nodejs/deployment
许多提供商还拥有“基本”层,可提供更多有用的计算能力,和更少的限制。举例来说, [Digital Ocean](https://www.digitalocean.com/) 是一个流行的托管服务提供商,它提供了一个相对便宜的基本计算层(在本教程写作时,是每月 5 美元的较低范围)。
-> **备注:** 请记住,价格不是唯一的选择标准。如果你的网站成功,可能会发现可扩展性是最重要的考虑因素。
+> [!NOTE]
+> 请记住,价格不是唯一的选择标准。如果你的网站成功,可能会发现可扩展性是最重要的考虑因素。
## 准备好发布你的网站
@@ -91,7 +95,8 @@ slug: Learn/Server-side/Express_Nodejs/deployment
在以下小节中,我们概述了你应该对应用进行的、最重要的更改。
-> **备注:** Express 文档中还有其他有用的提示 - 请参阅“[生产最佳实践:性能和可靠性](https://expressjs.com/en/advanced/best-practice-performance.html)”,以及“[生产最佳实践:安全性](https://expressjs.com/en/advanced/best-practice-security.html)”。
+> [!NOTE]
+> Express 文档中还有其他有用的提示 - 请参阅“[生产最佳实践:性能和可靠性](https://expressjs.com/en/advanced/best-practice-performance.html)”,以及“[生产最佳实践:安全性](https://expressjs.com/en/advanced/best-practice-security.html)”。
### 设置 NODE_ENV 为 'production'
@@ -99,7 +104,8 @@ slug: Learn/Server-side/Express_Nodejs/deployment
可以使用导出或环境文件,或使用 OS 初始化系统,以进行此更改。
-> **备注:** 这实际上是在环境设置,而不是应用中所做的更改,但重要的是,要注意这里!我们将在下面,展示如何为我们的托管示例设置。
+> [!NOTE]
+> 这实际上是在环境设置,而不是应用中所做的更改,但重要的是,要注意这里!我们将在下面,展示如何为我们的托管示例设置。
### Log appropriately
@@ -134,7 +140,8 @@ set DEBUG=author,book
export DEBUG="author,book"
```
-> **备注:** 调用`debug`可以替换你以前使用`console.log()`或`console.error()`执行的日志记录。通过调试模块[debug](https://www.npmjs.com/package/debug)进行日志记录,替换代码中的所有`console.log()`调用。通过设置 DEBUG 变量,并在其中记录对日志记录的影响,在开发环境中,打开和关闭日志记录。
+> [!NOTE]
+> 调用`debug`可以替换你以前使用`console.log()`或`console.error()`执行的日志记录。通过调试模块[debug](https://www.npmjs.com/package/debug)进行日志记录,替换代码中的所有`console.log()`调用。通过设置 DEBUG 变量,并在其中记录对日志记录的影响,在开发环境中,打开和关闭日志记录。
如果你需要记录网站活动,可以使用 Winston 或 Bunyan 等日志库。有关此主题的更多信息,请参阅:[生产最佳实践:性能和可靠性](https://expressjs.com/en/advanced/best-practice-performance.html)。
@@ -170,7 +177,8 @@ app.use('/catalog', catalogRouter); // Add catalog routes to middleware chain.
...
```
-> **备注:** 对于生产中流量较大的网站,你不会使用此中间件。相反,你会使用像 Nginx 这样的反向代理。
+> [!NOTE]
+> 对于生产中流量较大的网站,你不会使用此中间件。相反,你会使用像 Nginx 这样的反向代理。
### 使用 Helmet 避免被常见漏洞侵袭
@@ -195,7 +203,8 @@ app.use(helmet());
...
```
-> **备注:** 上面的命令,添加了对大多数站点有意义的可用标头子集。你可以按照[npm](https://www.npmjs.com/package/helmet)上的说明,根据需要添加/禁用特定标头。
+> [!NOTE]
+> 上面的命令,添加了对大多数站点有意义的可用标头子集。你可以按照[npm](https://www.npmjs.com/package/helmet)上的说明,根据需要添加/禁用特定标头。
## 例子:在 Heroku 上安装一个本地图书馆
@@ -238,7 +247,8 @@ Heroku 在一个或多个“[Dynos](https://devcenter.heroku.com/articles/dynos)
Heroku 与 **git** 源代码版本控制系统紧密集成,使用它来上传/同步你对实时运行系统所做的任何更改。它通过添加一个名为 heroku 的新 Heroku“远程”存储库,来指向你在 Heroku 云上的源存储库。在开发期间,你使用 git 在“主”存储库 master 中存储更改。如果要部署站点,请将更改同步到 Heroku 存储库。
-> **备注:** 如果你习惯于遵循良好的软件开发实践,那么你可能已经在使用 git 或其他一些 SCM 系统。如果你已有 git 存储库,则可以跳过此步骤。
+> [!NOTE]
+> 如果你习惯于遵循良好的软件开发实践,那么你可能已经在使用 git 或其他一些 SCM 系统。如果你已有 git 存储库,则可以跳过此步骤。
有很多方法可以使用 git,但最简单的方法之一,是首先在[GitHub](https://github.com/)上建立一个帐户,在那里创建存储库,然后在本地同步它:
@@ -307,7 +317,8 @@ Heroku 与 **git** 源代码版本控制系统紧密集成,使用它来上传/
完成此操作后,你应该可以返回创建存储库的 Github 上的页面,刷新页面,并查看你的整个应用程序现已上传。使用此添加/提交/推送循环,你可以在文件更改时,继续更新存储库。
-> **备注:** 这是备份你的“vanilla”项目的好时机 - 虽然我们将在以下部分中进行的一些更改,可能对任何平台(或开发)上的部署有用,而一些其他的更改可能没有用。
+> [!NOTE]
+> 这是备份你的“vanilla”项目的好时机 - 虽然我们将在以下部分中进行的一些更改,可能对任何平台(或开发)上的部署有用,而一些其他的更改可能没有用。
>
> 执行此操作的最佳方法,是使用 git 来管理你的修订。使用 git,你不仅可以回到特定的旧版本,而且可以在生产变更的单独“分支”中进行维护,并选择在生产和开发分支之间移动的任何更改。[学习 Git](https://help.github.com/articles/good-resources-for-learning-git-and-github/)非常值得,但超出了本主题的范围。
>
@@ -412,7 +423,8 @@ heroku help
heroku create
```
-> **备注:** 如果你愿意,可以在“创建”create 之后指定远程存储库的命名。如果你不这样做,你会得到一个随机的名字。该名称用于默认 URL。
+> [!NOTE]
+> 如果你愿意,可以在“创建”create 之后指定远程存储库的命名。如果你不这样做,你会得到一个随机的名字。该名称用于默认 URL。
然后,我们可以将我们的应用程序,推送到 Heroku 存储库,如下所示。这将上传应用程序,获取所有依赖项,将其打包到 dyno 中,然后启动该站点。
@@ -426,7 +438,8 @@ git push heroku master
heroku open
```
-> **备注:** 该站点将使用我们的开发数据库运行。创建一些书本和其他对象,并检查该网站是否按预期运行。在下一节中,我们将其设置为使用我们的新数据库。
+> [!NOTE]
+> 该站点将使用我们的开发数据库运行。创建一些书本和其他对象,并检查该网站是否按预期运行。在下一节中,我们将其设置为使用我们的新数据库。
### 设定配置变量
diff --git a/files/zh-cn/learn/server-side/express_nodejs/development_environment/index.md b/files/zh-cn/learn/server-side/express_nodejs/development_environment/index.md
index 06fa88e780e431..5305975a4a1101 100644
--- a/files/zh-cn/learn/server-side/express_nodejs/development_environment/index.md
+++ b/files/zh-cn/learn/server-side/express_nodejs/development_environment/index.md
@@ -32,7 +32,8 @@ Node 和 NPM 包管理器可以用二进制包、安装程序或系统包管理
NPM 也可以安装(全局的)**Express 应用生成器**,可用于创建遵循 [MVC 模式](/zh-CN/docs/Web/Apps/Fundamentals/Modern_web_app_architecture/MVC_architecture) 的 Express 应用框架。它不是必备的,因为无需这个工具就可以创建 Express 应用(或相同架构布局或依赖的 Express 应用)。但我们还是会使用它,因为它更容易上手,还有助于应用结构的模块化管理。
-> **备注:** 与某些其他 Web 框架不同,开发环境不包含单独的开发 Web 服务器。在 Node / Express 中,Web 应用程序将创建并运行自己的 Web 服务器!
+> [!NOTE]
+> 与某些其他 Web 框架不同,开发环境不包含单独的开发 Web 服务器。在 Node / Express 中,Web 应用程序将创建并运行自己的 Web 服务器!
典型的开发环境中还需要一些外围工具,包括用于编写代码的 [文本编辑器](/zh-CN/docs/Learn/Common_questions/实用文本编辑器) 或 IDE,用于代码控制管理的工具(比如代码版本控制工具 [Git](https://git-scm.com/))。这里假定你已经安装了这些工具(尤其是文本编辑器)。
@@ -58,7 +59,8 @@ Express 应选用最新版本。
先在操作系统上安装 Node.js 和 NPM 后才可使用 Express。接下来将介绍如何最简便地在 Ubuntu 18.04、macOS Mojave 以及 Windows 10 上安装 Node.js 最新的 LTS 版本。.
-> **备注:** 以下内容将介绍在上述三种 OS 上安装 Node 和 NPM 的最简便方法。对于其他操作系统,以及更多的安装方法,可以参考 [通过包管理器方式安装 Node.js](https://nodejs.org/zh-cn/download/package-manager/) (nodejs.org).
+> [!NOTE]
+> 以下内容将介绍在上述三种 OS 上安装 Node 和 NPM 的最简便方法。对于其他操作系统,以及更多的安装方法,可以参考 [通过包管理器方式安装 Node.js](https://nodejs.org/zh-cn/download/package-manager/) (nodejs.org).
### Windows 和 macOS
@@ -80,7 +82,8 @@ curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash -
sudo apt-get install -y nodejs
```
-> **警告:** 直接从 Ubuntu 默认仓库中下载的 Node 是 8.x 版本的。
+> [!WARNING]
+> 直接从 Ubuntu 默认仓库中下载的 Node 是 8.x 版本的。
### 测试 Node.js 和 NPM 是否安装成功
@@ -126,7 +129,8 @@ $ npm -v
代码导入了 `"http"` 模块,并用它(`createServer()`)创建了一个服务器来监听 3000 端口的 HTTP 请求。随后在控制台打印一条信息,提示测试服务器的正确 URL。`createServer()` 函数接受一个回调函数作为参数,并在接收 HTTP 请求后进行回调。直接返回了 HTTP 状态码 200("`OK`"),以及纯文本信息 "Hello World"。
- > **备注:** 现在看不懂这些代码请不要担心,开始使用 Express 后候会进行更加详细的解释。
+ > [!NOTE]
+ > 现在看不懂这些代码请不要担心,开始使用 Express 后候会进行更加详细的解释。
2. 在命令行工具中进入 hellonode.js 文件所在的目录,输入“node + 文件名”并运行,服务器就启动了:
@@ -141,7 +145,8 @@ $ npm -v
构建 Node 应用过程中,[NPM](https://docs.npmjs.com/) 是除了 Node 本身之外最重要的工具。可用于获取应用开发、测试以及生产所需的所有包(JavaScript 库)。也可运行开发过程中使用的测试单元和工具。
-> **备注:** 以 Node 的角度来看,Express 只是一个用 NPM 安装、供人使用的包而已。
+> [!NOTE]
+> 以 Node 的角度来看,Express 只是一个用 NPM 安装、供人使用的包而已。
可以用 NPM 手动逐个安装所需包。但通常可用 [package.json](https://docs.npmjs.com/files/package.json) 文件来管理依赖。把每个依赖以一个 JavaScript“包”的形式(其中包括名称、版本、描述,初始执行文件、生产依赖,开发依赖、支持的 _Node_ 版本,等等)罗列在这个文件中。package.json 文件包含 NPM 获取和运行应用程序所需的所有内容(在编写可重用的库时,可以用它把包上传到 NPM 仓库中供其他用户使用)。
@@ -149,7 +154,8 @@ $ npm -v
下面介绍用 NPM 下载包、将包保存进工程依赖树,以及在 Node 应用中调用包的方法和步骤。
-> **备注:** 现在来讲解获取和安装 Express 包的步骤。稍后解释为什么可以直接对 Express 包(乃至其他包)使用 **Express 应用生成器**。这段对理解 NPM 的工作原理和应用生成器的工作机制有一定的帮助。
+> [!NOTE]
+> 现在来讲解获取和安装 Express 包的步骤。稍后解释为什么可以直接对 Express 包(乃至其他包)使用 **Express 应用生成器**。这段对理解 NPM 的工作原理和应用生成器的工作机制有一定的帮助。
1. 首先为新应用创建一个目录,并进入它:
@@ -249,7 +255,8 @@ npm install eslint --save-dev
}
```
-> **备注:** "[lint](https://zh.wikipedia.org/wiki/Lint)" 是用于对软件进行静态分析的工具,可以发现并报告软件是否遵循某些最佳编程惯例。
+> [!NOTE]
+> "[lint](https://zh.wikipedia.org/wiki/Lint)" 是用于对软件进行静态分析的工具,可以发现并报告软件是否遵循某些最佳编程惯例。
### 运行任务
@@ -297,7 +304,8 @@ npm install express-generator -g
express helloworld
```
-> **备注:** 也可以指定模板库来使用其他丰富的设置。可通过 help 命令来查看所有选项:
+> [!NOTE]
+> 也可以指定模板库来使用其他丰富的设置。可通过 help 命令来查看所有选项:
>
> ```bash
> $ express --help
@@ -305,7 +313,8 @@ express helloworld
NPM 将在当前位置的子目录中创建新的 Express 应用,可以在控制台看到构建的过程。在完成时,NPM 会提示你需要安装哪些 Node 依赖,以及如何开启应用。
-> **备注:** 新应用的根目录有一个 **package.json** 文件。可以打开它看看都安装了哪些依赖,其中可以看到 Express 和 Jade 模板库:
+> [!NOTE]
+> 新应用的根目录有一个 **package.json** 文件。可以打开它看看都安装了哪些依赖,其中可以看到 Express 和 Jade 模板库:
>
> ```js
> {
diff --git a/files/zh-cn/learn/server-side/express_nodejs/displaying_data/author_detail_page/index.md b/files/zh-cn/learn/server-side/express_nodejs/displaying_data/author_detail_page/index.md
index ea83ba3741163a..d357fd54a6e3e2 100644
--- a/files/zh-cn/learn/server-side/express_nodejs/displaying_data/author_detail_page/index.md
+++ b/files/zh-cn/learn/server-side/express_nodejs/displaying_data/author_detail_page/index.md
@@ -87,7 +87,8 @@ block content
![Author Detail Page - Express Local Library site](locallibary_express_author_detail.png)
-> **备注:** 作者的出生与死亡日期的外观很丑!我们将在本文最后的自我挑战处理它。
+> [!NOTE]
+> 作者的出生与死亡日期的外观很丑!我们将在本文最后的自我挑战处理它。
## 下一步
diff --git a/files/zh-cn/learn/server-side/express_nodejs/displaying_data/author_list_page/index.md b/files/zh-cn/learn/server-side/express_nodejs/displaying_data/author_list_page/index.md
index d37f3a23181fac..4115aa8f725af7 100644
--- a/files/zh-cn/learn/server-side/express_nodejs/displaying_data/author_list_page/index.md
+++ b/files/zh-cn/learn/server-side/express_nodejs/displaying_data/author_list_page/index.md
@@ -59,7 +59,8 @@ block content
![Author List Page - Express Local Library site](locallibary_express_author_list.png)
-> **备注:** 作者生命日期的外观是丑陋的!你可以使用我们用于`BookInstance` 列表的[相同方法](/zh-CN/docs/Learn/Server-side/Express_Nodejs/Displaying_data#date_formatting)(将生命周期的虚拟属性,添加到 `Author` 模型),来改进此方法。
+> [!NOTE]
+> 作者生命日期的外观是丑陋的!你可以使用我们用于`BookInstance` 列表的[相同方法](/zh-CN/docs/Learn/Server-side/Express_Nodejs/Displaying_data#date_formatting)(将生命周期的虚拟属性,添加到 `Author` 模型),来改进此方法。
>
> 但是,这次缺少日期,除非严格模式生效,否则将忽略对不存在的属性的引用。`moment()`返回当前时间,并且你不希望将缺少的日期格式化为就像今天一样。
>
diff --git a/files/zh-cn/learn/server-side/express_nodejs/displaying_data/book_detail_page/index.md b/files/zh-cn/learn/server-side/express_nodejs/displaying_data/book_detail_page/index.md
index ae6d60c0fab626..e450f5592d5d5c 100644
--- a/files/zh-cn/learn/server-side/express_nodejs/displaying_data/book_detail_page/index.md
+++ b/files/zh-cn/learn/server-side/express_nodejs/displaying_data/book_detail_page/index.md
@@ -33,7 +33,8 @@ exports.book_detail = asyncHandler(async (req, res, next) => {
});
```
-> **备注:** 我们不需要用 require 导入任何额外的模块,因为我们在实现主页控制器时已经导入了依赖项。
+> [!NOTE]
+> 我们不需要用 require 导入任何额外的模块,因为我们在实现主页控制器时已经导入了依赖项。
此方法与[类别详细信息页面](/zh-CN/docs/Learn/Server-side/Express_Nodejs/Displaying_data/Genre_detail_page)描述的方法完全相同。路由控制器函数使用 `Promise.all()` 并行查询指定的书籍(`Book`)以及它的相关副本(`BookInstance`)。如果没有找到匹配的书籍,就会返回一个带有“404: Not Found”错误的 Error 对象。如果找到了书籍,那么就会使用“book_detail”模板呈现检索到的数据库信息。由于“title”键用于给网页命名(如“layout.pug”中定义的标题),所以这次我们在渲染网页时传递了 `results.book.title`。
@@ -80,7 +81,8 @@ block content
在这个模板中,几乎所有内容都在先前的章节演示过了。
-> **备注:** 与本书相关的类别列表在模板中的实现如下。除了最后一个之外,这会在与本书相关的每个类别后面添加一个逗号。
+> [!NOTE]
+> 与本书相关的类别列表在模板中的实现如下。除了最后一个之外,这会在与本书相关的每个类别后面添加一个逗号。
>
> ```pug
> p #[strong Genre:]
diff --git a/files/zh-cn/learn/server-side/express_nodejs/displaying_data/book_list_page/index.md b/files/zh-cn/learn/server-side/express_nodejs/displaying_data/book_list_page/index.md
index 5a9f3a1b1faf80..f32e01a6e9ced2 100644
--- a/files/zh-cn/learn/server-side/express_nodejs/displaying_data/book_list_page/index.md
+++ b/files/zh-cn/learn/server-side/express_nodejs/displaying_data/book_list_page/index.md
@@ -52,7 +52,8 @@ block content
這个视图扩展了 **layout.pug** 基本模板,并覆盖了名为 '**content**' 的區块 `block` 。它显示我们从控制器传入的标题`title`(通过`render()`方法),然后使用`each`-`in`-`else`语法,遍历`book_list`变量。为每本图书创建一个列表项,以显示书名,并作为书的详细信息页面的链接,后面跟着作者姓名。如果`book_list`中没有书,则执行`else`子句,并显示文字“没有书” 'There are no books.'。
-> **备注:** 我们使用 `book.url` ,为每本书提供详细记录链接(我们已经实现了此路由,但尚未实现此页面)。这是 `Book` 模型的一个虚拟属性,它使用模型实例的 `_id` 字段,生成唯一的 URL 路径。
+> [!NOTE]
+> 我们使用 `book.url` ,为每本书提供详细记录链接(我们已经实现了此路由,但尚未实现此页面)。这是 `Book` 模型的一个虚拟属性,它使用模型实例的 `_id` 字段,生成唯一的 URL 路径。
在这里,我們感兴趣的是,每本书被定义为两行,第二行使用管道(上面高亮显示)。这种方法是必要的,因为如果作者姓名位于上一行,那么它将成为超链接的一部分。
diff --git a/files/zh-cn/learn/server-side/express_nodejs/displaying_data/bookinstance_detail_page_and_challenge/index.md b/files/zh-cn/learn/server-side/express_nodejs/displaying_data/bookinstance_detail_page_and_challenge/index.md
index c6ffaff99fe938..1819fb34264377 100644
--- a/files/zh-cn/learn/server-side/express_nodejs/displaying_data/bookinstance_detail_page_and_challenge/index.md
+++ b/files/zh-cn/learn/server-side/express_nodejs/displaying_data/bookinstance_detail_page_and_challenge/index.md
@@ -76,7 +76,8 @@ block content
目前,我们网站上显示的大多数日期,都使用默认的 JavaScript 格式(例如 _Tue Dec 06 2016 15:49:58 GMT+1100_(AUS 东部夏令时间)。本文的挑战,是改善作者`Author`生命周期日期显示的外观信息(死亡/出生日期)和 BookInstance 详细信息页面,使用格式:December 6th, 2016。
-> **备注:** 你可以使用与我们用于 Book Instance List 的相同方法(将生命周期的虚拟属性,添加到`Author`模型,并使用[moment](https://www.npmjs.com/package/moment)来设置日期字符串的格式)。
+> [!NOTE]
+> 你可以使用与我们用于 Book Instance List 的相同方法(将生命周期的虚拟属性,添加到`Author`模型,并使用[moment](https://www.npmjs.com/package/moment)来设置日期字符串的格式)。
这一挑战的要求:
diff --git a/files/zh-cn/learn/server-side/express_nodejs/displaying_data/date_formatting_using_moment/index.md b/files/zh-cn/learn/server-side/express_nodejs/displaying_data/date_formatting_using_moment/index.md
index e94069f3b1f2d1..a4fa838d3ecf92 100644
--- a/files/zh-cn/learn/server-side/express_nodejs/displaying_data/date_formatting_using_moment/index.md
+++ b/files/zh-cn/learn/server-side/express_nodejs/displaying_data/date_formatting_using_moment/index.md
@@ -7,7 +7,8 @@ slug: Learn/Server-side/Express_Nodejs/Displaying_data/Date_formatting_using_mom
我们将使用的方法,是在我们的`BookInstance`模型中,创建一个返回格式化日期的虚拟屬性。我们将使用[moment](https://www.npmjs.com/package/moment) 来做实际的格式化,这是一个轻量级 JavaScript 日期库,用于解析,验证,操作和格式化日期。
-> **备注:** 我们可以直接在 Pug 模板中,使用 _moment_ 格式化字符串,或者可以在许多其他地方格式化字符串。使用虚拟属性,可以使我们获得格式化的日期,這与我们当前获取 `due_date` 的方式完全相同。
+> [!NOTE]
+> 我们可以直接在 Pug 模板中,使用 _moment_ 格式化字符串,或者可以在许多其他地方格式化字符串。使用虚拟属性,可以使我们获得格式化的日期,這与我们当前获取 `due_date` 的方式完全相同。
## 安装 moment
@@ -34,7 +35,8 @@ BookInstanceSchema.virtual("due_back_formatted").get(function () {
});
```
-> **备注:** 格式化方法可以使用几乎任何模式显示日期。[moment 文档](http://momentjs.com/docs/#/displaying/)中,可以找到表示不同日期组件的语法。
+> [!NOTE]
+> 格式化方法可以使用几乎任何模式显示日期。[moment 文档](http://momentjs.com/docs/#/displaying/)中,可以找到表示不同日期组件的语法。
## 更新视图
diff --git a/files/zh-cn/learn/server-side/express_nodejs/displaying_data/genre_detail_page/index.md b/files/zh-cn/learn/server-side/express_nodejs/displaying_data/genre_detail_page/index.md
index 1b250402bf828f..4d0c460890e3d5 100644
--- a/files/zh-cn/learn/server-side/express_nodejs/displaying_data/genre_detail_page/index.md
+++ b/files/zh-cn/learn/server-side/express_nodejs/displaying_data/genre_detail_page/index.md
@@ -54,7 +54,8 @@ exports.genre_detail = function (req, res, next) {
所需种类记录的 ID,在 URL 的末尾编码,并根据路由定义(**/genre/:id**)自动提取。通过请求参数(`req.params.id`)在控制器内访问 ID。它在 `Genre.findById()` 中用于获取当前种类。它还用于获取符合当前种类的所有`Book`对象,就是在种类字段中具有种类 ID 的那些 `Book.find({ 'genre': req.params.id })`。
-> **备注:** 如果数据库中不存在该类型(即它可能已被删除),则`findById()`将成功返回,但没有结果。在这种情况下,我们想要显示一个“未找到”页面,因此我们创建一个`Error`对象,并将其传递给链中的下一个中间件函数`next`。
+> [!NOTE]
+> 如果数据库中不存在该类型(即它可能已被删除),则`findById()`将成功返回,但没有结果。在这种情况下,我们想要显示一个“未找到”页面,因此我们创建一个`Error`对象,并将其传递给链中的下一个中间件函数`next`。
>
> ```js
> if (results.genre == null) {
@@ -102,7 +103,8 @@ block content
![Genre Detail Page - Express Local Library site](locallibary_express_genre_detail.png)
-> **备注:** 你可能会收到与此类似的错误:
+> [!NOTE]
+> 你可能会收到与此类似的错误:
>
> ```bash
> Cast to ObjectId failed for value " 59347139895ea23f9430ecbb" at path "_id" for model "Genre"
diff --git a/files/zh-cn/learn/server-side/express_nodejs/displaying_data/home_page/index.md b/files/zh-cn/learn/server-side/express_nodejs/displaying_data/home_page/index.md
index 843a17ee270492..8d38fc3b85ed46 100644
--- a/files/zh-cn/learn/server-side/express_nodejs/displaying_data/home_page/index.md
+++ b/files/zh-cn/learn/server-side/express_nodejs/displaying_data/home_page/index.md
@@ -107,7 +107,8 @@ block content
在动态内容标题下,我们检查从`render()`函数传入的错误变量,是否已定义。如果是这样,我们列出这个错误。如果不是,我们从`data`变量中,获取并列出每个模型的副本数量。
-> **备注:** 我们没有转义计数值 (i.e. 我们使用 `!{}` 语法) ,因为计数值已经被计算过了。如果信息是由终端用户提供的,那么我们就会转义該变量,以用于显示。
+> [!NOTE]
+> 我们没有转义计数值 (i.e. 我们使用 `!{}` 语法) ,因为计数值已经被计算过了。如果信息是由终端用户提供的,那么我们就会转义該变量,以用于显示。
## 它看起来像是?
@@ -115,7 +116,8 @@ block content
![Home page - Express Local Library site](locallibary_express_home.png)
-> **备注:** 你将无法使用侧边栏链接,因为这些网页的网址,视图和模板尚未定义。例如,如果你尝试,取决于你点击的链接,你将获取“NOT IMPLEMENTED: Book list”等错误。在“控制器”文件中的不同控制器中,会指定这些字符串文字(将被合适的数据替换)。
+> [!NOTE]
+> 你将无法使用侧边栏链接,因为这些网页的网址,视图和模板尚未定义。例如,如果你尝试,取决于你点击的链接,你将获取“NOT IMPLEMENTED: Book list”等错误。在“控制器”文件中的不同控制器中,会指定这些字符串文字(将被合适的数据替换)。
## 下一步
diff --git a/files/zh-cn/learn/server-side/express_nodejs/displaying_data/template_primer/index.md b/files/zh-cn/learn/server-side/express_nodejs/displaying_data/template_primer/index.md
index 599b4c9a230cc1..6308b7ae551e3e 100644
--- a/files/zh-cn/learn/server-side/express_nodejs/displaying_data/template_primer/index.md
+++ b/files/zh-cn/learn/server-side/express_nodejs/displaying_data/template_primer/index.md
@@ -11,7 +11,8 @@ Express 可以与许多不同的[模板渲染引擎](https://expressjs.com/en/gu
不同的模板语言使用不同的方法,来定义布局和标记数据的占位符 — 一些使用 HTML 来定义布局,而另一些则使用可以编译为 HTML 的不同标记格式。Pug 是第二种类型;它使用 HTML 的表示形式,其中任何行中的第一个单词,通常表示 HTML 元素,后续行中的缩进,用于表示嵌套在这些元素中的任何内容。结果是一个页面定义直接转换为 HTML,但可以说更简洁,更容易阅读。
-> **备注:** 使用 Pug 的缺点,是它对缩进和空格敏感(如果在错误的位置添加额外的空格,可能会得到没什么帮助的错误代码)。但是,一旦你的模板到位,它们就很容易阅读和维护。
+> [!NOTE]
+> 使用 Pug 的缺点,是它对缩进和空格敏感(如果在错误的位置添加额外的空格,可能会得到没什么帮助的错误代码)。但是,一旦你的模板到位,它们就很容易阅读和维护。
## 模板组态
@@ -98,7 +99,8 @@ p This is a line with #[em some emphasis] and #[strong strong text] markup.
p This line has an un-escaped string: !{' is emphasised '}, an escaped string: #{' is not emphasised '}, and escaped variables: #{title}.
```
-> **备注:** 你几乎总是希望转义来自用户的数据(通过 **`#{}`** 语法)。可信任的数据(例如,生成的记录计数等)可以不先转义就显示。
+> [!NOTE]
+> 你几乎总是希望转义来自用户的数据(通过 **`#{}`** 语法)。可信任的数据(例如,生成的记录计数等)可以不先转义就显示。
你可以在行的开头使用管道(“**|**”)字符来表示“[纯文本](https://pugjs.org/language/plain-text.html)”。例如,下面显示的附加文本,将显示在与前一个锚点相同的行上,但不会链接。
diff --git a/files/zh-cn/learn/server-side/express_nodejs/forms/create_author_form/index.md b/files/zh-cn/learn/server-side/express_nodejs/forms/create_author_form/index.md
index d93b8646a2813c..4820a3bf71782b 100644
--- a/files/zh-cn/learn/server-side/express_nodejs/forms/create_author_form/index.md
+++ b/files/zh-cn/learn/server-side/express_nodejs/forms/create_author_form/index.md
@@ -97,7 +97,8 @@ exports.author_create_post = [
此代码的结构和行为,几乎与创建`Genre`对象完全相同。首先,我们验证并清理数据。如果数据无效,那么我们将重新显示表单,以及用户最初输入的数据,和错误消息列表。如果数据有效,那么我们保存新的作者记录,并将用户重定向到作者详细信息页面。
-> **备注:** 与`Genre` post 处理程序不同,我们不会在保存之前,检查`Author`对象是否已存在。可以说,我们应该这样做,尽管现在我们可以有多个具有相同名称的作者。
+> [!NOTE]
+> 与`Genre` post 处理程序不同,我们不会在保存之前,检查`Author`对象是否已存在。可以说,我们应该这样做,尽管现在我们可以有多个具有相同名称的作者。
验证代码演示了几个新功能:
@@ -149,7 +150,8 @@ block content
此视图的结构和行为与**genre_form.pug**模板完全相同,因此我们不再对其进行描述。
-> **备注:** 某些浏览器不支持 input `type=“date”`,因此你不会获得日期选取部件或默认的*`dd/mm/yyyy`*占位符,而是获取一个空的纯文本字段。一种解决方法,是明确添加属性`placeholder='dd/mm/yyyy'`,以便在功能较少的浏览器上,仍然可以获得有关所需文本格式的信息。
+> [!NOTE]
+> 某些浏览器不支持 input `type=“date”`,因此你不会获得日期选取部件或默认的*`dd/mm/yyyy`*占位符,而是获取一个空的纯文本字段。一种解决方法,是明确添加属性`placeholder='dd/mm/yyyy'`,以便在功能较少的浏览器上,仍然可以获得有关所需文本格式的信息。
### 自我挑战:加入死亡日期
@@ -161,7 +163,8 @@ block content
![Author Create Page - Express Local Library site](locallibary_express_author_create_empty.png)
-> **备注:** 如果你尝试使用日期的各种输入格式,你可能会发现格式`yyyy-mm-dd`行为不正常。这是因为 JavaScript 将日期字符串,视为包含 0 小时的时间,但另外将该格式的日期字符串(ISO 8601 标准)视为包括 0 小时 UTC 时间,而不是本地时间。如果你的时区在 UTC 以西,则日期显示(即本地)将在你输入的日期之前一天。这是我们在这里没有解决的几个复杂问题之一(例如多字姓和有多个作者的书本)。
+> [!NOTE]
+> 如果你尝试使用日期的各种输入格式,你可能会发现格式`yyyy-mm-dd`行为不正常。这是因为 JavaScript 将日期字符串,视为包含 0 小时的时间,但另外将该格式的日期字符串(ISO 8601 标准)视为包括 0 小时 UTC 时间,而不是本地时间。如果你的时区在 UTC 以西,则日期显示(即本地)将在你输入的日期之前一天。这是我们在这里没有解决的几个复杂问题之一(例如多字姓和有多个作者的书本)。
## 下一步
diff --git a/files/zh-cn/learn/server-side/express_nodejs/forms/create_book_form/index.md b/files/zh-cn/learn/server-side/express_nodejs/forms/create_book_form/index.md
index c8163f15775364..36eb27bc6ee929 100644
--- a/files/zh-cn/learn/server-side/express_nodejs/forms/create_book_form/index.md
+++ b/files/zh-cn/learn/server-side/express_nodejs/forms/create_book_form/index.md
@@ -225,7 +225,9 @@ block content
- 种类集合显示为复选框,使用我们在控制器中设置的检查值 `checked`,来确定是否应该选中该框。
- 作者集合显示为单选下拉列表。在这种情况下,我们通过比较当前作者选项的 id 与用户先前输入的值(作为 `book` 变量传入),来确定要显示的作者。这在上面突出显示!
- > **备注:** 如果提交的表单中存在错误,那么,当要重新呈现表单时,新的书本作者仅使用字符串(作者列表中选中选项的值)进行标识。相比之下,现有的书本作者的 `_id` 属性不是字符串。因此,要比较新的和现有的,我们必须将每个现有书本作者的 `_id`,强制转换为字符串,如上所示。
+ > [!NOTE]
+ >
+ > 如果提交的表单中存在错误,那么,当要重新呈现表单时,新的书本作者仅使用字符串(作者列表中选中选项的值)进行标识。相比之下,现有的书本作者的 `_id` 属性不是字符串。因此,要比较新的和现有的,我们必须将每个现有书本作者的 `_id`,强制转换为字符串,如上所示。
## 它看起來像是?
diff --git a/files/zh-cn/learn/server-side/express_nodejs/forms/create_bookinstance_form/index.md b/files/zh-cn/learn/server-side/express_nodejs/forms/create_bookinstance_form/index.md
index b86a351be28571..b7e2b2f669d66a 100644
--- a/files/zh-cn/learn/server-side/express_nodejs/forms/create_bookinstance_form/index.md
+++ b/files/zh-cn/learn/server-side/express_nodejs/forms/create_bookinstance_form/index.md
@@ -150,7 +150,8 @@ block content
这个视图的结构和行为,几乎等同于 **book_form.pug** 模板,因此我们就不再重覆说明一次了。
-> **备注:** 以上的模板将状态值 (Maintenance, Available, 等等) 写死在代码里,而且不能 "记忆" 使用者的输入值。如果你愿意的话,考虑重新实作此列表,当表单被重新呈现时,从控制器传入选项数据,并设定选中的值。
+> [!NOTE]
+> 以上的模板将状态值 (Maintenance, Available, 等等) 写死在代码里,而且不能 "记忆" 使用者的输入值。如果你愿意的话,考虑重新实作此列表,当表单被重新呈现时,从控制器传入选项数据,并设定选中的值。
## 它看起來像是?
diff --git a/files/zh-cn/learn/server-side/express_nodejs/forms/create_genre_form/index.md b/files/zh-cn/learn/server-side/express_nodejs/forms/create_genre_form/index.md
index 0160ef3fa7da7b..8d6fbfee733623 100644
--- a/files/zh-cn/learn/server-side/express_nodejs/forms/create_genre_form/index.md
+++ b/files/zh-cn/learn/server-side/express_nodejs/forms/create_genre_form/index.md
@@ -84,7 +84,8 @@ exports.genre_create_post = [
首先要注意的是,控制器不是单个中间件函数(带参数(`req, res, next`)),而是指定一组中间件函数。数组传递给路由器函数,并按顺序调用每个方法。
-> **备注:** 这种方法是必需的,因为消毒/验证器是中间件功能。
+> [!NOTE]
+> 这种方法是必需的,因为消毒/验证器是中间件功能。
数组中的第一个方法定义了一个验证器(`body`),来检查 name 字段是否为空(在执行验证之前调用`trim()`,以删除任何尾随/前导空格)。
@@ -98,7 +99,8 @@ body('name', 'Genre name required').isLength({ min: 1 }).trim(),
sanitizeBody('name').trim().escape(),
```
-> **备注:** 验证期间运行的清洁器不会修改请求。这就是为什么我们必须在上面的两个步骤中调用`trim()`!
+> [!NOTE]
+> 验证期间运行的清洁器不会修改请求。这就是为什么我们必须在上面的两个步骤中调用`trim()`!
在指定验证器和清理器之后,我们创建了一个中间件函数,来提取任何验证错误。我们使用`isEmpty()` 来检查验证结果中,是否有任何错误。如果有,那么我们再次渲染表单,传入我们的已清理种类对象和错误消息的数组(`errors.array()`)。
@@ -196,7 +198,8 @@ block content
页面的最后一部分是错误代码。如果已定义错误变量,则只会打印错误列表(换句话说,当模板在`GET`路由上呈现时,此部分不会出现)。
-> **备注:** 这只是呈现错误的一种方法。你还可以从错误变量中,获取受影响字段的名称,并使用这些,来控制错误消息的呈现位置,以及是否应用自定义 CSS 等。
+> [!NOTE]
+> 这只是呈现错误的一种方法。你还可以从错误变量中,获取受影响字段的名称,并使用这些,来控制错误消息的呈现位置,以及是否应用自定义 CSS 等。
## 它看起來像是?
@@ -208,7 +211,8 @@ block content
![](locallibary_express_genre_create_error.png)
-> **备注:** 我们的验证使用`trim()`,来确保不接受空格作为种类名称。我们还可以在表单中 的字段定义中,添加值`required='true'`,来验证客户端字段不为空:
+> [!NOTE]
+> 我们的验证使用`trim()`,来确保不接受空格作为种类名称。我们还可以在表单中 的字段定义中,添加值`required='true'`,来验证客户端字段不为空:
>
> ```js
> input#name.form-control(type='text', placeholder='Fantasy, Poetry etc.' name='name' value=(undefined===genre ? '' : genre.name), required='true' )
diff --git a/files/zh-cn/learn/server-side/express_nodejs/forms/delete_author_form/index.md b/files/zh-cn/learn/server-side/express_nodejs/forms/delete_author_form/index.md
index 2cbc5490c21e33..7199e86c47cbd6 100644
--- a/files/zh-cn/learn/server-side/express_nodejs/forms/delete_author_form/index.md
+++ b/files/zh-cn/learn/server-side/express_nodejs/forms/delete_author_form/index.md
@@ -44,7 +44,8 @@ exports.author_delete_get = function (req, res, next) {
控制器从 URL 参数(`req.params.id`)中,获取要删除的 `Author` 实例的 id。它使用 `async.parallel()` 方法,并行获取作者记录和所有相关书本。当两个操作都完成后,它将呈现 **author_delete.pug** 视图,为 `title`、`author` 和 `author_books` 传递变量。
-> **备注:** 如果`findById()`返回“没有结果”,则作者不在数据库中。在这种情况下,没有什么可以删除,所以我们立即呈现所有作者的列表。
+> [!NOTE]
+> 如果`findById()`返回“没有结果”,则作者不在数据库中。在这种情况下,没有什么可以删除,所以我们立即呈现所有作者的列表。
>
> ```js
> }, function(err, results) {
@@ -100,7 +101,8 @@ exports.author_delete_post = function (req, res, next) {
首先,我们验证是否已提供 id(这是通过表单主体参数发送的,而不是使用 URL 中的版本)。然后我们以与 `GET` 路由相同的方式,获得作者及其相关书本。如果没有书本,那么我们删除作者对象,并重定向到所有作者的列表。如果还有书本,那么我们只需重新呈现表格,传递作者和要删除的书本列表。
-> **备注:** 我们可以检查对 `findById()` 的调用,是否返回任何结果,如果没有,则立即呈现所有作者的列表。为简洁起见,我们将代码保留在上面(如果找不到 id,它仍会返回作者列表,但这将在 `findByIdAndRemove()` 之后发生)。
+> [!NOTE]
+> 我们可以检查对 `findById()` 的调用,是否返回任何结果,如果没有,则立即呈现所有作者的列表。为简洁起见,我们将代码保留在上面(如果找不到 id,它仍会返回作者列表,但这将在 `findByIdAndRemove()` 之后发生)。
## 视图
@@ -146,7 +148,8 @@ block content
接下来,我们将向 Author 详细视图添加 **Delete** 控件(详细信息页面是删除记录的好地方)。
-> **备注:** 在完整实现中,控件将仅对授权用户可见。但是在这个时间点上,我们还没有一个授权系统!
+> [!NOTE]
+> 在完整实现中,控件将仅对授权用户可见。但是在这个时间点上,我们还没有一个授权系统!
打开 **author_detail.pug** 视图,并在底部添加以下行。
@@ -172,7 +175,8 @@ p
![](locallibary_express_author_delete_withbooks.png)
-> **备注:** 其他删除对象的页面,可以用相同的方式实现。我们把它留下,作为挑战。
+> [!NOTE]
+> 其他删除对象的页面,可以用相同的方式实现。我们把它留下,作为挑战。
## 下一步
diff --git a/files/zh-cn/learn/server-side/express_nodejs/forms/index.md b/files/zh-cn/learn/server-side/express_nodejs/forms/index.md
index be9fb0d84e8862..6ab29bf1ed0b47 100644
--- a/files/zh-cn/learn/server-side/express_nodejs/forms/index.md
+++ b/files/zh-cn/learn/server-side/express_nodejs/forms/index.md
@@ -37,7 +37,8 @@ slug: Learn/Server-side/Express_Nodejs/forms
此教程将展示上述的操作,如何在 _Express_ 中实现。在此过程中,我们将扩展 LocalLibrary 网站,以允许用户创建,编辑和删除图书馆中的项目。
-> **备注:** 我们还没有考虑如何将特定路由,限制为经过身份验证或授权的用户,因此在这个时间点,任何用户都可以对数据库进行更改。
+> [!NOTE]
+> 我们还没有考虑如何将特定路由,限制为经过身份验证或授权的用户,因此在这个时间点,任何用户都可以对数据库进行更改。
### HTML 表单
@@ -114,7 +115,8 @@ npm install express-validator --save
#### 使用 express-validator
-> **备注:** Github 上的[express-validator](https://github.com/ctavan/express-validator#express-validator)指南,提供了 API 的良好概述。我们建议你阅读该内容,以了解其所有功能(包括创建自定义验证程序)。下面我们只介绍一个对 LocalLibrary 有用的子集。
+> [!NOTE]
+> Github 上的[express-validator](https://github.com/ctavan/express-validator#express-validator)指南,提供了 API 的良好概述。我们建议你阅读该内容,以了解其所有功能(包括创建自定义验证程序)。下面我们只介绍一个对 LocalLibrary 有用的子集。
要在我们的控制器中使用验证器,我们必须从'**express-validator/check**'和'**express-validator/filter**'模块中,导入我们想要使用的函数,如下所示:
@@ -141,7 +143,9 @@ const { sanitizeBody } = require("express-validator/filter");
.isAlpha().withMessage('Name must be alphabet letters.'),
```
- > **备注:** 你还可以添加内联清理器,如`trim()`,如上所示。但是,此处应用清理器,仅适用于验证步骤。如果要对最终输出进行消毒,则需要使用单独的清理器方法,如下所示。
+ > [!NOTE]
+ >
+ > 你还可以添加内联清理器,如`trim()`,如上所示。但是,此处应用清理器,仅适用于验证步骤。如果要对最终输出进行消毒,则需要使用单独的清理器方法,如下所示。
- [`sanitizeBody(fields)`](https://github.com/ctavan/express-validator#sanitizebodyfields): 指定一个正文要清理的字段。然后将清理操作,以菊花链形式连接到此方法。例如,下面的`escape()`清理操作,会从名称变量中,删除可能在 JavaScript 跨站点脚本攻击中使用的 HTML 字符。
@@ -197,7 +201,8 @@ const { sanitizeBody } = require("express-validator/filter");
哦,如果你涉及文件上传,那么你可能需要“[multer](https://blog.csdn.net/qq_43624878/article/details/103607944)”中间件,你大概听说过“formidable”,但 multer 比它更强大!
-> **备注:** 更“牢固”的实现,可能允许你在创建新对象时创建依赖对象,并随时删除任何对象(例如,通过删除依赖对象,或从数据库中,删除对已删除对象的引用) 。
+> [!NOTE]
+> 更“牢固”的实现,可能允许你在创建新对象时创建依赖对象,并随时删除任何对象(例如,通过删除依赖对象,或从数据库中,删除对已删除对象的引用) 。
### 路由
diff --git a/files/zh-cn/learn/server-side/express_nodejs/forms/update_book_form/index.md b/files/zh-cn/learn/server-side/express_nodejs/forms/update_book_form/index.md
index a5b556300cdf17..91c3b0ddc08313 100644
--- a/files/zh-cn/learn/server-side/express_nodejs/forms/update_book_form/index.md
+++ b/files/zh-cn/learn/server-side/express_nodejs/forms/update_book_form/index.md
@@ -187,7 +187,8 @@ exports.book_update_post = [
option(value=author._id) #{author.name}
```
-> **备注:** 此处代码的更动,是为了让书本表单 book_form,能被创建和更新书本的对象共同使用 (如果不这么做,当创建表单时,在 `GET` 路由会发生一个错误)。
+> [!NOTE]
+> 此处代码的更动,是为了让书本表单 book_form,能被创建和更新书本的对象共同使用 (如果不这么做,当创建表单时,在 `GET` 路由会发生一个错误)。
## 加入一个更新按钮
@@ -211,7 +212,8 @@ exports.book_update_post = [
![](locallibary_express_book_update_noerrors.png)
-> **备注:** 其他更新对象的页面,也可以用同样的方式处理。我们把这些更新页面的实作留下,做为自我挑战。
+> [!NOTE]
+> 其他更新对象的页面,也可以用同样的方式处理。我们把这些更新页面的实作留下,做为自我挑战。
## 下一步
diff --git a/files/zh-cn/learn/server-side/express_nodejs/index.md b/files/zh-cn/learn/server-side/express_nodejs/index.md
index 2d8dba7aecfba3..b69ddb07773e19 100644
--- a/files/zh-cn/learn/server-side/express_nodejs/index.md
+++ b/files/zh-cn/learn/server-side/express_nodejs/index.md
@@ -11,7 +11,8 @@ Express 是一款受欢迎的开源 web 框架,构建语言是 JavaScript,
在开始这个模块之前你需要知道什么是服务端网页编程和 web 框架,建议你先阅读 [服务端网页编程](/zh-CN/docs/Learn/Server-side) 模块。强烈推荐了解编程概念和 [JavaScript](/zh-CN/docs/Web/JavaScript) ,但这对理解核心概念不是必需的。
-> **备注:** 这个网站有很多有用的资源用来学习 JavaScript 做客户端开发: [JavaScript](/zh-CN/docs/Web/JavaScript), [JavaScript Guide](/zh-CN/docs/Web/JavaScript/Guide), [JavaScript Basics](/zh-CN/docs/Learn/Getting_started_with_the_web/JavaScript_basics), [JavaScript](/zh-CN/docs/Learn/JavaScript) (learning). 核心的 JavaScript 语言和概念用 Nodejs 服务端开发是相同的,也是相关的。Node.js 提供 [额外的 API](https://nodejs.org/dist/latest-v6.x/docs/api/) 用于支持在无浏览器环境中有用的功能,例如,创建 HTTP 服务器并访问文件系统,但不支持 JavaScript API 以使用浏览器和 DOM。
+> [!NOTE]
+> 这个网站有很多有用的资源用来学习 JavaScript 做客户端开发: [JavaScript](/zh-CN/docs/Web/JavaScript), [JavaScript Guide](/zh-CN/docs/Web/JavaScript/Guide), [JavaScript Basics](/zh-CN/docs/Learn/Getting_started_with_the_web/JavaScript_basics), [JavaScript](/zh-CN/docs/Learn/JavaScript) (learning). 核心的 JavaScript 语言和概念用 Nodejs 服务端开发是相同的,也是相关的。Node.js 提供 [额外的 API](https://nodejs.org/dist/latest-v6.x/docs/api/) 用于支持在无浏览器环境中有用的功能,例如,创建 HTTP 服务器并访问文件系统,但不支持 JavaScript API 以使用浏览器和 DOM。
>
> 这篇指南将会提供一些 Node.js 和 Express 的信息,并且有很多优秀的网络资源和书籍。一些链接 比如[How do I get started with Node.js](http://stackoverflow.com/a/5511507/894359) (StackOverflow) 和 [What are the best resources for learning Node.js?](https://www.quora.com/What-are-the-best-resources-for-learning-Node-js?) (Quora).
diff --git a/files/zh-cn/learn/server-side/express_nodejs/introduction/index.md b/files/zh-cn/learn/server-side/express_nodejs/introduction/index.md
index 644034216a8dda..d6a031cee2615a 100644
--- a/files/zh-cn/learn/server-side/express_nodejs/introduction/index.md
+++ b/files/zh-cn/learn/server-side/express_nodejs/introduction/index.md
@@ -98,7 +98,8 @@ Node 本身并不支持其他常见的 web 开发任务。如果需要进行一
虽然 Express 本身是极简风格的,但是开发人员通过创建各类兼容的中间件包解决了几乎所有的 web 开发问题。这些库可以实现 cookie、会话、用户登录、URL 参数、`POST` 数据、安全头等功能。可在 [Express 中间件](https://www.expressjs.com.cn/resources/middleware.html) 网页中找到由 Express 团队维护的中间件软件包列表(还有一张流行的第三方软件包列表)。
-> **备注:** 这种灵活性是一把双刃剑。虽然有一些中间件包可以解决几乎所有问题或需求,但是挑选合适的包有时也会成为一个挑战。这里构建应用没有“不二法门”,Internet 上许多示例也不是最优的,或者只展示了开发 web 应用所需工作的冰山一角。
+> [!NOTE]
+> 这种灵活性是一把双刃剑。虽然有一些中间件包可以解决几乎所有问题或需求,但是挑选合适的包有时也会成为一个挑战。这里构建应用没有“不二法门”,Internet 上许多示例也不是最优的,或者只展示了开发 web 应用所需工作的冰山一角。
## Node 和 Express 从哪儿来?
@@ -136,7 +137,8 @@ Express 是高度包容的。几乎可以将任何兼容的中间件以任意顺
首先来看 Express 的 [Hello World](https://www.expressjs.com.cn/starter/hello-world.html) 的示例(下文将逐行讨论)。
-> **备注:** 如果你已经安装了 Node 和 Express(或者你已经按照 [下一节](/zh-CN/docs/Learn/Server-side/Express_Nodejs/development_environment) 中的说明安装好了),可以将此代码保存为 **app.js**,并通过在 bash 中这样运行它:
+> [!NOTE]
+> 如果你已经安装了 Node 和 Express(或者你已经按照 [下一节](/zh-CN/docs/Learn/Server-side/Express_Nodejs/development_environment) 中的说明安装好了),可以将此代码保存为 **app.js**,并通过在 bash 中这样运行它:
>
> ```bash
> node ./app.js
@@ -174,7 +176,8 @@ const app = express();
还可以创建自定义模块,并用相同的方法导入。
-> **备注:** 你一定会有自建模块的**需求**,因为这可以让代码管理更有序。单文件应用是很难理解和维护的。使用模块还有助于管理名字空间,因为在使用模块时只会导入模块中显式导出的变量。
+> [!NOTE]
+> 你一定会有自建模块的**需求**,因为这可以让代码管理更有序。单文件应用是很难理解和维护的。使用模块还有助于管理名字空间,因为在使用模块时只会导入模块中显式导出的变量。
为了让对象暴露于模块之外,只需把它们设置为 `exports` 对象的附加属性即可。例如,下面的 **square.js** 模块就是一个导出了 `area()` 和 `perimeter()` 方法的文件:
@@ -195,7 +198,8 @@ const square = require("./square");
console.log("边长为 4 的正方形面积为 " + square.area(4));
```
-> **备注:** 为模块指定绝对路径(或模块的名字,见最初的示例)也是可行的。
+> [!NOTE]
+> 为模块指定绝对路径(或模块的名字,见最初的示例)也是可行的。
一次赋值不仅能构建一个单一的属性,还能构建一个完整的对象,可以像下面这样把对象赋值给 `module.exports`(也可以让 `exports` 对象直接作为一个构造器或另一个函数):
@@ -210,7 +214,8 @@ module.exports = {
};
```
-> **备注:** 在一个既定的模块内,可以把 `exports` 想象成 `module.exports` 的 [快捷方式](https://nodejs.cn/api/modules.html#modules_exports_shortcut)。`exports` 本质上就是在模块初始化前为 `module.exports` 的值进行初始化的一个变量。这个值是对一个对象(这里是空对象)的引用。这意味着 `exports` 与 `module.exports` 引用了同一个对象,也意味着如果为 `exports` 赋其他值不会影响到 `module.exports`。
+> [!NOTE]
+> 在一个既定的模块内,可以把 `exports` 想象成 `module.exports` 的 [快捷方式](https://nodejs.cn/api/modules.html#modules_exports_shortcut)。`exports` 本质上就是在模块初始化前为 `module.exports` 的值进行初始化的一个变量。这个值是对一个对象(这里是空对象)的引用。这意味着 `exports` 与 `module.exports` 引用了同一个对象,也意味着如果为 `exports` 赋其他值不会影响到 `module.exports`。
更多信息请参阅 [模块](https://nodejs.cn/api/modules.html)(Node API 文档)。
@@ -236,9 +241,11 @@ console.log("第二");
有多种方法可以让一个异步 API 通知当前应用它已执行完毕。最常用的是在调用异步 API 时注册一个回调函数,在 API 操作结束后将“回调”之。这也是上面的代码所使用的方法。
-> **备注:** 如果有一系列独立的异步操作必须按顺序执行,那么使用回调可能会非常“混乱”,因为这会导致多级嵌套回调。人们通常把这个问题叫做“回调地狱”。缓解这个问题有以下办法:良好的编码实践(参考 )、使用 [async](https://www.npmjs.com/package/async) 等模块、迁移至 ES6 并使用 [Promise](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise) 等特性。
+> [!NOTE]
+> 如果有一系列独立的异步操作必须按顺序执行,那么使用回调可能会非常“混乱”,因为这会导致多级嵌套回调。人们通常把这个问题叫做“回调地狱”。缓解这个问题有以下办法:良好的编码实践(参考 )、使用 [async](https://www.npmjs.com/package/async) 等模块、迁移至 ES6 并使用 [Promise](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise) 等特性。
-> **备注:** Node 和 Express 有一个一般性约定,即:使用“错误优先”回调。这个约定要求回调函数的第一个参数是错误值,而后续的参数包含成功数据。以下博文很好的解释了这个方法的有效性:[以 Node.js 之名:理解错误优先回调](https://fredkschott.com/post/2014/03/understanding-error-first-callbacks-in-node-js/)(fredkschott.com 英文文章)
+> [!NOTE]
+> Node 和 Express 有一个一般性约定,即:使用“错误优先”回调。这个约定要求回调函数的第一个参数是错误值,而后续的参数包含成功数据。以下博文很好的解释了这个方法的有效性:[以 Node.js 之名:理解错误优先回调](https://fredkschott.com/post/2014/03/understanding-error-first-callbacks-in-node-js/)(fredkschott.com 英文文章)
### 创建路由处理器(Route handler)
@@ -252,7 +259,8 @@ app.get("/", (req, res) => {
回调函数将请求和响应对象作为参数。该函数直接调用响应的 `send()` 以返回字符串“Hello World!”。有 [许多其他响应方法](https://www.expressjs.com.cn/guide/routing.html#response-methods) 可以结束请求/响应周期,例如,通过调用 `res.json()` 来发送 JSON 响应、调用 `res.sendFile()` 来发送文件。
-> **备注:** 虽然回调函数的参数命名没有限制,但是当调用回调时,第一个参数将始终是请求,第二个参数将始终是响应。合理的命名它们,在回调体中使用的对象将更容易识别。
+> [!NOTE]
+> 虽然回调函数的参数命名没有限制,但是当调用回调时,第一个参数将始终是请求,第二个参数将始终是响应。合理的命名它们,在回调体中使用的对象将更容易识别。
**Express 应用**对象还提供了为其他所有 HTTP 动词定义路由处理器的方法,大多数处理器的使用方式完全一致:
@@ -290,7 +298,8 @@ router.get("/about", (req, res) => {
module.exports = router;
```
-> **备注:** 向 `Router` 对象添加路由就像向之前为 `app` 对象添加路由一样。
+> [!NOTE]
+> 向 `Router` 对象添加路由就像向之前为 `app` 对象添加路由一样。
首先 `require()` 路由模块(**wiki.js**),然后在 Express 应用中调用 `use()` 把 `Router` 添加到中间件处理路径中,就可以在主应用中使用这个模块中的路由处理器了。路由路径有两条:`/wiki` 和 `/wiki/about/`。
@@ -306,7 +315,8 @@ app.use("/wiki", wiki);
中间件在 Express 应用中得到了广泛使用,从提供错误处理静态文件、到压缩 HTTP 响应等等。路由函数可以通过向 HTTP 客户端返回一些响应来结束 HTTP“请求 - 响应”周期,而中间件函数*通常是*对请求或响应执行某些操作,然后调用“栈”里的下一个函数,可能是其他中间件或路由处理器。中间件的调用顺序由应用开发者决定。
-> **备注:** 中间件可以执行任何操作,运行任何代码,更改请求和响应对象,也可以**结束“请求 - 响应”周期**。如果它没有结束循环,则必须调用 `next()` 将控制传递给下一个中间件函数(否则请求将成为悬挂请求)。
+> [!NOTE]
+> 中间件可以执行任何操作,运行任何代码,更改请求和响应对象,也可以**结束“请求 - 响应”周期**。如果它没有结束循环,则必须调用 `next()` 将控制传递给下一个中间件函数(否则请求将成为悬挂请求)。
大多数应用会使用**第三方**中间件来简化常见的 web 开发任务,比如 cookie、会话、用户身份验证、访问请求 `POST` 和 JSON 数据,日志记录等。参见 [Express 团队维护的中间件包列表](https://www.expressjs.com.cn/resources/middleware.html)(包含受欢迎的第三方包)。NPM 有提供其他 Express 包。
@@ -326,7 +336,8 @@ app.use(logger('dev'));
...
```
-> **备注:** 中间件和路由函数是按声明顺序调用的。一些中间件的引入顺序很重要(例如,如果会话中间件依赖于 cookie 中间件,则必须先添加 cookie 处理器)。绝大多数情况下要先调用中间件后设置路由,否则路由处理器将无法访问中间件的功能。
+> [!NOTE]
+> 中间件和路由函数是按声明顺序调用的。一些中间件的引入顺序很重要(例如,如果会话中间件依赖于 cookie 中间件,则必须先添加 cookie 处理器)。绝大多数情况下要先调用中间件后设置路由,否则路由处理器将无法访问中间件的功能。
可以自己编写中间件函数,这是基本技能(仅仅为了创建错误处理代码也需要)。中间件函数和路由处理回调之间的**唯一**区别是:中间件函数有第三个参数 `next`,在中间件不会结束请求周期时应调用这个 `next`(它包含中间件函数调用后应调用的**下一个**函数)。
@@ -356,7 +367,8 @@ app.get("/", a_middleware_function);
app.listen(3000);
```
-> **备注:** 上面代码中单独声明了中间件函数,并把它设置为回调。之前是把路由处理函数在使用时声明为回调。在 JavaScript 中,两种方法都可行。
+> [!NOTE]
+> 上面代码中单独声明了中间件函数,并把它设置为回调。之前是把路由处理函数在使用时声明为回调。在 JavaScript 中,两种方法都可行。
请参阅 Express 文档中关于 [使用](https://www.expressjs.com.cn/guide/using-middleware.html) 和 [开发](https://www.expressjs.com.cn/guide/writing-middleware.html) Express 中间件的内容。
@@ -415,9 +427,11 @@ app.use((err, req, res, next) => {
Express 内建了错误处理机制,可以协助处理 app 中没有被处理的错误。默认的错误处理中间件函数在中间件函数栈的末尾。如果一个错误传递给 `next()` 而没有用错误处理器来处理它,内建处理机制将启动,栈跟踪的错误将回写给客户端。
-> **备注:** 生产环境中不保留栈跟踪轨迹。可将环境变量 `NODE_ENV` 设置为 `'production'` 来运行所需的生产环境。
+> [!NOTE]
+> 生产环境中不保留栈跟踪轨迹。可将环境变量 `NODE_ENV` 设置为 `'production'` 来运行所需的生产环境。
-> **备注:** HTTP 404 和其他“错误”状态码不作为错误处理。可使用中间件来自行处理这些状态。更多信息请参阅 Express 文档 [FAQ](https://www.expressjs.com.cn/starter/faq.html#如何处理-404-响应)。
+> [!NOTE]
+> HTTP 404 和其他“错误”状态码不作为错误处理。可使用中间件来自行处理这些状态。更多信息请参阅 Express 文档 [FAQ](https://www.expressjs.com.cn/starter/faq.html#如何处理-404-响应)。
更多信息请参阅 Express 文档 [错误处理](https://www.expressjs.com.cn/guide/error-handling.html)。
diff --git a/files/zh-cn/learn/server-side/express_nodejs/mongoose/index.md b/files/zh-cn/learn/server-side/express_nodejs/mongoose/index.md
index bb7d0331ac2a30..be19277ba6bbe0 100644
--- a/files/zh-cn/learn/server-side/express_nodejs/mongoose/index.md
+++ b/files/zh-cn/learn/server-side/express_nodejs/mongoose/index.md
@@ -49,7 +49,8 @@ Express 应用可以使用 Node 支持的所有数据库(Express 本身不支
使用 ORM 的好处是:程序员可以继续用 JavaScript 对象的思维而不用转向数据库语义的思维。在(同一个或不同网站)使用不同数据库时尤为明显。使用 ORM 还可以更方便地对数据进行验证和检查。
-> **备注:** 使用 ODM / ORM 通常可以降低开发和维护成本!除非你非常熟悉本地查询语言,或者项目对性能要求很高,否则强烈推荐使用 ODM。
+> [!NOTE]
+> 使用 ODM / ORM 通常可以降低开发和维护成本!除非你非常熟悉本地查询语言,或者项目对性能要求很高,否则强烈推荐使用 ODM。
### 我应该使用哪种 ORM/ODM ?
@@ -73,7 +74,8 @@ NPM 站点上有许多 ODM / ORM 解决方案(另请参阅 NPM 站点上的 [o
这种 ODM 和数据库的结合方式在 Node 社区中非常流行,一定程度上是因为文档存储和查询系统与 JSON 十分相似,因此 JavaScript 开发人员会非常熟悉。
-> **备注:** 使用 Mongoose 无需事先了解 MongoDB,但是部分 [Mongoose 文档](http://mongoosejs.com/docs/guide.html) 对于熟悉 MongoDB 的朋友会更易于使用和理解。
+> [!NOTE]
+> 使用 Mongoose 无需事先了解 MongoDB,但是部分 [Mongoose 文档](http://mongoosejs.com/docs/guide.html) 对于熟悉 MongoDB 的朋友会更易于使用和理解。
下面将介绍如何为 [LocalLibrary 网站](/zh-CN/docs/Learn/Server-side/Express_Nodejs/Tutorial_local_library_website) 定义和访问 Mongoose 模式和模型。
@@ -91,17 +93,20 @@ NPM 站点上有许多 ODM / ORM 解决方案(另请参阅 NPM 站点上的 [o
下图还展示了模型之间的关系以及重复度(Multiplicity)。重复度就是图中两框间连线两端的数字,表示两个模型之间存在的关系的数量(最大值和最小值)。例如,`Book` 框和 `Genre` 框之间有连线说明二者之间存在关系,`Book` 模型端的数字(0..\*)表示一个种类必包括零种或多种藏书(多少都可以),而 `Genre` 端的数字表示一种藏书可以有零个或多个种类。
-> **备注:** 正如下文 [Mongoose 入门](#) 中所讲,通常应该把定义文档/模型关系的字段置于同一模型中(仍可通过在搜索相关 `_id` 来回寻模型间的关系)。以下的 Book 模式中定义了 Book/Genre 和 Book/Author 关系,BookInstance 模式中定义了 Book/BookInstance 关系。这样做是简便起见,但稍存歧义,让这些字段存在于其他模式中也是可以的。
+> [!NOTE]
+> 正如下文 [Mongoose 入门](#) 中所讲,通常应该把定义文档/模型关系的字段置于同一模型中(仍可通过在搜索相关 `_id` 来回寻模型间的关系)。以下的 Book 模式中定义了 Book/Genre 和 Book/Author 关系,BookInstance 模式中定义了 Book/BookInstance 关系。这样做是简便起见,但稍存歧义,让这些字段存在于其他模式中也是可以的。
![Mongoose Library Model with correct cardinality](library_website_-_mongoose_express.png)
-> **备注:** 下面是一段入门知识,讲解如何定义和使用模型。请在阅读时想想将如何构建上图中的模型。
+> [!NOTE]
+> 下面是一段入门知识,讲解如何定义和使用模型。请在阅读时想想将如何构建上图中的模型。
## Mongoose 入门
这一段将简要介绍如何将 Mongoose 连接到 MongoDB 数据库,如何定义模式和模型,以及如何进行基本查询。
-> **备注:** 本入门受到 npm 上的 [Mongoose 快速入门](https://www.npmjs.com/package/mongoose) 和 [Mongoose 官方文档](http://mongoosejs.com/docs/guide.html) 的“深度影响”。
+> [!NOTE]
+> 本入门受到 npm 上的 [Mongoose 快速入门](https://www.npmjs.com/package/mongoose) 和 [Mongoose 官方文档](http://mongoosejs.com/docs/guide.html) 的“深度影响”。
### 安装 Mongoose 和 MongoDB
@@ -113,7 +118,8 @@ npm install mongoose
安装 Mongoose 会添加所有依赖项,包括 MongoDB 数据库驱动程序,但不会安装 MongoDB 本身。要安装 MongoDB 服务器,可以 [点击下载](https://www.mongodb.com/download-center) 各操作系统的安装程序在本地安装。也可以使用云端 MongoDB 实例。
-> **备注:** 本教程选用 mLab 提供的 [沙箱级](https://mlab.com/plans/pricing/) 云端“数据库即服务”(Database as a Service,DBaaS)。它适用于开发环境,且部署过程与操作系统无关(DBaaS 也适用于生产环境)。
+> [!NOTE]
+> 本教程选用 mLab 提供的 [沙箱级](https://mlab.com/plans/pricing/) 云端“数据库即服务”(Database as a Service,DBaaS)。它适用于开发环境,且部署过程与操作系统无关(DBaaS 也适用于生产环境)。
### 连接到 MongoDB
@@ -137,7 +143,8 @@ db.on("error", console.error.bind(console, "MongoDB 连接错误:"));
可以用 `mongoose.connection` 取得默认的 `Connection` 对象。一旦连接,`Connection` 实例将触发打开事件。
-> **备注:** 可以使用 `mongoose.createConnection()` 创建其他连接。该函数与 `connect()` 的参数(数据库 URI,包括主机地址、数据库名、端口、选项等)一致,并返回一个 `Connection` 对象。
+> [!NOTE]
+> 可以使用 `mongoose.createConnection()` 创建其他连接。该函数与 `connect()` 的参数(数据库 URI,包括主机地址、数据库名、端口、选项等)一致,并返回一个 `Connection` 对象。
### 定义和添加模型
@@ -145,7 +152,8 @@ db.on("error", console.error.bind(console, "MongoDB 连接错误:"));
`mongoose.model()` 方法将模式“编译”为模型。模型就可以用来查找、创建、更新和删除特定类型的对象。
-> **备注:** MongoDB 数据库中,每个模型都映射至一组文档。这些文档包含 `Schema` 模型定义的字段名/模式类型。
+> [!NOTE]
+> MongoDB 数据库中,每个模型都映射至一组文档。这些文档包含 `Schema` 模型定义的字段名/模式类型。
#### 定义模式
@@ -185,7 +193,8 @@ const SomeModel = mongoose.model("SomeModel", SomeModelSchema);
第一个参数是为模型所创建集合的别名(Mongoose 将为 SomeModel 模型创建数据库集合),第二个参数是创建模型时使用的模式。
-> **备注:** 定义模型类后,可以使用它们来创建、更新或删除记录,以及通过查询来获取所有记录或特定子集。我们将在以下“[使用模型](#)”部分展示,包括创建视图的情况。
+> [!NOTE]
+> 定义模型类后,可以使用它们来创建、更新或删除记录,以及通过查询来获取所有记录或特定子集。我们将在以下“[使用模型](#)”部分展示,包括创建视图的情况。
#### 模式类型(字段)
@@ -260,7 +269,8 @@ const breakfastSchema = new Schema({
虚拟属性是可以获取和设置、但不会保存到 MongoDB 的文档属性。getter 可用于格式化或组合字段,而 setter 可用于将单个值分解为多个值从而便于存储。文档中的示例,从名字和姓氏字段构造(并解构)一个全名虚拟属性,这比每次在模板中使用全名更简单,更清晰。
-> **备注:** 我们将使用库中的一个虚拟属性,用路径和记录的 `_id` 来为每个模型记录定义唯一的 URL。
+> [!NOTE]
+> 我们将使用库中的一个虚拟属性,用路径和记录的 `_id` 来为每个模型记录定义唯一的 URL。
更多信息请参阅 [虚拟属性](http://mongoosejs.com/docs/guide.html#virtuals)(Mongoose 英文文档)。
@@ -336,7 +346,8 @@ Athlete.find({ sport: "Tennis" }, "name age", function (err, athletes) {
若像上述代码那样指定回调,则查询将立即执行。搜索完成后将调用回调。
-> **备注:** Mongoose 中所有回调都使用 `callback(error, result)` 模式。如果查询时发生错误,则参数 `error` 将包含错误文档,`result` 为 `null`。如果查询成功,则 `error`为 `null`,查询结果将填充至 `result` 。
+> [!NOTE]
+> Mongoose 中所有回调都使用 `callback(error, result)` 模式。如果查询时发生错误,则参数 `error` 将包含错误文档,`result` 为 `null`。如果查询成功,则 `error`为 `null`,查询结果将填充至 `result` 。
若未指定回调,则 API 将返回 [Query](http://mongoosejs.com/docs/api.html#query-js) 类型的变量。可以使用该查询对象来构建查询,随后使用 `exec()` 方法执行(使用回调)。
@@ -382,7 +393,8 @@ Athlete.find()
- [`findOne()`](http://mongoosejs.com/docs/api.html#query_Query-findOne):查找与指定条件匹配的第一个文档。
- [`findByIdAndRemove()`](http://mongoosejs.com/docs/api.html#model_Model.findByIdAndRemove)、[`findByIdAndUpdate()`](http://mongoosejs.com/docs/api.html#model_Model.findByIdAndUpdate)、[`findOneAndRemove()`](http://mongoosejs.com/docs/api.html#query_Query-findOneAndRemove)、 [`findOneAndUpdate()`](http://mongoosejs.com/docs/api.html#query_Query-findOneAndUpdate):通过 `id` 或条件查找单个文档,并进行更新或删除。以上是更新和删除记录的便利函数。
-> **备注:** 还有一个 [`count()`](http://mongoosejs.com/docs/api.html#model_Model.count) 方法,可获取匹配条件的项目的个数。在只期望获得记录的个数而不想获取实际的记录时可以使用。
+> [!NOTE]
+> 还有一个 [`count()`](http://mongoosejs.com/docs/api.html#model_Model.count) 方法,可获取匹配条件的项目的个数。在只期望获得记录的个数而不想获取实际的记录时可以使用。
查询还能做更多。请参阅 [查询](http://mongoosejs.com/docs/queries.html)(Mongoose 英文文档)。
@@ -448,7 +460,8 @@ Story.findOne({ title: "司马迁是历史学家" })
});
```
-> **备注:** 目光敏锐的读者可能会注意到,新的简介添加了作者,但并没有添加到 `stories` 数组中。那么怎样才能得到指定作者的所有简介?考虑把作者添加到 `stories` 数组中,但会导致作者和简介相关信息的要在两处进行维护。
+> [!NOTE]
+> 目光敏锐的读者可能会注意到,新的简介添加了作者,但并没有添加到 `stories` 数组中。那么怎样才能得到指定作者的所有简介?考虑把作者添加到 `stories` 数组中,但会导致作者和简介相关信息的要在两处进行维护。
>
> 更好的方法是获取作者的 `_id`,然后使用 `find()` 在所有简介的作者字段中搜索。
>
@@ -500,9 +513,11 @@ SomeModel.find(callback_function);
本教程将使用 [mLab](https://mlab.com/welcome/) 免费版“[沙盒](https://mlab.com/plans/pricing/)”云数据库。这一版不适用于生产环境,因为它没有冗余设计,但非常适合进行开发和原型设计。选用它是因为它免费且易于设置,并且 mLab 是一家流行的数据库服务供应商,也是生产环境数据库的理想选择(撰写本文时(2019 年 1 月),国内流行的云数据库解决方案有 [阿里云](https://www.aliyun.com/product/mongodb?spm=5176.10695662.778269.1.2e5b8cb3Hw9HUr)、[腾讯云](https://cloud.tencent.com/product/mongodb)、[百度云](https://cloud.baidu.com/product/mongodb.html) 等)。
-> **备注:** 也可以下载并安装 [对应系统的安装包](https://www.mongodb.com/download-center),设置本地版 MongoDB 数据库。多数指令和使用云数据库是一样的,除了连接时数据库的 URL。
+> [!NOTE]
+> 也可以下载并安装 [对应系统的安装包](https://www.mongodb.com/download-center),设置本地版 MongoDB 数据库。多数指令和使用云数据库是一样的,除了连接时数据库的 URL。
-> **备注:** 目前 mLab 网站在国内速度很慢,若遇到无法正常注册或登录的情况可以考虑本地版 MongoDB。
+> [!NOTE]
+> 目前 mLab 网站在国内速度很慢,若遇到无法正常注册或登录的情况可以考虑本地版 MongoDB。
首先 [用 mLab 创建一个账户](https://mlab.com/signup/)(这是免费的,只需要输入基本联系信息,并同意服务条款)。
@@ -620,7 +635,8 @@ module.exports = mongoose.model("Author", AuthorSchema);
我们还为 `AuthorSchema` 声明了一个 "`url`" 虚拟属性,以返回模型特定实例的绝对 URL。在模板中需要获取特定作者的链接时可使用该属性。
-> **备注:** 有必要将 URL 声明为虚拟属性,因为这样,项目的 URL 就只需在一处进行更改。
+> [!NOTE]
+> 有必要将 URL 声明为虚拟属性,因为这样,项目的 URL 就只需在一处进行更改。
> 此时,使用此 URL 的链接还不能工作,因为目前还没有设置任何路由,无法处理特定模型实例的代码。这个问题下节再讲。
模块的最后对模型进行导出。
@@ -714,7 +730,9 @@ module.exports = mongoose.model("BookInstance", BookInstanceSchema);
1. 下载(或新建)文件 [populatedb.js](https://raw.githubusercontent.com/mdn/express-locallibrary-tutorial/master/populatedb.js),保存在 express-locallibrary-tutorial 目录(`package.json` 所在位置) 。
- > **备注:** 无需深究 [populatedb.js](https://raw.githubusercontent.com/mdn/express-locallibrary-tutorial/master/populatedb.js),它只是为数据库添加一些示例数据。
+ > [!NOTE]
+ >
+ > 无需深究 [populatedb.js](https://raw.githubusercontent.com/mdn/express-locallibrary-tutorial/master/populatedb.js),它只是为数据库添加一些示例数据。
>
> 译注:针对 node.js3.0 及以后版本,mlab 使用“mongodb+srv://”链接而非“mongodb://”,请对[populatedb.js](https://raw.githubusercontent.com/mdn/express-locallibrary-tutorial/master/populatedb.js)源码酌情修改,否则会报错而添加数据失败。
@@ -732,7 +750,8 @@ module.exports = mongoose.model("BookInstance", BookInstanceSchema);
4. 该脚本应一路运行至完成,并在终端中记录所创建的项目。
-> **备注:** 打开 [mLab](https://mlab.com/home) 数据库主页面,现在藏书、作者、种类和藏书副本的集合应该都可以打开了,也可以查看单个文档。
+> [!NOTE]
+> 打开 [mLab](https://mlab.com/home) 数据库主页面,现在藏书、作者、种类和藏书副本的集合应该都可以打开了,也可以查看单个文档。
## 小结
diff --git a/files/zh-cn/learn/server-side/express_nodejs/routes/index.md b/files/zh-cn/learn/server-side/express_nodejs/routes/index.md
index e1f6f30af28938..712e4eb4b71cf1 100644
--- a/files/zh-cn/learn/server-side/express_nodejs/routes/index.md
+++ b/files/zh-cn/learn/server-side/express_nodejs/routes/index.md
@@ -82,7 +82,8 @@ router.get("/about", (req, res) => {
module.exports = router;
```
-> **备注:** 上面的路由处理回调直接定义在了路由函数中。LocalLibrary 的回调将定义在单独的控制器模块中。
+> [!NOTE]
+> 上面的路由处理回调直接定义在了路由函数中。LocalLibrary 的回调将定义在单独的控制器模块中。
要在主应用中使用该路由模块,首先应 `require` 它(**wiki.js**),然后对 Express 应用对象调用 `use()`(指定路径‘/wiki’),即可将其添加到中间件处理路径。
@@ -106,7 +107,8 @@ router.get("/about", (req, res) => {
该回调有三个参数(通常命名为:`req`、`res`、`next`),分别是:HTTP 请求对象、HTTP 响应、中间件链中的下一个函数。
-> **备注:** 路由函数就是 [Express 中间件](/zh-CN/docs/Learn/Server-side/Express_Nodejs/Introduction#Using_middleware),这意味着它们必须(通过响应)结束请求,否则必须调用链中的 `next` 函数。上述示例使用`send()` 完成了请求,所以没有使用 `next` 参数(参数表中将其省略)。
+> [!NOTE]
+> 路由函数就是 [Express 中间件](/zh-CN/docs/Learn/Server-side/Express_Nodejs/Introduction#Using_middleware),这意味着它们必须(通过响应)结束请求,否则必须调用链中的 `next` 函数。上述示例使用`send()` 完成了请求,所以没有使用 `next` 参数(参数表中将其省略)。
>
> 上述路由函数只需要一个回调,可以根据需要指定任意数量的回调参数,或一个回调函数数组。每个函数都将加入中间件链,并且将按添加顺序调用(若有回调完成请求则中止当前周期)。
@@ -145,7 +147,8 @@ app.get(/.*fish$/, (req, res) => {
});
```
-> **备注:** LocalLibrary 的大部分路由都只使用字符串,很少用字符串模式和正则表达式。接下来将讨论“路由参数”。
+> [!NOTE]
+> LocalLibrary 的大部分路由都只使用字符串,很少用字符串模式和正则表达式。接下来将讨论“路由参数”。
### 路由参数
@@ -163,7 +166,8 @@ app.get("/users/:userId/books/:bookId", (req, res) => {
路由参数名必须由“单词字符”(/`[A-Za-z0-9_]`/)组成。
-> **备注:** URL `/book/create` 会匹配 `/book/:bookId` 这样的路由(将提取值为'`create`' 的 '`bookId`')。第一个与传入 URL 相匹配的路由会被使用,因此 `/book/create` 的路由处理器必须定义在 `/book/:bookId` 路由之前,才能妥善处理。
+> [!NOTE]
+> URL `/book/create` 会匹配 `/book/:bookId` 这样的路由(将提取值为'`create`' 的 '`bookId`')。第一个与传入 URL 相匹配的路由会被使用,因此 `/book/create` 的路由处理器必须定义在 `/book/:bookId` 路由之前,才能妥善处理。
以上就是使用路由所有的预备知识。Express 文档中还能找到更多信息:[基础路由](http://expressjs.com/en/starter/basic-routing.html) 和 [路由指南](http://expressjs.com/en/guide/routing.html)。以下是 LocalLibrary 路由和控制器的设置过程。
@@ -182,7 +186,8 @@ app.get("/users/:userId/books/:bookId", (req, res) => {
与之相反,其他 URL 是用于处理特定文档/模型实例的,它们会将项目的标识嵌入 URL(上文的 ``)。可以用路径参数来提取嵌入的信息,并传递给路由处理器(后续章节中用于动态获取数据库中的信息)。通过在 URL 中嵌入信息,使得每种类型的所有资源只需要一个路由(例如,所有藏书副本的显示操作只需要一个路由)。
-> **备注:** Express 可以通过任何方式构造 URL,可以在 URL 正文中嵌入信息(如上文),或使用 URL `GET` 参数(例如 `/book/?id=6`)。无论哪种方法,URL 都应保持整洁、合理且易读(另请参阅 [W3C 相关建议](https://www.w3.org/Provider/Style/URI))。
+> [!NOTE]
+> Express 可以通过任何方式构造 URL,可以在 URL 正文中嵌入信息(如上文),或使用 URL `GET` 参数(例如 `/book/?id=6`)。无论哪种方法,URL 都应保持整洁、合理且易读(另请参阅 [W3C 相关建议](https://www.w3.org/Provider/Style/URI))。
下面我们为上述所有 URL 创建路由处理器回调函数和路由代码。
@@ -201,7 +206,8 @@ app.get("/users/:userId/books/:bookId", (req, res) => {
genreController.js
```
-> **备注:** 上述四个文件可到 GitHub 下载 [dummyControllers.zip](https://github.com/roy-tian/mdn-examples/blob/master/server/express-locallibrary-tutorial/controllers/dummyControllers.zip)。(链接已失效,请移步英文版查看具体代码)
+> [!NOTE]
+> 上述四个文件可到 GitHub 下载 [dummyControllers.zip](https://github.com/roy-tian/mdn-examples/blob/master/server/express-locallibrary-tutorial/controllers/dummyControllers.zip)。(链接已失效,请移步英文版查看具体代码)
### `Author` 控制器
@@ -283,7 +289,8 @@ exports.index = (req, res) => { res.send('未实现:站点首页'); };
catalog.js
```
-> **备注:** 可到 GitHub 下载完整的 [catalog.js](https://raw.githubusercontent.com/roy-tian/mdn-examples/master/server/express-locallibrary-tutorial/routes/catalog.js)。
+> [!NOTE]
+> 可到 GitHub 下载完整的 [catalog.js](https://raw.githubusercontent.com/roy-tian/mdn-examples/master/server/express-locallibrary-tutorial/routes/catalog.js)。
**/routes/catalog.js** 中有以下代码:
@@ -350,7 +357,8 @@ router.get("/", (req, res) => {
});
```
-> **备注:** 这是我们第一次使用 [redirect()](https://expressjs.com/en/4x/api.html#res.redirect) 响应方法。它会使路由重定向到指定的页面,默认发送 HTTP 状态代码“302 Found”。可以根据需要更改返回的状态代码、设置绝对或相对路径。
+> [!NOTE]
+> 这是我们第一次使用 [redirect()](https://expressjs.com/en/4x/api.html#res.redirect) 响应方法。它会使路由重定向到指定的页面,默认发送 HTTP 状态代码“302 Found”。可以根据需要更改返回的状态代码、设置绝对或相对路径。
### 更新 app.js
@@ -372,7 +380,8 @@ app.use("/users", usersRouter);
app.use("/catalog", catalogRouter); // 将 catalog 路由添加进中间件链
```
-> **备注:** 我们将图书编目模块添加到了 `'/catalog'` 路径,该路径是 catalog 模块中所有路径的前缀。例如,访问藏书列表 的 URL 为:`/catalog/books/`。
+> [!NOTE]
+> 我们将图书编目模块添加到了 `'/catalog'` 路径,该路径是 catalog 模块中所有路径的前缀。例如,访问藏书列表 的 URL 为:`/catalog/books/`。
大功告成。LocalLibrary 网站所需的所有 URL 的路由和框架函数都已准备完毕。
@@ -392,7 +401,8 @@ app.use("/catalog", catalogRouter); // 将 catalog 路由添加进中间件链
DEBUG=express-locallibrary-tutorial:* npm run devstart
```
-> **备注:** 以上命令只对 bash 有效,要在 Windows 上使用 bash,最简单的方法就是安装 Git。(详情参见[教程 2 相关译注](/zh-CN/docs/Learn/Server-side/Express_Nodejs/skeleton_website#使用应用生成器))
+> [!NOTE]
+> 以上命令只对 bash 有效,要在 Windows 上使用 bash,最简单的方法就是安装 Git。(详情参见[教程 2 相关译注](/zh-CN/docs/Learn/Server-side/Express_Nodejs/skeleton_website#使用应用生成器))
接下来浏览上面一些 URL,确保不会收到错误页面(HTTP 404)。可以尝试以下示例:
diff --git a/files/zh-cn/learn/server-side/express_nodejs/skeleton_website/index.md b/files/zh-cn/learn/server-side/express_nodejs/skeleton_website/index.md
index b58be3d0cd143e..cc704f7a656f5f 100644
--- a/files/zh-cn/learn/server-side/express_nodejs/skeleton_website/index.md
+++ b/files/zh-cn/learn/server-side/express_nodejs/skeleton_website/index.md
@@ -33,17 +33,20 @@ slug: Learn/Server-side/Express_Nodejs/skeleton_website
以下内容介绍了应用生成器的用法,以及视图 / CSS 的一些不同选项。还介绍了骨架站点的组织结构。最后,我们将介绍站点的运行方法,从而对其进行验证。
-> **备注:** Express 应用生成器并非唯一的 Express 应用生成工具,而且生成项目的结构也不是组织文件和目录的唯一可行方式。但生成项目具有易于扩展和理解的模块化结构。最简单的 Express 应用请参阅 [Hello world 示例](http://expressjs.com.cn/starter/hello-world.html)(Express 镜像站)。
+> [!NOTE]
+> Express 应用生成器并非唯一的 Express 应用生成工具,而且生成项目的结构也不是组织文件和目录的唯一可行方式。但生成项目具有易于扩展和理解的模块化结构。最简单的 Express 应用请参阅 [Hello world 示例](http://expressjs.com.cn/starter/hello-world.html)(Express 镜像站)。
## 使用应用生成器
-> **备注:** 本教程中命令操作基于 Linux/macOS 的 bash 终端,Windows 的命令提示符 cmd/PowerShell 与 bash 的概念和用法略有不同,为在 Windows 上获得一致的体验,可以:
+> [!NOTE]
+> 本教程中命令操作基于 Linux/macOS 的 bash 终端,Windows 的命令提示符 cmd/PowerShell 与 bash 的概念和用法略有不同,为在 Windows 上获得一致的体验,可以:
>
> - 自己弄懂 cmd/PowerShell 与 bash 的区别。
> - 使用 [Git](https://git-scm.com/) 或 [MSYS2](http://www.msys2.org/) 为 Windows 提供的 bash。(推荐)
> - 使用 Windows 的 Linux 子系统。(到 Microsoft Store 中搜索“Linux”,安装喜欢的版本(Ubuntu 18.04、openSUSE 42、Debian 等),仅限 Windows 10,使用前需要先安装 [WSL](https://docs.microsoft.com/en-us/windows/wsl/install-win10))
-> **备注:** 你可能已经发现国内用 NPM 太慢了!这是由众所周知的不可抗力造成的。可用淘宝提供的 [CNPM](https://npm.taobao.org/) 代替之,功能和用法基本一致(只是不能上传自己的包)。
+> [!NOTE]
+> 你可能已经发现国内用 NPM 太慢了!这是由众所周知的不可抗力造成的。可用淘宝提供的 [CNPM](https://npm.taobao.org/) 代替之,功能和用法基本一致(只是不能上传自己的包)。
你应该已经安装好了生成器,它是 [设置 Node 开发环境](/zh-CN/docs/Learn/Server-side/Express_Nodejs/development_environment) 的一部分。可以使用 NPM 来安装全局的生成器,如下所示:
@@ -84,13 +87,15 @@ express
还可以使用 `--view` 选择视图(模板)引擎,并且/或者使用 `--css` 选择 CSS 生成引擎。
-> **备注:** 不推荐用 `--hogan`、`--ejs`、`--hbs` 等参数选用模板引擎。请使用 `--view`(或 `-v`)。
+> [!NOTE]
+> 不推荐用 `--hogan`、`--ejs`、`--hbs` 等参数选用模板引擎。请使用 `--view`(或 `-v`)。
### 我应该用哪个视图引擎?
Express 应用生成器支持多款流行的视图/模板引擎,包括 [EJS](https://www.npmjs.com/package/ejs)、[Hbs](http://github.com/donpark/hbs)、[Pug](https://pugjs.org/api/getting-started.html) (Jade)、[Twig](https://www.npmjs.com/package/twig) 和 [Vash](https://www.npmjs.com/package/vash),缺省选项是 Jade。Express 本身也支持大量其他模板语言,[开箱即用](https://github.com/expressjs/express/wiki#template-engines)。
-> **备注:** 如果要使用生成器不支持的模板引擎,请参阅 [在 Express 中使用模板引擎](http://expressjs.com.cn/guide/using-template-engines.html)(Express 文档)和所选视图引擎的文档。
+> [!NOTE]
+> 如果要使用生成器不支持的模板引擎,请参阅 [在 Express 中使用模板引擎](http://expressjs.com.cn/guide/using-template-engines.html)(Express 文档)和所选视图引擎的文档。
一般来说,你应该选择一个大而全的模板引擎,可以尽快进入生产状态。就像你选择其他组件一样!选用模板引擎需要考虑以下因素:
@@ -108,7 +113,8 @@ Express 应用生成器支持多款流行的视图/模板引擎,包括 [EJS](h
- 支持异步操作和流。
- 可以在同时在客户端和服务器上使用。如果一款模板引擎可以在客户端使用,那么就使在客户端托管数据并完成所有(或大多数)渲染成为可能。
-> **备注:** 互联网上有许多资源,可帮助你选择合适的视图/模板引擎。
+> [!NOTE]
+> 互联网上有许多资源,可帮助你选择合适的视图/模板引擎。
本项目选用 [Pug](https://pugjs.org/api/getting-started.html) 模板引擎(Jade 是它不久前的曾用名),它是最流行的 Express / JavaScript 模板语言之一,且对 Express 生成器 [开箱即用](https://github.com/expressjs/express/wiki#template-engines)。
@@ -116,7 +122,8 @@ Express 应用生成器支持多款流行的视图/模板引擎,包括 [EJS](h
Express 应用生成器支持最常见的 CSS 引擎:[LESS](http://lesscss.org/), [SASS](http://sass-lang.com/), [Compass](http://compass-style.org/), [Stylus](http://stylus-lang.com/)。
-> **备注:** CSS 的一些限制导致某些任务完成起来非常困难。CSS 引擎提供了更强大的语法来定义 CSS,然后将定义编译为纯 CSS 供浏览器使用。
+> [!NOTE]
+> CSS 的一些限制导致某些任务完成起来非常困难。CSS 引擎提供了更强大的语法来定义 CSS,然后将定义编译为纯 CSS 供浏览器使用。
与模板引擎一样,你也应该使用样式表引擎,这可以最大化团队生产力。本项目将使用原始 CSS(默认的),因为我们对 CSS 要求不复杂,没有必要使用引擎。
@@ -156,7 +163,8 @@ Express 应用生成器支持最常见的 CSS 引擎:[LESS](http://lesscss.org
一个 Express 应用就配置成功了,它托管于 localhost:3000。
-> **备注:** 指定 DEBUG 变量可启用控制台日志记录/调试。例如,当你访问上面的页面时,你会看到像这样的调试输出: ![用 npm start 启动这个应用](npm-start.png) 直接通过 `npm start` 命令启动应用也可以,但不会看到调试信息。
+> [!NOTE]
+> 指定 DEBUG 变量可启用控制台日志记录/调试。例如,当你访问上面的页面时,你会看到像这样的调试输出: ![用 npm start 启动这个应用](npm-start.png) 直接通过 `npm start` 命令启动应用也可以,但不会看到调试信息。
## 文件改动时重启服务器
@@ -199,7 +207,8 @@ DEBUG=express-locallibrary-tutorial:* npm run devstart
现在,如果编辑项目中的任何文件,服务器将自动重启(或者可以随时使用 rs 命令来重启)。查看更新后的页面需要点击浏览器的“刷新”按钮。
-> **备注:** 这里必须使用“`npm run `”命令,而不是 `npm start`,因为“start”本质上是映射到脚本的一条 NPM 命令。我们可以在 `start` 脚本中替换它,但我们只想在开发期间使用 nodemon,因此有必要创建一条新的脚本命令。
+> [!NOTE]
+> 这里必须使用“`npm run `”命令,而不是 `npm start`,因为“start”本质上是映射到脚本的一条 NPM 命令。我们可以在 `start` 脚本中替换它,但我们只想在开发期间使用 nodemon,因此有必要创建一条新的脚本命令。
## 生成的项目
@@ -327,7 +336,8 @@ var indexRouter = require("./routes/index");
var usersRouter = require("./routes/users");
```
-> **备注:** 此时我们刚刚导入了模块;还没有真正使用过其中的路由(稍后会使用)。
+> [!NOTE]
+> 此时我们刚刚导入了模块;还没有真正使用过其中的路由(稍后会使用)。
下面我们用导入的 `express` 模块来创建 `app` 对象,然后使用它来设置视图(模板)引擎。设置引擎分两步:首先设置 '`views`' 以指定模板的存储文件夹(此处设为子文件夹 **/views**)。然后设置 '`view engine`' 以指定模板库(本例中设为“pug” )。
@@ -357,7 +367,8 @@ app.use("/", indexRouter);
app.use("/users", usersRouter);
```
-> **备注:** 这些路径(`'/'` 和 '`/users'`)将作为导入路由的前缀。如果导入的模块 `users` 在 `/profile` 定义了路由,则可以在 `/users/profile` 访问该路由。我们将在后面的文章中,详细讨论路由。
+> [!NOTE]
+> 这些路径(`'/'` 和 '`/users'`)将作为导入路由的前缀。如果导入的模块 `users` 在 `/profile` 定义了路由,则可以在 `/users/profile` 访问该路由。我们将在后面的文章中,详细讨论路由。
最后一个中间件为错误和 HTTP 404 响应添加处理方法。
@@ -407,7 +418,8 @@ module.exports = router;
该路由定义了一个回调,在检测到正确模式的 HTTP `GET` 请求时将调用该回调。正确模式即导入模块时指定的路由('`/users`')加该模块('`/`')中定义的任何内容。换句话说,在收到 `/users/` URL 时使用此路由。
-> **备注:** 用 node 启动该应用并访问 ,浏览器会返回一条消息:'respond with a resource'。
+> [!NOTE]
+> 用 node 启动该应用并访问 ,浏览器会返回一条消息:'respond with a resource'。
值得注意的是,上述回调函数有第三个参数 '`next`',因此它是一个中间件函数,而不是简单的路由回调。`next` 参数暂时还用不到,在 `'/'` 路径中添加多个路由处理器时才会涉及。
diff --git a/files/zh-cn/learn/server-side/express_nodejs/tutorial_local_library_website/index.md b/files/zh-cn/learn/server-side/express_nodejs/tutorial_local_library_website/index.md
index 81ff58cccb2644..30bc0f681bc786 100644
--- a/files/zh-cn/learn/server-side/express_nodejs/tutorial_local_library_website/index.md
+++ b/files/zh-cn/learn/server-side/express_nodejs/tutorial_local_library_website/index.md
@@ -63,7 +63,8 @@ slug: Learn/Server-side/Express_Nodejs/Tutorial_local_library_website
如果实在进行不下去,可以参考 [Github](https://github.com/mdn/express-locallibrary-tutorial) 上的完整版本。
-> **备注:** 本教程中的代码,已在特定版本(项目的 [package.json](https://github.com/mdn/express-locallibrary-tutorial/blob/master/package.json) 所列版本)的 node、Express 及其他模组的环境下通过测试。
+> [!NOTE]
+> 本教程中的代码,已在特定版本(项目的 [package.json](https://github.com/mdn/express-locallibrary-tutorial/blob/master/package.json) 所列版本)的 node、Express 及其他模组的环境下通过测试。
## 总结
diff --git a/files/zh-cn/learn/server-side/first_steps/client-server_overview/index.md b/files/zh-cn/learn/server-side/first_steps/client-server_overview/index.md
index d00f05a81fa546..45073059d99a8b 100644
--- a/files/zh-cn/learn/server-side/first_steps/client-server_overview/index.md
+++ b/files/zh-cn/learn/server-side/first_steps/client-server_overview/index.md
@@ -57,7 +57,8 @@ slug: Learn/Server-side/First_steps/Client-Server_overview
你可以通过点击一个链接或者在网站进行一次搜索(比如搜索引擎的首页)做出一次简单的 GET 请求。比如,当你在 MDN 上进行一次对“客户端概览”词条的搜索时,HTTP 请求就被发送出去了,你将会看到正如下面一样被展示出来的文本信息(展示出来的信息不一定是相同的,因为其中一部分信息还取决于你的浏览器)。
-> **备注:** HTTP 消息的格式是在“网络标准”([RFC7230](http://www.rfc-editor.org/rfc/rfc7230.txt))中定义的。你不需要知道这个标准的细节,但是现在你至少得知道所有这些是来自哪儿的!
+> [!NOTE]
+> HTTP 消息的格式是在“网络标准”([RFC7230](http://www.rfc-editor.org/rfc/rfc7230.txt))中定义的。你不需要知道这个标准的细节,但是现在你至少得知道所有这些是来自哪儿的!
#### 请求
@@ -185,13 +186,15 @@ X-Cache-Info: not cacheable; request wasn't a GET or HEAD
Content-Length: 0
```
-> **备注:** 上面展示的 HTTP 请求和响应式通过 Fiddler 软件来捕获的,你也可以得到相似的信息通过使用网络嗅探器(比如 )或者使用浏览器扩展例如 [HttpFox](https://addons.mozilla.org/en-US/firefox/addon/httpfox/)。你可以自己尝试一下。使用任何一个上面链接的工具,浏览一个站点并修改主要信息来观察不同的请求和响应。更多的现代浏览器拥有网络监控工具(例如,在 Firefox 上的 [Network Monitor](/zh-CN/docs/Tools/Network_Monitor) 工具)。
+> [!NOTE]
+> 上面展示的 HTTP 请求和响应式通过 Fiddler 软件来捕获的,你也可以得到相似的信息通过使用网络嗅探器(比如 )或者使用浏览器扩展例如 [HttpFox](https://addons.mozilla.org/en-US/firefox/addon/httpfox/)。你可以自己尝试一下。使用任何一个上面链接的工具,浏览一个站点并修改主要信息来观察不同的请求和响应。更多的现代浏览器拥有网络监控工具(例如,在 Firefox 上的 [Network Monitor](/zh-CN/docs/Tools/Network_Monitor) 工具)。
## 静态网站
静态网站是指每当请求一个特定的资源时,会从服务器返回相同的硬编码内容。因此,例如,如果你在 `/static/myproduct1.html` 有一个关于产品的页面,则该页面将返回给每个用户。如果你添加另一个类似的产品到你的网站,你将需要添加另一个页面(例如 `myproduct2.html` )等。这可能开始变得非常低效:当你访问数千个产品页面时会发生什么——你会在每个页面(基本的页面模板,结构等等)上重复很多代码,如果你想改变页面结构的任何东西,比如添加一个新的“相关产品”部分,必须单独更改每个页面。
-> **备注:** 当你有少量页面时,向每个用户发送相同的内容时,静态网站是最佳选择,然而随着页面数量的增加,它们的维护成本也会很高。
+> [!NOTE]
+> 当你有少量页面时,向每个用户发送相同的内容时,静态网站是最佳选择,然而随着页面数量的增加,它们的维护成本也会很高。
让我们回顾一下在上一篇文章中看到的静态网站架构图,看看它是如何工作的。
@@ -268,7 +271,8 @@ urlpatterns = [
]
```
-> **备注:** 在`url()`函数中的第一个参数可能看起来有点古怪 (比如`r'^junior/$`) 因为他们使用一个叫做“正则表达式”(RegEx, or RE) 的字符匹配机制。在这里,你还不需要知道正则表达式是如何工作的,除了要知道它们是如何允许我们在 URL 中匹配到字符的 (而不是像上面的硬编码) 并且知道如何在我们的视图函数中将它们用作参数。举个例子,一个真正简单的正则表达式可能会说“匹配一个大写字母,后面跟着 4 到 7 个小写字母”。
+> [!NOTE]
+> 在`url()`函数中的第一个参数可能看起来有点古怪 (比如`r'^junior/$`) 因为他们使用一个叫做“正则表达式”(RegEx, or RE) 的字符匹配机制。在这里,你还不需要知道正则表达式是如何工作的,除了要知道它们是如何允许我们在 URL 中匹配到字符的 (而不是像上面的硬编码) 并且知道如何在我们的视图函数中将它们用作参数。举个例子,一个真正简单的正则表达式可能会说“匹配一个大写字母,后面跟着 4 到 7 个小写字母”。
Web 框架还可以轻松地使用查看函数,从数据库获取信息。我们的数据结构是在模型中定义的,模型是定义要存储在底层数据库中的字段的 Python 类。如果我们有一个名为 Team 的模型,其中有一个“_team_type_”字段,那么我们可以使用一个简单的查询语法来取回所有具有特定类型的球队。
diff --git a/files/zh-cn/learn/server-side/first_steps/introduction/index.md b/files/zh-cn/learn/server-side/first_steps/introduction/index.md
index df29a835450563..cccd418f490b0c 100644
--- a/files/zh-cn/learn/server-side/first_steps/introduction/index.md
+++ b/files/zh-cn/learn/server-side/first_steps/introduction/index.md
@@ -80,7 +80,8 @@ web 开发者无法控制用户可能会使用哪一种浏览器来浏览网站
同样的,当客户端和服务器端代码使用框架时,它们的领域是不同的,因此框架也会不同。客户端 web 框架简化布局和演示任务,然而服务器端 web 框架提供大量的普通 Web 服务功能,不然的话你可能需要自己来实现这些功能(比如支持会话、支持用户和身份验证、简单的数据访问、模板库等)。
-> **备注:** 客户端框架通常被用来帮助加速客户端代码的开发,但是你也可以选择手写所有的代码;事实上,如果你只需要一个小型的、简单的网站 UI,手写自己的代码可能更快并且更高效。
+> [!NOTE]
+> 客户端框架通常被用来帮助加速客户端代码的开发,但是你也可以选择手写所有的代码;事实上,如果你只需要一个小型的、简单的网站 UI,手写自己的代码可能更快并且更高效。
>
> 相反的,你应该从来没有考虑过不使用框架而直接编写 web 应用程序的服务器端组件——实现一个重要的功能比如 HTTP 服务器真的很难直接从头开始用 Python 语言构建,但是一些用 Python 语言写的 web 框架,比如 Django 提供了开箱即用的功能,同时还包含其他很多有用的工具。
@@ -104,7 +105,8 @@ web 开发者无法控制用户可能会使用哪一种浏览器来浏览网站
因为数据被放在数据库中,因此更加容易被分享和更新到其他商业系统(比如,当产品在网上或者实体店卖掉之后,商店可以更新它的存货清单数据库)
-> **备注:** 你不用很难就可以想到服务器端代码对于高效存储和传输信息的好处:
+> [!NOTE]
+> 你不用很难就可以想到服务器端代码对于高效存储和传输信息的好处:
>
> 1. 打开[亚马逊](https://www.amazon.com)或者其他一些电子商务网站。
> 2. 搜索一系列关键词,然后注意到页面结构并没有发生改变,尽管搜索结果发生了改变。
@@ -118,7 +120,8 @@ web 开发者无法控制用户可能会使用哪一种浏览器来浏览网站
对用户习惯的更深层分析可以被用来预测用户的兴趣和更加深度地定制化回应和通知,比如,提供一张清单来展示曾经去过的地方,或者在地图上标识你可能想去的非常受欢迎的地点。
-> **备注:** 谷歌地图会保存你的搜索,浏览的历史记录。频繁地浏览或者频繁地搜索地址将会使得它更加的醒目。
+> [!NOTE]
+> 谷歌地图会保存你的搜索,浏览的历史记录。频繁地浏览或者频繁地搜索地址将会使得它更加的醒目。
>
> 谷歌搜索结果基于之前的搜索进行优化。
>
@@ -139,7 +142,8 @@ web 开发者无法控制用户可能会使用哪一种浏览器来浏览网站
- 社交网站,比如 Facebook 允许用户完全控制他们自己的数据,但是只允许他们的朋友和家人查看和评论这些数据。用户决定谁可以看到他们的数据,并且通过扩展,决定谁的数据出现在他们的反馈里面——授权是用户体验里面的一个核心部分!
- 此时此刻你所访问的网站也控制着内容访问:文章对所有人都是可视的,但是只有已经登录的用户可以编辑内容。为了试验一下,你可以点击一下页面上方的**编辑**按钮——如果你已经登录了的话,将会展示出编辑界面;如果你还没有登录,你会被导航到注册界面。
-> **备注:** 想想其他真实的限制了内容访问例子。比如,如果你直接访问你银行的网页,你可以看到什么?用你的帐号登录之后——你可以看到和修改什么额外的信息呢?有些什么信息是你只可以看到的而只有银行可以修改的?
+> [!NOTE]
+> 想想其他真实的限制了内容访问例子。比如,如果你直接访问你银行的网页,你可以看到什么?用你的帐号登录之后——你可以看到和修改什么额外的信息呢?有些什么信息是你只可以看到的而只有银行可以修改的?
### 存储会话和状态信息
@@ -147,7 +151,8 @@ web 开发者无法控制用户可能会使用哪一种浏览器来浏览网站
这也就允许,比如说,一个网站知道一个用户曾经登录过并且展示他们邮箱的链接或者订单历史,或者可能存储一个简单游戏的状态来确保用户可以再次访问网站然后从上次留下来的地方继续。
-> **备注:** 访问一个具有订阅模式的新闻网站,并且打开一系列标签(比如[The Age](http://www.theage.com.au/))。几个小时或者几天之后再来访问这个网站。最后你将开始被重定向到一个向你解释如何订阅的页面上,并且你将无法访问文章。这个信息就是一个 session 信息被存储在 cookie 中的例子
+> [!NOTE]
+> 访问一个具有订阅模式的新闻网站,并且打开一系列标签(比如[The Age](http://www.theage.com.au/))。几个小时或者几天之后再来访问这个网站。最后你将开始被重定向到一个向你解释如何订阅的页面上,并且你将无法访问文章。这个信息就是一个 session 信息被存储在 cookie 中的例子
### 通知和通讯
@@ -159,7 +164,8 @@ web 开发者无法控制用户可能会使用哪一种浏览器来浏览网站
- 亚马逊定期的向你发送产品邮件并且向你推荐和你曾经买过的产品很相似的产品或者是他们觉得你可能感兴趣的产品。
- 一个网站的服务器可能向网站管理员发送警告消息来警告他们服务器内存不足或者可疑的用户行为。
-> **备注:** 最普通的一种通知类型就是“注册认证”。选择任何一个你感兴趣的大型网站(谷歌、亚马逊、Instagram 等)并且用你的邮箱创建一个新的帐号。你很快会收到一封验证你的注册的邮件,或者需要你去激活帐号。
+> [!NOTE]
+> 最普通的一种通知类型就是“注册认证”。选择任何一个你感兴趣的大型网站(谷歌、亚马逊、Instagram 等)并且用你的邮箱创建一个新的帐号。你很快会收到一封验证你的注册的邮件,或者需要你去激活帐号。
### 数据分析
@@ -167,7 +173,8 @@ web 开发者无法控制用户可能会使用哪一种浏览器来浏览网站
比如,亚马逊和谷歌都基于过去的搜索(和购物)信息来为产品打广告。
-> **备注:** 如果你使用 Facebook,去看看你的 main feed,然后看一下帖子流。注意到其中一些帖子不是按照数字进行排列的 - 拥有更多“喜欢”的帖子在列表中通常高于最近的帖子。
+> [!NOTE]
+> 如果你使用 Facebook,去看看你的 main feed,然后看一下帖子流。注意到其中一些帖子不是按照数字进行排列的 - 拥有更多“喜欢”的帖子在列表中通常高于最近的帖子。
>
> 也可以看一下你收到的广告是什么类型的——你或许会看到你在其他网站查看的商品。Facebook 为突出内容和广告的算法或许还很令人疑惑,但是很明显的,它是依据你的喜好、品味和习惯的!
diff --git a/files/zh-cn/learn/server-side/first_steps/web_frameworks/index.md b/files/zh-cn/learn/server-side/first_steps/web_frameworks/index.md
index f6fa534a95fd4d..499b2c2988e081 100644
--- a/files/zh-cn/learn/server-side/first_steps/web_frameworks/index.md
+++ b/files/zh-cn/learn/server-side/first_steps/web_frameworks/index.md
@@ -142,7 +142,8 @@ web 框架经常提供模板系统。这些允许你制定输出文档的结构
比如,Django 模板允许你通过使用“双重花括号”(如 `\{{ variable_name }}`)来指定变量,当页面被渲染出来时,这些变量会被从视图函数传递过来的值代替。模板系统也会提供表达支持(通过语法 `{% expression %}` 来实现),这样就允许模板进行一些简单的操作比如迭代传递给模板的值列表。
-> **备注:** 很多其他的模板系统使用相似的语法,比如:Jinja2 (Python), handlebars (JavaScript), moustache (JavaScript), 等。
+> [!NOTE]
+> 很多其他的模板系统使用相似的语法,比如:Jinja2 (Python), handlebars (JavaScript), moustache (JavaScript), 等。
下面的代码片段展示了它们如何工作的。下面的内容接着从上一个部分而来的“youngest team”实例,HTML 模板通过视图函数传进一个叫做 youngest_teams 的值列表。在 HTML 骨架中我们有一个初步检查 youngest_teams 变量是否存在的表示,然后会在 for 循环里面进行迭代。在每一次迭代中模板会以列表元素的形式展示队伍的 team_name 值。
@@ -188,7 +189,8 @@ web 框架经常提供模板系统。这些允许你制定输出文档的结构
如果你是一个完全的初学者,那么你可能会基于“易于学习”来选择你的框架。除了语言本身的“易于学习”之外,帮助新手的高质量的文档/教程和一个活跃的社区是你最有价值的资源。在后续课程中,我们选取了 Django(Python)和 Express(Node/Javascript)来编写我们的实例,主要因为它们很容易上手并且有强大的支持。
-> **备注:** 我们可以去 [Django](https://www.djangoproject.com/) (Python) 和 [Express](https://expressjs.com/) (Node/JavaScript) 的主页上去看看它们的文档和社区。
+> [!NOTE]
+> 我们可以去 [Django](https://www.djangoproject.com/) (Python) 和 [Express](https://expressjs.com/) (Node/JavaScript) 的主页上去看看它们的文档和社区。
>
> 1. 导航至主页 (上面已给出链接)
>
@@ -208,7 +210,8 @@ web 框架经常提供模板系统。这些允许你制定输出文档的结构
下面的服务器端框架体现了现在最受欢迎的几个。它们有你需要用来提升效率的一切东西——它们是开源的,一直保持发展的态势,有着富有激情的社区,社区里的人创作出文档并且在讨论板上帮助使用者,并且被使用在很多高质量的网站上。当然还有很多其他非常棒的框架,你可以使用搜索引擎探索一下。
-> **备注:** (部分)解释来自框架的官方网站!
+> [!NOTE]
+> (部分)解释来自框架的官方网站!
### Django (Python)
diff --git a/files/zh-cn/learn/server-side/first_steps/website_security/index.md b/files/zh-cn/learn/server-side/first_steps/website_security/index.md
index 2ac3b9a07541ff..73c399f1f8913d 100644
--- a/files/zh-cn/learn/server-side/first_steps/website_security/index.md
+++ b/files/zh-cn/learn/server-side/first_steps/website_security/index.md
@@ -34,7 +34,8 @@ slug: Learn/Server-side/First_steps/Website_security
文章的剩余部分列举了一些常见威胁的细节以及用来保护站点的一些简单措施。
-> **备注:** 这只是一篇介绍性的主题,旨在帮你开始思考站点安全。它并不详尽。
+> [!NOTE]
+> 这只是一篇介绍性的主题,旨在帮你开始思考站点安全。它并不详尽。
## 站点安全威胁
@@ -44,7 +45,8 @@ slug: Learn/Server-side/First_steps/Website_security
XSS 是一个术语,用来描述一类允许攻击者通过网站将客户端脚本代码注入到其他用户的浏览器中的攻击手段。由于注入到浏览器的代码来自站点,其是可信赖的,因此可以做类似将该用户用于站点认证的 cookie 发送给攻击者的事情。一旦攻击者拿到了这个 cookie,他们就可以登陆到站点,就好像他们就是那个用户,可以做任何那个用户能做的事情。根据站点的不同,这些可能包括访问他们的信用卡信息、查看联系人、更改密码等。
-> **备注:** XSS 攻击在历史上较其他类型更为常见。
+> [!NOTE]
+> XSS 攻击在历史上较其他类型更为常见。
有两种主要的方法可以让站点将注入的脚本返回到浏览器——通常被称做 反射型 和 持久型 XSS 攻击。
@@ -80,7 +82,8 @@ SELECT * FROM users WHERE name = 'a';DROP TABLE users; SELECT * FROM userinfo WH
避免此种攻击的方法就是确保任何传递给 SQL 查询语句的用户数据都无法更改查询的本来用意。有种方式便是将用户输入中任何在 SQL 语句中有特殊含义的字符进行转义。
-> **备注:** SQL 语句把 ' 号作为一个字符串常量的开头的结尾。通过在前面放置一个斜杠,我们把单引号进行了转义 ( \\' ),然后 SQL 就会将其视为一个字符(作为字符串的一部分)。
+> [!NOTE]
+> SQL 语句把 ' 号作为一个字符串常量的开头的结尾。通过在前面放置一个斜杠,我们把单引号进行了转义 ( \\' ),然后 SQL 就会将其视为一个字符(作为字符串的一部分)。
在下面的语句中我们对 ' 字符进行了转义。SQL 会将**粗体**显示的整段字符串解释为 name(这个 name 很古怪,但至少是没有危害的!)
@@ -90,7 +93,8 @@ SELECT * FROM users WHERE name = 'a\';DROP TABLE users; SELECT * FROM userinfo W
Web 框架通常会为你进行这种转义操作。例如 Django,可以确保任何传递给查询集合 (model 查询) 的用户数据都是已经转义过的。
-> **备注:** 本章节引用了大量来自 [Wikipedia](https://en.wikipedia.org/wiki/SQL_injection) 的内容。
+> [!NOTE]
+> 本章节引用了大量来自 [Wikipedia](https://en.wikipedia.org/wiki/SQL_injection) 的内容。
### 跨站请求伪造 (CSRF)
@@ -102,7 +106,8 @@ CSRF 攻击允许恶意用户在另一个用户不知情的情况下利用其身
最终的结果就是任何已登陆到站点的用户在点击了提交按钮后都会进行这个交易。John 发财啦!
-> **备注:** 这里的诀窍是,John 不需要访问那些用户的 cookie(或者说身份信息)——用户的浏览器存储了这些信息,而且会自动将其包含在发送给对应服务器的请求中。
+> [!NOTE]
+> 这里的诀窍是,John 不需要访问那些用户的 cookie(或者说身份信息)——用户的浏览器存储了这些信息,而且会自动将其包含在发送给对应服务器的请求中。
杜绝此类攻击的一种方式是在服务器端要求每个 POST 请求都包含一个用户特定的由站点生成的密钥 ( 这个密钥值可以由服务器在发送用来传输数据的网页表单时提供)。这种方式可以使 John 无法创建自己的表单,因为他必须知道服务器提供给那个用户的密钥值。即使他找出了那个密钥值,并为那个用户创建了表单,他也无法用同样的表单来攻击其他的所有用户。
@@ -124,7 +129,8 @@ Web 框架通常都会包含一些类似的 CSRF 防范技巧。
当 Web 应用信任来自浏览器的数据时,上述章节里提到的大多数攻击利用手段才能成功。无论你做什么其他的事情来提升你的网站的安全性能,在将信息展示在浏览器之前、在使用 SQL 语句进行查询之前、在传递给一个操作系统或者文件系统之前,你应该过滤掉所有的用户源信息。
-> **警告:** 在你可以了解到的有关网站安全大多数 课程之中,最重要的就是**不要相信来自浏览器的数据**。包括在 URL 参数中的 GET 请求、POST 请求、HTTP 头、cookies、用户上传的文件等等。一定要每次都检查用户输入的信息。每次都预想最坏的结果。
+> [!WARNING]
+> 在你可以了解到的有关网站安全大多数 课程之中,最重要的就是**不要相信来自浏览器的数据**。包括在 URL 参数中的 GET 请求、POST 请求、HTTP 头、cookies、用户上传的文件等等。一定要每次都检查用户输入的信息。每次都预想最坏的结果。
你可以采取一些简单的步骤:
From 58114acd1a6a11f2b757d8569c4989f24c874079 Mon Sep 17 00:00:00 2001
From: Onkar Ruikar <87750369+OnkarRuikar@users.noreply.github.com>
Date: Fri, 26 Jul 2024 19:36:49 +0530
Subject: [PATCH 060/185] [JA] update google short link (#22523)
- porting from https://github.com/mdn/content/pull/34925
---
files/ja/learn/javascript/first_steps/variables/index.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/files/ja/learn/javascript/first_steps/variables/index.md b/files/ja/learn/javascript/first_steps/variables/index.md
index e636181f1aaa83..38f4dfc2366b1f 100644
--- a/files/ja/learn/javascript/first_steps/variables/index.md
+++ b/files/ja/learn/javascript/first_steps/variables/index.md
@@ -200,7 +200,7 @@ myName = "Bob";
これらの理由と複数の理由から、コードでは `var` よりも `let` を使用することをお勧めします。古いブラウザーの対応を明確に書いている場合を除き、2015 年以降、現代のすべてのブラウザーが `let` に対応しているため、`var` を使用する理由はなくなりました。
-> **メモ:** このコードをブラウザーコンソールで試す場合は、ここにあるコードブロックのそれぞれを丸ごとコピー & ペーストするのがよいでしょう。[Chrome のコンソールの機能](https://goo.gle/devtools-const-repl)には、`let` と `const` による変数の再宣言が許可されているものがあります。
+> **メモ:** このコードをブラウザーコンソールで試す場合は、ここにあるコードブロックのそれぞれを丸ごとコピー & ペーストするのがよいでしょう。[Chrome のコンソールの機能](https://docs.google.com/document/d/1NP_FnHr4WCZRp7exgUklvNiXrH3nujcfwvp2pzMQ8-0/edit#heading=h.7y5hynxk52e9)には、`let` と `const` による変数の再宣言が許可されているものがあります。
>
> ```plain
> > let myName = "Chris";
From e75169b0f21c7f1516893647f6683e13797dd09f Mon Sep 17 00:00:00 2001
From: Masahiro FUJIMOTO
Date: Mon, 22 Jul 2024 10:16:37 +0900
Subject: [PATCH 061/185] =?UTF-8?q?2023/07/04=20=E6=99=82=E7=82=B9?=
=?UTF-8?q?=E3=81=AE=E8=8B=B1=E8=AA=9E=E7=89=88=E3=81=AB=E5=9F=BA=E3=81=A5?=
=?UTF-8?q?=E3=81=8D=E6=96=B0=E8=A6=8F=E7=BF=BB=E8=A8=B3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
files/ja/web/css/css_box_sizing/index.md | 151 +++++++++++++++++++++++
1 file changed, 151 insertions(+)
create mode 100644 files/ja/web/css/css_box_sizing/index.md
diff --git a/files/ja/web/css/css_box_sizing/index.md b/files/ja/web/css/css_box_sizing/index.md
new file mode 100644
index 00000000000000..c350264aa1ebd0
--- /dev/null
+++ b/files/ja/web/css/css_box_sizing/index.md
@@ -0,0 +1,151 @@
+---
+title: CSS ボックスサイズ指定
+slug: Web/CSS/CSS_box_sizing
+l10n:
+ sourceCommit: 2ef2c905a7322f5a533cf7c96ec5a337fc614359
+---
+
+{{CSSRef}}
+
+**CSS ボックスサイズ指定**モジュールは、要素のサイズをどのようにコンテンツに合わせるか、または特定のレイアウトコンテキストに合わせるかを開発者が指定できるようにします。このモジュールでは、サイズ指定、最小サイズ指定、最大サイズ指定のプロパティを定義しており、コンテンツに基づく{{glossary("intrinsic size", "内在サイズ")}}とコンテキストに基づく[外在](/ja/docs/Glossary/Intrinsic_Size#外在サイズ)サイズを表すキーワードで CSS サイズ指定のプロパティを拡張します。
+
+要素は、外在的にも内在的にもサイズを設定することができます。[CSS ボックスモデル](/ja/docs/Web/CSS/CSS_box_model)は、要素の大きさを明示的に、つまり「外在的」に設定するためのページに相対的なプロパティ、たとえば `width`、`height`、`padding`、`margin` などのプロパティ([CSS 背景と境界](/ja/docs/Web/CSS/CSS_backgrounds_and_borders)モジュールで定義されている `border` プロパティも含む)を定義しています。この CSS ボックスサイズ指定モジュールは、CSS ボックスモデルモジュールを拡張し、コンテンツのサイズに基づいて要素のサイズを設定することで、要素を内在的にサイズ指定できるようにします。
+
+このモジュールで導入されたサイズ指定値は、[サイズの封じ込め](/ja/docs/Web/CSS/CSS_containment/Using_CSS_containment#サイズの封じ込め)を持つ要素が、内在サイズが何も指定されていないかのようにサイズ指定されるのではなく、そのフロー内コンテンツの幅と高さが指定された明示的な内在サイズと一致するように、明示的な内在サイズを取ることができるようになります。
+
+このモジュールでは、要素のボックスのアスペクト比を定義する機能も導入されました。つまり、ブラウザーは指定されたアスペクト比を維持するために、いずれかの寸法が自動的にサイズ調整される限り、要素の寸法を自動的に調整することができます。
+
+[論理的プロパティと値モジュール](/ja/docs/Web/CSS/CSS_logical_properties_and_values)は、ボックスモデルとボックスサイズ指定モジュールで利用可能なプロパティを拡張し、対応する物理ボックスモデルと内在ボックスサイズ指定プロパティの書字方向に相対的である等価なものを含むように拡張しています。
+
+## リファレンス
+
+### プロパティ
+
+- {{cssxref("aspect-ratio")}}
+- {{cssxref("box-sizing")}}
+- {{cssxref("contain-intrinsic-block-size")}}
+- {{cssxref("contain-intrinsic-height")}}
+- {{cssxref("contain-intrinsic-inline-size")}}
+- {{cssxref("contain-intrinsic-size")}}
+- {{cssxref("contain-intrinsic-width")}}
+- {{cssxref("height")}}
+- {{cssxref("max-height")}}
+- {{cssxref("max-width")}}
+- {{cssxref("min-height")}}
+- {{cssxref("min-width")}}
+- {{cssxref("width")}}
+
+> **メモ:** CSS ボックスサイズ指定モジュールでは、まだ実装されていない `min-intrinsic-sizing` プロパティを導入しています。
+
+### データ型と値
+
+- {{cssxref("ratio")}} データ型
+- {{cssxref("min-content")}} 値
+- {{cssxref("max-content")}} 値
+- {{cssxref("fit-content")}} 値
+- {{cssxref("fit-content_function", "fit-content()")}} 関数
+
+> **メモ:** CSS ボックスサイズ指定モジュールでは、ボックスサイズ指定プロパティにまだ実装されていないサイズ指定値として、`stretch` と `contain` キーワードを導入しています。
+
+### 関数
+
+- [`fit-content()`](/ja/docs/Web/CSS/fit-content_function)
+
+### 用語集の用語
+
+- {{glossary("intrinsic size", "内在サイズ")}}
+
+## ガイド
+
+- [アスペクト比を理解する](/ja/docs/Web/CSS/CSS_box_sizing/Understanding_aspect-ratio)
+
+ - : `aspect-ratio` プロパティについて学び、置換要素と非置換要素のアスペクト比について議論し、一般的なアスペクト比の使用例を検討します。
+
+- [CSS ボックスモデルの紹介](/ja/docs/Web/CSS/CSS_box_model/Introduction_to_the_CSS_box_model)
+
+ - : CSS の基本概念のひとつであるボックスモデルについての解説です。このモデルは、CSS が要素をどのようにレイアウトするかを定義するもので、コンテンツ、パディング、境界、マージン領域などが含まれます。
+
+- [マージンの相殺をマスターする](/ja/docs/Web/CSS/CSS_box_model/Mastering_margin_collapsing)
+
+ - : 隣接する 2 つのマージンが 1 つに折りたたまれることがあります。この記事では、この現象がいつ、なぜ起こるのか、そしてどのように制御するのかについて説明します。
+
+- [視覚整形モデル](/ja/docs/Web/CSS/Visual_formatting_model)
+
+ - : 視覚整形モデルを説明します。
+
+- [主軸方向のフレックスアイテムの比率の制御](/ja/docs/Web/CSS/CSS_flexible_box_layout/Controlling_ratios_of_flex_items_along_the_main_axis)
+
+ - : 内在的なサイズ調整について、{{CSSxRef("flex-grow")}}、{{CSSxRef("flex-shrink")}}、{{CSSxRef("flex-basis")}} を使用して主軸に沿ってフレックスアイテムのサイズと柔軟性を制御する方法を理解する前段階として説明します。
+
+## 関連概念
+
+- [CSS 論理的プロパティ](/ja/docs/Web/CSS/CSS_logical_properties_and_values)モジュール
+ - {{CSSxRef("min-inline-size")}}
+ - {{CSSxRef("block-size")}}
+ - {{CSSxRef("inline-size")}}
+ - {{CSSxRef("max-block-size")}}
+ - {{CSSxRef("max-inline-size")}}
+ - {{CSSxRef("min-block-size")}}
+ - {{CSSxRef("min-inline-size")}}
+ - {{CSSxRef("margin-block")}}
+ - {{CSSxRef("margin-inline")}}
+ - {{CSSxRef("padding-block")}}
+ - {{CSSxRef("padding-inline")}}
+ - {{CSSxRef("border-block")}}
+ - {{CSSxRef("border-inline")}}
+ - {{CSSxRef("contain-intrinsic-block-size")}}
+ - {{CSSxRef("contain-intrinsic-inline-size")}}
+ - {{CSSxRef("overflow-block")}}
+ - {{CSSxRef("overflow-inline")}}
+ - {{CSSxRef("overscroll-behavior-block")}}
+ - {{CSSxRef("overscroll-behavior-inline")}}
+- [CSS ボックスモデル](/ja/docs/Web/CSS/CSS_box_model)モジュール
+ - {{cssxref("margin")}} 一括指定プロパティ
+ - {{cssxref("margin-bottom")}}
+ - {{cssxref("margin-left")}}
+ - {{cssxref("margin-right")}}
+ - {{cssxref("margin-top")}}
+ - {{cssxref("margin-trim")}}
+ - {{cssxref("padding")}} 一括指定プロパティ
+ - {{cssxref("padding-bottom")}}
+ - {{cssxref("padding-left")}}
+ - {{cssxref("padding-right")}}
+ - {{cssxref("padding-top")}}
+- [CSS 背景と境界](/ja/docs/Web/CSS/CSS_backgrounds_and_borders)モジュール
+ - {{cssxref("border")}} 一括指定プロパティ
+ - {{cssxref("border-width")}} 一括指定プロパティ
+ - {{cssxref("border-bottom-width")}}
+ - {{cssxref("border-left-width")}}
+ - {{cssxref("border-right-width")}}
+ - {{cssxref("border-top-width")}}
+- [CSS オーバーフロー](/ja/docs/Web/CSS/CSS_overflow)モジュール
+ - {{CSSxRef("overflow")}} 一括指定プロパティ
+ - {{CSSxRef("overflow-block")}}
+ - {{CSSxRef("overflow-clip-margin")}}
+ - {{CSSxRef("overflow-inline")}}
+ - {{CSSxRef("overflow-x")}}
+ - {{CSSxRef("overflow-y")}}
+ - {{CSSxRef("text-overflow")}}
+- [CSS グリッドレイアウト](/ja/docs/Web/CSS/CSS_grid_layout)モジュール
+ - {{CSSxRef("grid")}}
+ - {{CSSxRef("grid-auto-columns")}}
+ - {{CSSxRef("grid-auto-rows")}}
+ - {{CSSxRef("grid-template-columns")}}
+ - {{CSSxRef("grid-template-rows")}}
+ - {{CSSxRef("repeat")}}
+ - {{CSSxRef("minmax")}} 関数
+- [CSS フレックスボックスレイアウト](/ja/docs/Web/CSS/CSS_flexible_box_layout)モジュール
+ - {{CSSxRef("flex-basis")}}
+ - {{CSSxRef("flex")}}
+
+## 仕様書
+
+{{Specifications}}
+
+## 関連情報
+
+- [CSS 表示](/ja/docs/Web/CSS/CSS_display)モジュール
+- [CSS フレックスボックスレイアウト](/ja/docs/Web/CSS/CSS_flexible_box_layout)モジュール
+- [CSS グリッドレイアウト](/ja/docs/Web/CSS/CSS_grid_layout)モジュール
+- [CSS 位置指定レイアウト](/ja/docs/Web/CSS/CSS_positioned_layout)モジュール
+- [CSS 断片化](/ja/docs/Web/CSS/CSS_fragmentation)モジュール
From 474f64a9fdd4c91184ef3cffcbbd0c56d08ce515 Mon Sep 17 00:00:00 2001
From: Masahiro FUJIMOTO
Date: Mon, 22 Jul 2024 08:26:57 +0900
Subject: [PATCH 062/185] =?UTF-8?q?2024/06/27=20=E6=99=82=E7=82=B9?=
=?UTF-8?q?=E3=81=AE=E8=8B=B1=E8=AA=9E=E7=89=88=E3=81=AB=E5=9F=BA=E3=81=A5?=
=?UTF-8?q?=E3=81=8D=E6=9B=B4=E6=96=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
files/ja/web/css/calc-keyword/index.md | 11 +++++------
1 file changed, 5 insertions(+), 6 deletions(-)
diff --git a/files/ja/web/css/calc-keyword/index.md b/files/ja/web/css/calc-keyword/index.md
index 28d7115faba135..36211c82eb8bf8 100644
--- a/files/ja/web/css/calc-keyword/index.md
+++ b/files/ja/web/css/calc-keyword/index.md
@@ -1,18 +1,17 @@
---
-title:
+title:
slug: Web/CSS/calc-keyword
-original_slug: Web/CSS/calc-constant
l10n:
- sourceCommit: fb1c7f8985e4c4142f482f809366e3cba6b96b94
+ sourceCommit: 62ebcab471aceef4d843e57e310dae4ab1eda94a
---
{{CSSRef}}
-**``** は [CSS](/ja/docs/Web/CSS) の[データ型](/ja/docs/Web/CSS/CSS_Types)で、 `e` や `pi` のようなよく定義された定数を表します。これらの数学定数を何桁も手作業で入力したり、計算したりする必要はなく、利便性のために CSS によって直接提供されています。
+**``** は [CSS](/ja/docs/Web/CSS) の[データ型](/ja/docs/Web/CSS/CSS_Types)で、 `e` や `pi` のようなよく定義された定数を表します。これらの数学定数を何桁も手作業で入力したり、計算したりする必要はなく、利便性のために CSS によって直接提供されています。
## 構文
-`` 型は、 [CSS 数学関数](/ja/docs/Web/CSS/CSS_Functions#数学関数)で使用される数値の定数を定義します。
+`` 型は、 [CSS 数学関数](/ja/docs/Web/CSS/CSS_Functions#数学関数)で使用される数値の定数を定義します。
### 値
@@ -66,7 +65,7 @@ l10n:
- `line-height: e;` は無効ですが、 `line-height: calc(e);` は有効です。
- `rotate(1rad * pi);` は動作しません。 {{CSSxRef("transform-function/rotate", "rotate()")}} は数学関数ではないからです。 `rotate(calc(1rad * pi));` を使用してください。
-数学関数では、 `` 値は {{CSSxRef("number")}} 値として評価されるので、 `e` と `pi` は数値定数として動作します。
+数学関数では、 `` 値は {{CSSxRef("number")}} 値として評価されるので、 `e` と `pi` は数値定数として動作します。
`infinity` と `NaN` は少し異なり、退化した数値定数とみなされます。
技術的には数値ではありませんが、 {{CSSxRef("number")}} 値として動作するので、例えば無限大の {{CSSxRef("length")}} を取得するには `calc(infinity * 1px)` のような式が必要となります。
From 7ce846c2e18d5c8ff9c18ea82d68a1b1545c59be Mon Sep 17 00:00:00 2001
From: Masahiro FUJIMOTO
Date: Fri, 26 Jul 2024 23:08:01 +0900
Subject: [PATCH 063/185] =?UTF-8?q?2024/07/01=20=E6=99=82=E7=82=B9?=
=?UTF-8?q?=E3=81=AE=E8=8B=B1=E8=AA=9E=E7=89=88=E3=81=AB=E5=9F=BA=E3=81=A5?=
=?UTF-8?q?=E3=81=8D=E6=9B=B4=E6=96=B0=20(#22527)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* 2024/07/01 時点の英語版に基づき更新
* Update index.md
---
.../building_blocks/event_bubbling/index.md | 620 ++++++++++++------
1 file changed, 404 insertions(+), 216 deletions(-)
diff --git a/files/ja/learn/javascript/building_blocks/event_bubbling/index.md b/files/ja/learn/javascript/building_blocks/event_bubbling/index.md
index 12af14e369be3f..71eaba00014812 100644
--- a/files/ja/learn/javascript/building_blocks/event_bubbling/index.md
+++ b/files/ja/learn/javascript/building_blocks/event_bubbling/index.md
@@ -1,226 +1,414 @@
---
-title: イベントターゲットの比較
+title: イベントのバブリング
slug: Learn/JavaScript/Building_blocks/Event_bubbling
-original_slug: Web/API/Event/Comparison_of_Event_Targets
l10n:
- sourceCommit: 196cc4ff3068a59b962a3fe1cbb960eb72ef542b
+ sourceCommit: c20c12fab32381b983b4148d712fda227d34e2bd
---
-{{ ApiRef() }}
-
-イベントハンドラーを書くときに、どのイベントターゲットを調べればいいのか迷うことはよくあります。この記事では、ターゲットプロパティの使い方を明確にします。
-
-検討すべきターゲットは 5 つあります。
-
-
-
-### `explicitOriginalTarget` と `originalTarget` の使用
-
-> **メモ:** これらのプロパティは、 Mozilla ベースのブラウザーでのみ利用可能です。
-
-### 例
+{{LearnSidebar}}{{PreviousMenuNext("Learn/JavaScript/Building_blocks/Events","Learn/JavaScript/Building_blocks/Image_gallery", "Learn/JavaScript/Building_blocks")}}
+
+ウェブページは見出し、テキストの段落、画像、ボタンなどの「要素」で構成されており、これらの要素に発生するイベントを待ち受けすることができることを見てきました。例えば、ボタンにリスナーを追加すると、ユーザーがボタンをクリックしたときに実行することができます。
+
+また、これらの要素は他の要素の中に「入れ子」にすることができます。例えば、{{htmlelement("button")}} は {{htmlelement("div")}} 要素の中に置くことができます。この場合、 `` 要素を親要素、 `
` 要素を子要素と呼びます。
+
+この章では、親要素にイベントリスナーを追加し、ユーザーが子要素をクリックするとどうなるかを見ていきます。
+
+## イベントのバブリングの紹介
+
+### 親要素へのリスナーの設定
+
+このようなウェブページがあるとします。
```html
-
-
-
-
-
- Comparison of Event Targets
-
-
-
-
-
-
-
- Original target dispatching the event event.target
-
-
- Target who's event listener is being processed
- event.currentTarget
-
-
- Identify other element (if any) involved in the event
- event.relatedTarget
-
-
- If there was a retargeting of the event for some reason
- event.explicitOriginalTarget contains the target
- before retargeting (never contains anonymous targets)
-
-
- If there was a retargeting of the event for some reason
- event.originalTarget contains the target before
- retargeting (may contain anonymous targets)
-
-
-
-
-
-
-
-
-
-
-
+
+ ここをクリック
+
+
+```
+
+ここではボタンは別の要素 {{HTMLElement("div")}} の中にあります。ここでは、`` 要素は、それを格納する要素の**親**であると言います。親要素にクリックイベントハンドラーを追加し、ボタンをクリックするとどうなるでしょうか?
+
+```js
+const output = document.querySelector("#output");
+function handleClick(e) {
+ output.textContent += `${e.currentTarget.tagName} 要素をクリックしました\n`;
+}
+
+const container = document.querySelector("#container");
+container.addEventListener("click", handleClick);
+```
+
+{{ EmbedLiveSample('Setting a listener on a parent element', '100%', 200, "", "") }}
+
+ユーザーがボタンをクリックすると、親のクリックイベントが発生することが分かります。
+
+```plain
+DIV 要素をクリックしました
+```
+
+これで、このボタンは `
` の中にあるので、ボタンをクリックすると、その中にある要素も暗黙のうちにクリックしたことになることが分かります。
+
+### バブリングの例
+
+ボタンとその親にイベントリスナーを追加したらどうなるでしょうか?
+
+```html
+
+
+ ここをクリック
+
+
+
+```
+
+ボタンとその親 (`
`)、そして両方を格納する {{HTMLElement("body")}} 要素にクリックイベントハンドラーを追加してみましょう。
+
+```js
+const output = document.querySelector("#output");
+function handleClick(e) {
+ output.textContent += `${e.currentTarget.tagName} 要素をクリックしました\n`;
+}
+
+const container = document.querySelector("#container");
+const button = document.querySelector("button");
+
+document.body.addEventListener("click", handleClick);
+container.addEventListener("click", handleClick);
+button.addEventListener("click", handleClick);
+```
+
+{{ EmbedLiveSample('Bubbling example', '100%', 200, "", "") }}
+
+ユーザーがボタンをクリックすると、3つの要素すべてでクリックイベントが発行されることが分かります。
+
+```plain
+BUTTON 要素をクリックしました
+DIV 要素をクリックしました
+BODY 要素をクリックしました
+```
+
+この場合は次のようになります。
+
+- ボタンのクリックが最初に発行されます。
+- その親(`
`要素)のクリックが続きます。
+- `
` 要素の親(`` 要素)のクリックが続きます。
+
+このことを、クリックされた最も内側の要素からイベントが**バブルアップ**すると言います。
+
+この動作は有益なこともあれば、予期せぬ問題を発生させることもあります。この節では、この動作が引き起こす問題を見て、解決策を探ります。
+
+### 動画プレイヤーの例
+
+この例では、最初は非表示になっている動画と、「動画を表示」と表示されたボタンがページにあります。以下のように操作したいと思います。
+
+- ユーザーが「動画を表示」ボタンをクリックしたら、動画を含むボックスを表示させますが、動画の再生はまだ始めません。
+- ユーザーが動画をクリックすると、動画の再生を開始します。
+- ユーザーが動画以外のボックスのどこかをクリックしたら、ボックスを非表示にします。
+
+HTML はこのようになります。
+
+```html-nolint
+
動画を表示
+
+
+
+
+
+ このブラウザーは HTML の動画に対応していません。
+ 代わりに動画へのリンク があります。
+
+
+
+```
+
+以下のものがあります。
+
+- `
` 要素
+- `` 要素で、初期状態では `class="hidden"` 属性がある
+- `
` 要素(`` 要素の中にある)
+
+CSS を使用して、`"hidden"` クラスを設定した要素を非表示にしています。
+
+```css hidden
+div {
+ width: 100%;
+ height: 100%;
+ background-color: #eee;
+}
+
+.hidden {
+ display: none;
+}
+
+div video {
+ padding: 40px;
+ display: block;
+ width: 400px;
+ margin: 40px auto;
+}
+```
+
+JavaScript はこのようになります。
+
+```js
+const btn = document.querySelector("button");
+const box = document.querySelector("div");
+const video = document.querySelector("video");
+
+btn.addEventListener("click", () => box.classList.remove("hidden"));
+video.addEventListener("click", () => video.play());
+box.addEventListener("click", () => box.classList.add("hidden"));
+```
+
+これは 3 つの `'click'` イベントリスナーを追加します。
+
+- 1 つは `
` で、これは `` を格納した `` を表示させます。
+- 1 つは `
` で、これは動画の再生を始めるものです。
+- 1 つは `` で、動画を非表示にします。
+
+これがどのように動作するのか見てみましょう。
+
+{{ EmbedLiveSample('Video_player_example', '100%', 500) }}
+
+ボタンをクリックすると、ボックスとコンテナーそのものが表示されます。しかし、動画をクリックすると、動画の再生は始まりますが、ボックスは再び非表示になります。
+
+動画は `
` の中にあり、その一部なので、動画をクリックすると両方のイベント ハンドラーが実行され、このような動作が発生します。
+
+### stopPropagation() でこの問題を修正する
+
+前の節で見たように、イベントのバブリングは時に問題を引き起こすことがありますが、それを防ぐ方法があります。
+[`Event`](/ja/docs/Web/API/Event) オブジェクトには [`stopPropagation()`](/ja/docs/Web/API/Event/stopPropagation) という関数があり、イベントハンドラー内で呼び出されると、そのイベントが他の要素にバブリングするのを防ぎます。
+
+JavaScript を次のように変更することで、現在の問題を修正することができます。
+
+```js
+const btn = document.querySelector("button");
+const box = document.querySelector("div");
+const video = document.querySelector("video");
+
+btn.addEventListener("click", () => box.classList.remove("hidden"));
+
+video.addEventListener("click", (event) => {
+ event.stopPropagation();
+ video.play();
+});
+
+box.addEventListener("click", () => box.classList.add("hidden"));
+```
+
+ここでやっていることは、`
` 要素の `'click'` イベントハンドラーのイベントオブジェクトに対して `stopPropagation()` を呼び出しているだけです。これにより、そのイベントがボックスまで上がってくるのを止めることができます。これで、ボタンと動画の両方をクリックしてみてください。
+
+{{EmbedLiveSample("Fixing the problem with stopPropagation()", '100%', 500)}}
+
+```html-nolint hidden
+動画を表示
+
+
+
+
- Clicking on the text will show the difference between
- explicitOriginalTarget, originalTarget, and target
+ このブラウザーは HTML の動画に対応していません。
+ 代わりに動画へのリンク があります。
-
-
-
-```
-
-### `target` と `relatedTarget` の使用
-
-`mouseover` イベントの `relatedTarget` プロパティは、マウスが以前乗っていたノードを保持します。 `mouseout` イベントでは、マウスが移動した先のノードが保持されます。
-
-| イベント種別 | [event.target](/ja/docs/Web/API/Event/target) | [event.relatedTarget](/ja/docs/Web/API/MouseEvent/relatedTarget) |
-| ------------ | --------------------------------------------- | ---------------------------------------------------------------- |
-| `mouseover` | ポインティングデバイスが入った EventTarget | ポインティングデバイスが出た EventTarget |
-| `mouseout` | ポインティングデバイスが出た EventTarget | ポインティングデバイスが入った EventTarget |
-
-#### 例
-
-```xml
-
-
-
+
+
+```
+
+```css hidden
+div {
+ width: 100%;
+ height: 100%;
+ background-color: #eee;
+}
+
+.hidden {
+ display: none;
+}
+
+div video {
+ padding: 40px;
+ display: block;
+ width: 400px;
+ margin: 40px auto;
+}
+```
+
+## イベントのキャプチャ
+
+イベント伝播の別の形態として、「イベントキャプチャ」があります。これはイベントバブリングのようなものですが、順序が逆になります。つまり、イベントは対象となる最も内側の要素で最初に発生し、その後、入れ子の要素が浅くなっていくのではなく、イベントは最も入れ子の浅い要素で最初に発生し、その後、対象とする要素に達するまで、入れ子の要素が深くなっていきます。
+
+イベントのキャプチャは既定では無効です。有効にするには `addEventListener()` で `capture` オプションを渡す必要があります。
+
+この例は、`capture`オプションを使用していることを除けば、先ほど見た[バブリングの例](#バブリングの例)と同じです。
+
+```html
+
+
+ ここをクリック
+
+
+
+```
+
+```js
+const output = document.querySelector("#output");
+function handleClick(e) {
+ output.textContent += `${e.currentTarget.tagName} 要素をクリックしました\n`;
+}
+
+const container = document.querySelector("#container");
+const button = document.querySelector("button");
+
+document.body.addEventListener("click", handleClick, { capture: true });
+container.addEventListener("click", handleClick, { capture: true });
+button.addEventListener("click", handleClick);
```
+
+{{ EmbedLiveSample('Event capture', '100%', 200, "", "") }}
+
+この場合、メッセージの順番は逆になります。`` イベントハンドラーが最初に起動し、続いて `` イベントハンドラーが起動し、続いて `
` イベントハンドラーが起動します。
+
+```plain
+BODY 要素をクリックしました
+DIV 要素をクリックしました
+BUTTON 要素をクリックしました
+```
+
+なぜわざわざキャプチャとバブリングの両方を使うのでしょうか。昔、ブラウザー間の互換性が今よりずっと低かった頃、Netscape はイベントキャプチャのみを使用し、インターネットエクスプローラーはイベントバブリングのみを使用していました。W3C が動作を標準化し、コンセンサスを得ようと決めたとき、彼らは現行ブラウザーに実装されている、この両方を含むシステムに行き着きました。
+
+既定では、ほとんどすべてのイベントハンドラーはバブリングフェーズで登録され、この方がほとんどの場合において意味があります。
+
+## イベントの委譲
+
+前節では、イベントバブリングが発生させる問題と、それを修正する方法について見ていきました。しかし、イベントバブリングは単に迷惑なだけではありません。具体的な例としては、**イベント委譲** があります。この方法では、ユーザーが多数の子要素のいずれかを操作したときにコードを実行したい場合、子要素にイベントリスナーを個別に設定するのではなく、子要素の親要素にイベントリスナーを設定し、子要素で発生したイベントが親要素にバブルアップされるようにします。
+
+最初の例に戻りましょう。ユーザーがボタンをクリックしたときにページ全体の背景色を設定しました。その代わりに、ページが 16 のタイルに分割されていて、ユーザーがタイルをクリックしたときに各タイルにランダムな色を設定したいとします。
+
+こちらが HTML です。
+
+```html
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+タイルのサイズと位置を設定するために、ちょっとした CSS を設定します。
+
+```css
+.tile {
+ height: 100px;
+ width: 25%;
+ float: left;
+}
+```
+
+これで JavaScript で、すべてのタイルにクリックイベントハンドラーを追加することができます。しかし、よりシンプルで効率的なオプションは、親にクリックイベントハンドラーを設定し、ユーザーがタイルをクリックしたときにハンドラーが確実に実行されるようにイベントバブリングに頼っていることです。
+
+```js
+function random(number) {
+ return Math.floor(Math.random() * number);
+}
+
+function bgChange() {
+ const rndCol = `rgb(${random(255)} ${random(255)} ${random(255)})`;
+ return rndCol;
+}
+
+const container = document.querySelector("#container");
+
+container.addEventListener("click", (event) => {
+ event.target.style.backgroundColor = bgChange();
+});
+```
+
+出力は以下のとおりです(クリックしてみてください)。
+
+{{ EmbedLiveSample('Event delegation', '100%', 430, "", "") }}
+
+> **メモ:** この例では、`event.target` を使用して、イベントの対象となった要素(つまり、最も内側の要素)を取得しています。もし、このイベントを処理した要素(この用途ではコンテナー)にアクセスしたい場合は、`event.currentTarget` を使用することができます。
+
+> **メモ:** 完全なソースコードは [useful-eventtarget.html](https://github.com/mdn/learning-area/blob/main/javascript/building-blocks/events/useful-eventtarget.html) を参照してください。こちらの[ライブ実行](https://mdn.github.io/learning-area/javascript/building-blocks/events/useful-eventtarget.html)も参照してください。
+
+## `target` および `currentTarget`
+
+このページで紹介した例をよく見ていくと、クリックされた要素にアクセスするためにイベントオブジェクトの 2 つの異なるプロパティを使用していることがわかります。[親要素へのリスナーの設定](#親要素へのリスナーの設定)では、{{domxref("Event.currentTarget", "event.currentTarget")}}を使用しています。しかし、[イベント移譲](#イベント移譲)では、{{domxref("Event.target", "event.target")}} を使用しています。
+
+`target` は最初にイベントが発生した要素を参照し、`currentTarget` はこのイベントハンドラーが接続されている要素を参照するという違いがあります。
+
+イベントがバブルアップしている間 `target` は同じままですが、`currentTarget` は階層内の接続されている要素が異なれば、イベントハンドラーも異なります。
+
+上の[バブリングの例](#バブリングの例)を少しアレンジすると、このことがわかります。先ほどと同じ HTML を使用しています。
+
+```html
+
+
+ ここをクリック
+
+
+
+```
+
+JavaScript はほとんど同じですが、`target` と `currentTarget` の両方をログ出力しています。
+
+```js
+const output = document.querySelector("#output");
+function handleClick(e) {
+ const logTarget = `Target: ${e.target.tagName}`;
+ const logCurrentTarget = `Current target: ${e.currentTarget.tagName}`;
+ output.textContent += `${logTarget}, ${logCurrentTarget}\n`;
+}
+
+const container = document.querySelector("#container");
+const button = document.querySelector("button");
+
+document.body.addEventListener("click", handleClick);
+container.addEventListener("click", handleClick);
+button.addEventListener("click", handleClick);
+```
+
+ボタンをクリックしたとき、イベントハンドラーがボタン自身、``、`` のいずれに接続されていても、`target` は常にボタン要素であることに注意してください。しかし、`currentTarget` は現在実行しているイベントハンドラーの要素を特定します。
+
+{{embedlivesample("target and currentTarget")}}
+
+`target` プロパティは、上記の[イベント移譲](#イベント移譲)の例のように、イベント移譲でよく使用します。
+
+## スキルテスト
+
+この記事の最後に達しましたが、最も大切な情報を覚えていますか?次に進む前に、この情報が身に付いたかどうかを確認するテストがあります。[スキルテスト: イベント](/ja/docs/Learn/JavaScript/Building_blocks/Test_your_skills:_Events)を参照してください。
+
+## まとめ
+
+これで、この早い段階でウェブイベントについて知っておくべきことはすべてわかったはずです。
+前述したように、イベントは実のところ JavaScript のコアには属しません。ブラウザーの Web API で定義されています。
+
+また、JavaScript が使用されるさまざまなコンテキストには、異なるイベントモデルがあることを理解することが重要です。Web API から、ブラウザーの WebExtensions や Node.js (サーバーサイド JavaScript) などの他の領域までです。
+これでこれらの領域をすべて理解できるとは思っていませんが、ウェブ開発を学習していく上で、イベントの基本を理解しておくことはとても役に立ちます。
+
+> **メモ:** 行き詰まった場合は、[コミュニケーションチャンネル](/ja/docs/MDN/Community/Communication_channels)のいずれかに連絡してください。
+
+## 関連情報
+
+- [domevents.dev](https://domevents.dev/) — 探究を通して DOM イベントシステムの動作について学ぶことができる、とても有益なインタラクティブな遊び場アプリです。
+- [イベントリファレンス](/ja/docs/Web/Events)
+- [Event order](https://www.quirksmode.org/js/events_order.html) (キャプチャとバブリングの議論) — Peter-Paul Koch による素晴らしい作品です。
+
+{{PreviousMenuNext("Learn/JavaScript/Building_blocks/Events","Learn/JavaScript/Building_blocks/Image_gallery", "Learn/JavaScript/Building_blocks")}}
From 472d20381c0bf1cba6bf87098896c95b81c890a4 Mon Sep 17 00:00:00 2001
From: Masahiro FUJIMOTO
Date: Mon, 22 Jul 2024 23:55:54 +0900
Subject: [PATCH 064/185] =?UTF-8?q?orphaned/Tutorials=20=E3=82=92=E5=89=8A?=
=?UTF-8?q?=E9=99=A4?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
files/ja/_redirects.txt | 1 -
files/ja/_wikihistory.json | 4 --
files/ja/orphaned/tutorials/index.md | 80 ----------------------------
3 files changed, 85 deletions(-)
delete mode 100644 files/ja/orphaned/tutorials/index.md
diff --git a/files/ja/_redirects.txt b/files/ja/_redirects.txt
index 5319fd5349ca9c..8762286dd5dab9 100644
--- a/files/ja/_redirects.txt
+++ b/files/ja/_redirects.txt
@@ -2539,7 +2539,6 @@
/ja/docs/Transforming_XML_with_XSLT/The_Netscape_XSLT_XPath_Reference /ja/docs/Web/XSLT/Transforming_XML_with_XSLT/The_Netscape_XSLT_XPath_Reference
/ja/docs/Transforming_XML_with_XSLT:The_Netscape_XSLT_XPath_Reference /ja/docs/Web/XSLT/Transforming_XML_with_XSLT/The_Netscape_XSLT_XPath_Reference
/ja/docs/Traversing_an_HTML_table_with_JavaScript_and_DOM_Interfaces /ja/docs/Web/API/Document_Object_Model/Traversing_an_HTML_table_with_JavaScript_and_DOM_Interfaces
-/ja/docs/Tutorials /ja/docs/orphaned/Tutorials
/ja/docs/Tutorials/Using_CSS_gradients /ja/docs/Web/CSS/CSS_images/Using_CSS_gradients
/ja/docs/Upcoming_Firefox_features_for_developers /ja/docs/Mozilla/Firefox/Releases/4
/ja/docs/Updating_extensions_for_Firefox_2 /ja/docs/Mozilla/Firefox/Releases/2/Updating_extensions
diff --git a/files/ja/_wikihistory.json b/files/ja/_wikihistory.json
index b35a3e14481145..78710287ed8ed6 100644
--- a/files/ja/_wikihistory.json
+++ b/files/ja/_wikihistory.json
@@ -30420,10 +30420,6 @@
"modified": "2019-04-13T00:54:00.142Z",
"contributors": ["wbamberg", "Marsf", "Okome"]
},
- "orphaned/Tutorials": {
- "modified": "2019-03-23T23:15:45.631Z",
- "contributors": ["shinnn"]
- },
"orphaned/Web/API/Canvas_API/Tutorial/Hit_regions_and_accessibility": {
"modified": "2019-03-23T22:00:20.926Z",
"contributors": ["mfuji09", "yyss"]
diff --git a/files/ja/orphaned/tutorials/index.md b/files/ja/orphaned/tutorials/index.md
deleted file mode 100644
index 1f21c18382c293..00000000000000
--- a/files/ja/orphaned/tutorials/index.md
+++ /dev/null
@@ -1,80 +0,0 @@
----
-title: チュートリアル
-slug: orphaned/Tutorials
----
-
-SDK を使用したアドオンの開発方法を実践的に説明したページの一覧です。
-
----
-
-### はじめに
-
-- [インストール](/en-US/Add-ons/SDK/Tutorials/Installation)
- - : Windows、OS X および Linux 上で、SDK をダウンロード、インストール、および初期化します。
-- [トラブルシューティング](/en-US/Add-ons/SDK/Tutorials/Troubleshooting)
- - : よくある問題を解決する場合や、支援を求める場合のヒントを説明します。
-
-- [入門](/en-US/Add-ons/SDK/Tutorials/Getting_started_with_cfx)
- - : シンプルなアドオンを作成を始めるための手順の概略です。
-
-### ユーザーインターフェイスの作成
-
-- [ツールバーボタンの追加](/en-US/Add-ons/SDK/Tutorials/Adding_a_Button_to_the_Toolbar)
- - : Firefox アドオンツールバーにボタンを追加します。
-- [Firefox へのメニュー項目の追加](/en-US/Add-ons/SDK/Tutorials/Add_a_Menu_Item_to_Firefox)
- - : Firefox のメインメニューにアイテムを追加します。
-- [ポップアップの表示](/en-US/Add-ons/SDK/Tutorials/Display_a_Popup)
- - : HTML および JavaScript を使用して実装したポップアップダイアログを表示します。
-- [コンテキストメニュー項目の追加](/en-US/Add-ons/SDK/Tutorials/Add_a_Context_Menu_Item)
- - : Firefox のコンテキストメニューに項目を追加します。
-
----
-
-### ブラウザーの操作
-
-- [ウェブページを開く](/en-US/Add-ons/SDK/Tutorials/Open_a_Web_Page)
- - : tabs モジュールを用いて、新しいタブまたはウィンドウでウェブページを開き、そのコンテンツにアクセスします。
-- [ページの読み込みを確認する](/en-US/Add-ons/SDK/Tutorials/Listen_for_Page_Load)
- - : tabs モジュールを用いて、新しいウェブページが読み込まれたときに通知を受け取り、それらのウェブページのコンテンツにアクセスします。
-
-- [開いているタブの一覧を表示する](/en-US/Add-ons/SDK/Tutorials/List_Open_Tabs)
- - : tabs モジュールを用いて、現在開いているすべてのタブに対して反復処理を行い、それらのコンテンツにアクセスします。
-
-### ウェブページの変更
-
-- [URL に基づいたウェブページの変更](/en-US/Add-ons/SDK/Tutorials/Modifying_Web_Pages_Based_on_URL)
- - : URL に基づいてウェブページを検索するフィルタを作成します。フィルタに一致する URL のウェブページを読み込んだときに、フィルタ内の指定したスクリプトを実行します。
-- [アクティブなウェブページの変更](/en-US/Add-ons/SDK/Tutorials/Modifying_the_Page_Hosted_by_a_Tab)
- - : 現在アクティブなウェブページに、動的にスクリプトを読み込みます。
-
----
-
-### 開発テクニック
-
-- [ログの出力](/en-US/Add-ons/SDK/Tutorials/Logging)
- - : 診断を行うために、メッセージをコンソールにログとして出力します。
-- [再利用可能なモジュールの作成](/en-US/Add-ons/SDK/Tutorials/Creating_reusable_modules)
- - : アドオンを別個のモジュールとして体系化し、開発、デバッグ、およびメンテナンスを容易にします。 また、作成したモジュールが入った再利用可能なパッケージを作成し、他の開発者もそのモジュールを使用できるようにします。
-- [ユニットテスト](/en-US/Add-ons/SDK/Tutorials/Unit_testing)
- - : SDK のテストフレームワークを使用して、ユニットテストを作成し実行します。
-- [Chrome 権限](/en-US/Add-ons/SDK/Tutorials/Chrome_authority)
- - : この権限を使用すると、アドオンが Components オブジェクトにアクセスできるので、どんな XPCOM オブジェクトでも読み込んで使用できるようになります。
-- [イベントターゲットの作成](/en-US/Add-ons/SDK/Tutorials/Creating_event_targets)
- - : 定義したオブジェクトがイベントを発生させられるようにします。
-- [読み込みと読み込み解除の確認](/en-US/Add-ons/SDK/Tutorials/Listening_for_load_and_unload)
- - : Firefox にアドオンが読み込まれたり、読み込み解除されたりしたときに通知を受け取ります。またコマンドラインからアドオンに引数を渡します。
-- [サードパーティーモジュールの使用](/en-US/Add-ons/SDK/Tutorials/Add_a_Menu_Item_to_Firefox)
- - : SDK 自体に含まれていない追加のモジュールをインストールして使用します。
-- [ローカライゼーション](/en-US/Add-ons/SDK/Tutorials/l10n)
- - : ローカライズ可能なコードを作成します。
-- [モバイル開発](/en-US/Add-ons/SDK/Tutorials/Mobile_development)
- - : Android 用 Firefox モバイルのアドオン開発を始める手順を説明します。
-- [アドオン用のデバッガー](/en-US/Add-ons/SDK/Tutorials/Mobile_development)
- - : アドオン内の JavaScript のデバッグを行います。
-
----
-
-### 応用
-
-- [アノテーターアドオン](/en-US/Add-ons/SDK/Tutorials/Annotator)
- - : より複雑なアドオンの開発作業を順を追って説明します。
From 988bf1d1863641d01c5b68f61e65a6540bee8f23 Mon Sep 17 00:00:00 2001
From: MDN Web Docs GitHub Bot <108879845+mdn-bot@users.noreply.github.com>
Date: Fri, 26 Jul 2024 20:09:10 +0100
Subject: [PATCH 065/185] [ja] sync translated content (#22602)
* ja: sync translated content
* Update _redirects.txt
* Update _wikihistory.json
* Delete files/ja/orphaned/web/http/headers/permissions-policy/battery/index.md
---------
Co-authored-by: Masahiro FUJIMOTO
---
files/ja/_redirects.txt | 10 +++--
files/ja/_wikihistory.json | 24 +++++-------
.../api/window/{sidebar => external}/index.md | 3 +-
.../permissions-policy/battery/index.md | 38 -------------------
4 files changed, 18 insertions(+), 57 deletions(-)
rename files/ja/web/api/window/{sidebar => external}/index.md (97%)
delete mode 100644 files/ja/web/http/headers/permissions-policy/battery/index.md
diff --git a/files/ja/_redirects.txt b/files/ja/_redirects.txt
index 8762286dd5dab9..3efdfc2ae3d700 100644
--- a/files/ja/_redirects.txt
+++ b/files/ja/_redirects.txt
@@ -1019,7 +1019,7 @@
/ja/docs/DOM/window.setInterval /ja/docs/Web/API/setInterval
/ja/docs/DOM/window.setTimeout /ja/docs/Web/API/setTimeout
/ja/docs/DOM/window.showModalDialog /ja/docs/Web/API/Window/showModalDialog
-/ja/docs/DOM/window.sidebar /ja/docs/Web/API/Window/sidebar
+/ja/docs/DOM/window.sidebar /ja/docs/Web/API/Window/external
/ja/docs/DOM/window.sizeToContent /ja/docs/Web/API/Window/sizeToContent
/ja/docs/DOM/window.status /ja/docs/Web/API/Window/status
/ja/docs/DOM/window.status-redirect-1 /ja/docs/Web/API/Window/status
@@ -1226,7 +1226,7 @@
/ja/docs/DOM:window.setInterval /ja/docs/Web/API/setInterval
/ja/docs/DOM:window.setTimeout /ja/docs/Web/API/setTimeout
/ja/docs/DOM:window.showModalDialog /ja/docs/Web/API/Window/showModalDialog
-/ja/docs/DOM:window.sidebar /ja/docs/Web/API/Window/sidebar
+/ja/docs/DOM:window.sidebar /ja/docs/Web/API/Window/external
/ja/docs/DOM:window.sizeToContent /ja/docs/Web/API/Window/sizeToContent
/ja/docs/DOM:window.status /ja/docs/Web/API/Window/status
/ja/docs/DOM:window.statusbar /ja/docs/Web/API/Window/statusbar
@@ -3183,6 +3183,7 @@
/ja/docs/Web/API/Window/restore /ja/docs/Web/API/Window/moveTo
/ja/docs/Web/API/Window/setInterval /ja/docs/Web/API/setInterval
/ja/docs/Web/API/Window/setTimeout /ja/docs/Web/API/setTimeout
+/ja/docs/Web/API/Window/sidebar /ja/docs/Web/API/Window/external
/ja/docs/Web/API/Window/transitioncancel_event /ja/docs/Web/API/Element/transitioncancel_event
/ja/docs/Web/API/Window/transitionend_event /ja/docs/Web/API/Element/transitionend_event
/ja/docs/Web/API/Window/transitionrun_event /ja/docs/Web/API/Element/transitionrun_event
@@ -3485,7 +3486,7 @@
/ja/docs/Web/API/window.setInterval /ja/docs/Web/API/setInterval
/ja/docs/Web/API/window.setTimeout /ja/docs/Web/API/setTimeout
/ja/docs/Web/API/window.showModalDialog /ja/docs/Web/API/Window/showModalDialog
-/ja/docs/Web/API/window.sidebar /ja/docs/Web/API/Window/sidebar
+/ja/docs/Web/API/window.sidebar /ja/docs/Web/API/Window/external
/ja/docs/Web/API/window.sizeToContent /ja/docs/Web/API/Window/sizeToContent
/ja/docs/Web/API/window.status /ja/docs/Web/API/Window/status
/ja/docs/Web/API/window.statusbar /ja/docs/Web/API/Window/statusbar
@@ -4163,7 +4164,7 @@
/ja/docs/Web/HTTP/Headers/Feature-Policy/accelerometer /ja/docs/Web/HTTP/Headers/Permissions-Policy/accelerometer
/ja/docs/Web/HTTP/Headers/Feature-Policy/ambient-light-sensor /ja/docs/Web/HTTP/Headers/Permissions-Policy/ambient-light-sensor
/ja/docs/Web/HTTP/Headers/Feature-Policy/autoplay /ja/docs/Web/HTTP/Headers/Permissions-Policy/autoplay
-/ja/docs/Web/HTTP/Headers/Feature-Policy/battery /ja/docs/Web/HTTP/Headers/Permissions-Policy/battery
+/ja/docs/Web/HTTP/Headers/Feature-Policy/battery /ja/docs/Web/HTTP/Headers/Permissions-Policy
/ja/docs/Web/HTTP/Headers/Feature-Policy/camera /ja/docs/Web/HTTP/Headers/Permissions-Policy/camera
/ja/docs/Web/HTTP/Headers/Feature-Policy/display-capture /ja/docs/Web/HTTP/Headers/Permissions-Policy/display-capture
/ja/docs/Web/HTTP/Headers/Feature-Policy/document-domain /ja/docs/Web/HTTP/Headers/Permissions-Policy/document-domain
@@ -4179,6 +4180,7 @@
/ja/docs/Web/HTTP/Headers/Feature-Policy/web-share /ja/docs/Web/HTTP/Headers/Permissions-Policy/web-share
/ja/docs/Web/HTTP/Headers/Feature-Policy/xr /ja/docs/conflicting/Web/HTTP/Headers/Feature-Policy/xr-spatial-tracking
/ja/docs/Web/HTTP/Headers/Feature-Policy/xr-spatial-tracking /ja/docs/Web/HTTP/Headers/Permissions-Policy/xr-spatial-tracking
+/ja/docs/Web/HTTP/Headers/Permissions-Policy/battery /ja/docs/Web/HTTP/Headers/Permissions-Policy
/ja/docs/Web/HTTP/Headers/Set-Cookie2 /ja/docs/Web/HTTP/Headers/Set-Cookie
/ja/docs/Web/HTTP/Index /ja/docs/Web/HTTP
/ja/docs/Web/HTTP/Link_prefetching_FAQ /ja/docs/Glossary/Prefetch
diff --git a/files/ja/_wikihistory.json b/files/ja/_wikihistory.json
index 78710287ed8ed6..663195890c96e1 100644
--- a/files/ja/_wikihistory.json
+++ b/files/ja/_wikihistory.json
@@ -13984,6 +13984,16 @@
"modified": "2020-10-15T22:00:39.694Z",
"contributors": ["yyss", "mk-tool"]
},
+ "Web/API/Window/external": {
+ "modified": "2019-03-23T23:50:31.021Z",
+ "contributors": [
+ "teoli",
+ "AshfaqHossain",
+ "kohei.yoshino",
+ "ethertank",
+ "Potappo"
+ ]
+ },
"Web/API/Window/fetch": {
"modified": "2020-10-15T21:41:32.875Z",
"contributors": [
@@ -14525,16 +14535,6 @@
"Potappo"
]
},
- "Web/API/Window/sidebar": {
- "modified": "2019-03-23T23:50:31.021Z",
- "contributors": [
- "teoli",
- "AshfaqHossain",
- "kohei.yoshino",
- "ethertank",
- "Potappo"
- ]
- },
"Web/API/Window/sizeToContent": {
"modified": "2019-03-23T23:51:38.117Z",
"contributors": ["teoli", "khalid32", "ethertank", "Potappo"]
@@ -21931,10 +21931,6 @@
"modified": "2020-10-15T22:11:22.688Z",
"contributors": ["mfuji09"]
},
- "Web/HTTP/Headers/Permissions-Policy/battery": {
- "modified": "2020-10-15T22:34:41.072Z",
- "contributors": ["mfuji09"]
- },
"Web/HTTP/Headers/Permissions-Policy/camera": {
"modified": "2020-10-15T22:11:23.091Z",
"contributors": ["mfuji09"]
diff --git a/files/ja/web/api/window/sidebar/index.md b/files/ja/web/api/window/external/index.md
similarity index 97%
rename from files/ja/web/api/window/sidebar/index.md
rename to files/ja/web/api/window/external/index.md
index 20e41b5adcff2c..bed5e9e252f91d 100644
--- a/files/ja/web/api/window/sidebar/index.md
+++ b/files/ja/web/api/window/external/index.md
@@ -1,6 +1,7 @@
---
title: Window.sidebar
-slug: Web/API/Window/sidebar
+slug: Web/API/Window/external
+original_slug: Web/API/Window/sidebar
---
{{APIRef}} {{Deprecated_Header}}
diff --git a/files/ja/web/http/headers/permissions-policy/battery/index.md b/files/ja/web/http/headers/permissions-policy/battery/index.md
deleted file mode 100644
index 678001b99f1fd7..00000000000000
--- a/files/ja/web/http/headers/permissions-policy/battery/index.md
+++ /dev/null
@@ -1,38 +0,0 @@
----
-title: "Feature-Policy: battery"
-slug: Web/HTTP/Headers/Permissions-Policy/battery
----
-
-{{HTTPSidebar}}{{SeeCompatTable}}
-
-HTTP の {{HTTPHeader("Feature-Policy")}} ヘッダーにおける `battery` ディレクティブは、現在の文書で {{DOMxRef("Navigator.getBattery","Navigator.getBattery()")}} で得られる {{DOMxRef("BatteryManager")}} インターフェイスを通じて、端末のバッテリーに関する情報の収集を許可するかどうかを制御します。
-
-## 構文
-
-```
-Feature-Policy: battery ;
-```
-
-- \
- - : この機能を許可するオリジンのリストです。 [`Feature-Policy`](/ja/docs/Web/HTTP/Headers/Feature-Policy#%E6%A7%8B%E6%96%87) を参照してください。
-
-## 既定のポリシー
-
-`battery` の許可リストの既定値は `'self'` です。
-
-## 仕様書
-
-{{Specifications}}
-
-## ブラウザーの互換性
-
-{{Compat}}
-
-## 関連情報
-
-- {{HTTPHeader("Feature-Policy")}} ヘッダー
-- [機能ポリシー](/ja/docs/Web/HTTP/Feature_Policy)
-- [機能ポリシーの使用](/ja/docs/Web/HTTP/Feature_Policy/Using_Feature_Policy)
-- [Battery Status API](/ja/docs/Web/API/Battery_Status_API)
-- {{DOMxRef("Navigator.getBattery","Navigator.getBattery()")}}
-- {{DOMxRef("BatteryManager")}}
From a0d9ae6166918ea749ce8e85983504ba9869276f Mon Sep 17 00:00:00 2001
From: A1lo
Date: Sat, 27 Jul 2024 10:32:40 +0800
Subject: [PATCH 066/185] zh: convert noteblocks in `/webassembly` to GFM
syntax (#22623)
---
files/zh-cn/webassembly/c_to_wasm/index.md | 18 ++++++---
files/zh-cn/webassembly/concepts/index.md | 6 ++-
.../javascript_interface/global/index.md | 3 +-
.../instantiate_static/index.md | 9 +++--
.../instantiatestreaming_static/index.md | 6 ++-
.../javascript_interface/memory/index.md | 3 +-
.../javascript_interface/table/index.md | 3 +-
.../webassembly/loading_and_running/index.md | 12 ++++--
files/zh-cn/webassembly/rust_to_wasm/index.md | 3 +-
.../webassembly/text_format_to_wasm/index.md | 6 ++-
.../understanding_the_text_format/index.md | 39 ++++++++++++-------
.../using_the_javascript_api/index.md | 24 ++++++++----
files/zh-tw/webassembly/c_to_wasm/index.md | 9 +++--
files/zh-tw/webassembly/concepts/index.md | 6 ++-
14 files changed, 98 insertions(+), 49 deletions(-)
diff --git a/files/zh-cn/webassembly/c_to_wasm/index.md b/files/zh-cn/webassembly/c_to_wasm/index.md
index 6fbd7ac23b969b..653d44df59609e 100644
--- a/files/zh-cn/webassembly/c_to_wasm/index.md
+++ b/files/zh-cn/webassembly/c_to_wasm/index.md
@@ -20,7 +20,8 @@ slug: WebAssembly/C_to_Wasm
- 主系统编译器 — 在 Linux 下,[安装 GCC](http://askubuntu.com/questions/154402/install-gcc-on-ubuntu-12-04-lts)。在 macOS 下,[安装 Xcode](https://itunes.apple.com/us/app/xcode/id497799835)。在 Windows 下,安装 [Visual Studio Community 2015 with Update 3 or newer](https://www.microsoft.com/zh-CN/download/details.aspx?id=48146)。
- Python 2.7.x — On Linux and macOS, this is most likely provided out of the box. 从 [初学者指南](https://wiki.python.org/moin/BeginnersGuide/Downloadhere) 获取帮助。在 Windows 上,从 [Python 主页](https://www.python.org/downloads/)获取安装包。
-> **备注:** 在 Windows 下你可能需要 [pywin32](https://sourceforge.net/projects/pywin32/files/pywin32/),为了降低安装 pywin32 可能遇到的错误,请使用管理员权限在 cmd 内运行安装程序。
+> [!NOTE]
+> 在 Windows 下你可能需要 [pywin32](https://sourceforge.net/projects/pywin32/files/pywin32/),为了降低安装 pywin32 可能遇到的错误,请使用管理员权限在 cmd 内运行安装程序。
### 编译 Emscripten
@@ -50,9 +51,11 @@ emsdk activate --global --build=Release sdk-incoming-64bit binaryen-master-64bit
安装过程可以会花上一点时间,是时候去休息一下。安装程序会设置所有 Emscripten 运行所需要的环境变量。
-> **备注:** global 标识会让 PATH 变量在全局被设置,所以接下来所打开的终端或者命令行窗口都会被设置。如果你仅仅想让 Emscripten 在当前窗口生效,就删掉这个标识。
+> [!NOTE]
+> global 标识会让 PATH 变量在全局被设置,所以接下来所打开的终端或者命令行窗口都会被设置。如果你仅仅想让 Emscripten 在当前窗口生效,就删掉这个标识。
-> **备注:** 每当你想要使用 Emscripten 时,尝试从远程更新最新的 emscripten 代码是个很好的习惯(运行 git pull)。如果有更新,重新执行 install 和 activate 命令。这样就可以确保你使用的 Emscripten 一直保持最新。
+> [!NOTE]
+> 每当你想要使用 Emscripten 时,尝试从远程更新最新的 emscripten 代码是个很好的习惯(运行 git pull)。如果有更新,重新执行 install 和 activate 命令。这样就可以确保你使用的 Emscripten 一直保持最新。
现在让我们进入 emsdk 文件夹,输入以下命令来让你进入接下来的流程,编译一个样例 C 程序到 asm.js 或者 wasm。
@@ -108,7 +111,8 @@ emsdk_env.bat
现在使用一个支持 WebAssembly 的浏览器,加载生成的 `hello.html`。自从 Firefox 版本 52、Chrome 版本 57 和 Opera 版本 44 开始,已经默认启用了 WebAssembly。
-> **备注:** 如果你试图直接从本地硬盘打开生成的 HTML 文件(`hello.html`)(例如 `file://your_path/hello.html`),你会得到一个错误信息,大意是 _`both async and sync fetching of the wasm failed`_。你需要通过 HTTP 服务器(`http://`)运行你的 HTML 文件——参见[如何设置本地测试服务器](/zh-CN/docs/Learn/Common_questions/Tools_and_setup/set_up_a_local_testing_server)获取更多信息。
+> [!NOTE]
+> 如果你试图直接从本地硬盘打开生成的 HTML 文件(`hello.html`)(例如 `file://your_path/hello.html`),你会得到一个错误信息,大意是 _`both async and sync fetching of the wasm failed`_。你需要通过 HTTP 服务器(`http://`)运行你的 HTML 文件——参见[如何设置本地测试服务器](/zh-CN/docs/Learn/Common_questions/Tools_and_setup/set_up_a_local_testing_server)获取更多信息。
如果一切顺利,你应该可以在页面上的 Emscripten 控制台和浏览器控制台中看到“Hello World”的输出。
@@ -148,7 +152,8 @@ emsdk_env.bat
4. 下面让我们来运行这个例子。上面的命令已经生成了 hello2.html,内容和我们使用的模板非常相像,只不过多加了一些 js 胶水和加载 wasm 文件的代码。在浏览器中打开它,你会看到与上一个例子相同的输出。
-> **备注:** 通过用.js 取代.htm(l) 作为文件后缀名,你就可以得到只有 JavaScript 的输出文件,而不再是完整的 HTML 文件。例如:`emcc -o hello2.js hello2.c -O3 -s WASM=1`. 你可以完全从零开始创建你自己的 HTML 文件。尽管如此,不推荐这样做。因为 Emscripten 需要大量的 JavaScript“胶水”代码从而能够 处理内存分配、内存泄漏以及大量的其他问题。这些问题都已经在提供的模板中得到了处理。使用模板要比自己编写模板要容易得多。不过,当对模板所做的事情越来越熟悉的时候,你就能够按照自己的需要创建定制化的模板了。
+> [!NOTE]
+> 通过用.js 取代.htm(l) 作为文件后缀名,你就可以得到只有 JavaScript 的输出文件,而不再是完整的 HTML 文件。例如:`emcc -o hello2.js hello2.c -O3 -s WASM=1`. 你可以完全从零开始创建你自己的 HTML 文件。尽管如此,不推荐这样做。因为 Emscripten 需要大量的 JavaScript“胶水”代码从而能够 处理内存分配、内存泄漏以及大量的其他问题。这些问题都已经在提供的模板中得到了处理。使用模板要比自己编写模板要容易得多。不过,当对模板所做的事情越来越熟悉的时候,你就能够按照自己的需要创建定制化的模板了。
## 调用一个定义在 C 中的自定义方法
@@ -181,7 +186,8 @@ emsdk_env.bat
默认情况下,Emscripten 生成的代码只会调用 `main()` 函数,其他的函数将被视为无用代码。在一个函数名之前添加 `EMSCRIPTEN_KEEPALIVE` 能够防止这样的事情发生。你需要导入 `emscripten.h` 库来使用 `EMSCRIPTEN_KEEPALIVE`。
- > **备注:** 为了保证万一你想在 C++ 代码中引用这些代码时代码可以正常工作,我们添加了 `#ifdef` 代码块。由于 C 与 C++ 中名字修饰规则的差异,添加的代码块有可能产生问题,但目前我们设置了这一额外的代码块以保证你使用 C++ 时,这些代码会被视为外部 C 语言函数。
+ > [!NOTE]
+ > 为了保证万一你想在 C++ 代码中引用这些代码时代码可以正常工作,我们添加了 `#ifdef` 代码块。由于 C 与 C++ 中名字修饰规则的差异,添加的代码块有可能产生问题,但目前我们设置了这一额外的代码块以保证你使用 C++ 时,这些代码会被视为外部 C 语言函数。
2. 为了方便起见,现在将 `html_template/shell_minimal.html` 也添加到这一目录(但在实际开发环境中你肯定需要将其放到某一特定位置)。
3. 运行以下命令编译:(注意由于使用 ccall 函数,需要添加指定参数)
diff --git a/files/zh-cn/webassembly/concepts/index.md b/files/zh-cn/webassembly/concepts/index.md
index d9387582bafbcd..e009f9785d1516 100644
--- a/files/zh-cn/webassembly/concepts/index.md
+++ b/files/zh-cn/webassembly/concepts/index.md
@@ -26,7 +26,8 @@ WebAssembly 是一种运行在现代 web 浏览器中的新型代码,并且提
- 保持安全——WebAssembly 被限制运行在一个安全的沙箱执行环境中。像其他网络代码一样,它遵循浏览器的同源策略和授权策略。
- 不破坏 Web——WebAssembly 的设计原则是与其他网络技术和谐共处并保持向后兼容。
-> **备注:** WebAssembly 也用在网络和 JavaScript 环境之外(参考[非网络嵌入](http://webassembly.org/docs/non-web/))。
+> [!NOTE]
+> WebAssembly 也用在网络和 JavaScript 环境之外(参考[非网络嵌入](http://webassembly.org/docs/non-web/))。
## WebAssembly 如何适应网络平台?
@@ -95,7 +96,8 @@ Emscripten 工具可以将任何 C/C++ 源代码编译成 Wasm 模块,再加
2. Emscripten 将 clang+LLVM 编译的结果转换为 Wasm 二进制文件。
3. 目前,WebAssembly 本身无法直接访问 DOM;它只能调用 JavaScript,并且只能传入整型和浮点型的原始数据类型作为参数。这就是说,为了使用任何 Web API,WebAssembly 需要调用 JavaScript,然后由 JavaScript 进行 Web API 调用。因此,Emscripten 创建了 HTML 和 JavaScript 粘合代码以便完成这些功能。
-> **备注:** 计划将来[允许 WebAssembly 直接调用 Web API](https://github.com/WebAssembly/gc/blob/master/README.md)。
+> [!NOTE]
+> 计划将来[允许 WebAssembly 直接调用 Web API](https://github.com/WebAssembly/gc/blob/master/README.md)。
JavaScript 粘合代码并不是像你想象的那么简单。首先,Emscripten 实现了流行的 C/C++ 库,比如,[SDL](https://zh.wikipedia.org/wiki/SDL)、[OpenGL](https://zh.wikipedia.org/wiki/OpenGL)、[OpenAL](https://zh.wikipedia.org/wiki/OpenAL) 以及部分 [POSIX](https://zh.wikipedia.org/wiki/可移植操作系统接口)。这些库以 Web API 的形式实现,并且每个库需要一个 JavaScript 粘合代码来连接 WebAssembly 和低层的 Web API。
diff --git a/files/zh-cn/webassembly/javascript_interface/global/index.md b/files/zh-cn/webassembly/javascript_interface/global/index.md
index b643dc139d136a..59e3babe839e84 100644
--- a/files/zh-cn/webassembly/javascript_interface/global/index.md
+++ b/files/zh-cn/webassembly/javascript_interface/global/index.md
@@ -71,7 +71,8 @@ WebAssembly.instantiateStreaming(fetch("global.wasm"), { js: { global } }).then(
);
```
-> **备注:** 你可以查看 [GitHub 上运行的实时](https://mdn.github.io/webassembly-examples/js-api-examples/global.html)示例;也可以查看[源代码](https://github.com/mdn/webassembly-examples/blob/master/js-api-examples/global.html)。
+> [!NOTE]
+> 你可以查看 [GitHub 上运行的实时](https://mdn.github.io/webassembly-examples/js-api-examples/global.html)示例;也可以查看[源代码](https://github.com/mdn/webassembly-examples/blob/master/js-api-examples/global.html)。
## 规格
diff --git a/files/zh-cn/webassembly/javascript_interface/instantiate_static/index.md b/files/zh-cn/webassembly/javascript_interface/instantiate_static/index.md
index 82b81bc0533a01..a9d6638b214e02 100644
--- a/files/zh-cn/webassembly/javascript_interface/instantiate_static/index.md
+++ b/files/zh-cn/webassembly/javascript_interface/instantiate_static/index.md
@@ -10,7 +10,8 @@ slug: WebAssembly/JavaScript_interface/instantiate_static
- 第一种主要重载方式使用 WebAssembly 二进制代码的 [typed array](/zh-CN/docs/Web/JavaScript/Typed_arrays) 或{{jsxref("ArrayBuffer")}}形,一并进行编译和实例化。返回的 `Promise` 会携带已编译的 {{jsxref("WebAssembly.Module")}} 和它的第一个实例化对象 {{jsxref("WebAssembly.Instance")}}.
- 第二种重载使用已编译的 {{jsxref("WebAssembly.Module")}} , 返回的 `Promise` 携带一个 `Module`的实例化对象 `Instance`. 如果这个 `Module` 已经被编译了或者是从缓存中获取的 ( [retrieved from cache](/zh-CN/docs/WebAssembly/Caching_modules)), 那么这种重载方式是非常有用的。
-> **警告:** 此方法不是获取 (fetch) 和实例化 wasm 模块的最具效率方法。如果可能的话,你应该改用较新的{{jsxref("WebAssembly.instantiateStreaming()")}}方法,该方法直接从原始字节码中直接获取,编译和实例化模块,因此不需要转换为{{jsxref("ArrayBuffer")}}。
+> [!WARNING]
+> 此方法不是获取 (fetch) 和实例化 wasm 模块的最具效率方法。如果可能的话,你应该改用较新的{{jsxref("WebAssembly.instantiateStreaming()")}}方法,该方法直接从原始字节码中直接获取,编译和实例化模块,因此不需要转换为{{jsxref("ArrayBuffer")}}。
## 语法
@@ -63,7 +64,8 @@ Promise WebAssembly.instantiate(module, importObject);
## 示例
-> **备注:** 在大多数情况下,你可能需要使用 {{jsxref("WebAssembly.instantiateStreaming()")}},因为它比 `instantiate()` 更具效率。
+> [!NOTE]
+> 在大多数情况下,你可能需要使用 {{jsxref("WebAssembly.instantiateStreaming()")}},因为它比 `instantiate()` 更具效率。
### 第一种重载示例
@@ -89,7 +91,8 @@ fetch("simple.wasm")
.then((result) => result.instance.exports);
```
-> **备注:** 查看 GitHub([在线实例](https://mdn.github.io/webassembly-examples/js-api-examples/))的 [index.html](https://github.com/mdn/webassembly-examples/blob/master/js-api-examples/index.html) 中一个相似的例子,使用了我们的 [`fetchAndInstantiate()`](https://github.com/mdn/webassembly-examples/blob/master/wasm-utils.js#L1) 库函数
+> [!NOTE]
+> 查看 GitHub([在线实例](https://mdn.github.io/webassembly-examples/js-api-examples/))的 [index.html](https://github.com/mdn/webassembly-examples/blob/master/js-api-examples/index.html) 中一个相似的例子,使用了我们的 [`fetchAndInstantiate()`](https://github.com/mdn/webassembly-examples/blob/master/wasm-utils.js#L1) 库函数
### 第二种重载示例
diff --git a/files/zh-cn/webassembly/javascript_interface/instantiatestreaming_static/index.md b/files/zh-cn/webassembly/javascript_interface/instantiatestreaming_static/index.md
index 4afe43422c976f..f89eed87d07e7d 100644
--- a/files/zh-cn/webassembly/javascript_interface/instantiatestreaming_static/index.md
+++ b/files/zh-cn/webassembly/javascript_interface/instantiatestreaming_static/index.md
@@ -7,7 +7,8 @@ slug: WebAssembly/JavaScript_interface/instantiateStreaming_static
**`WebAssembly.instantiateStreaming()`** 函数直接从流式底层源编译并实例化 WebAssembly 模块。这是加载 Wasm 代码的最有效、最优化的方式。
-> **备注:** 具有严格的[内容安全策略(CSP)](/zh-CN/docs/Web/HTTP/CSP)的网页可能会阻止 WebAssembly 模块的编译和执行。请参阅 [script-src CSP](/zh-CN/docs/Web/HTTP/Headers/Content-Security-Policy/script-src) 以了解更多有关允许 WebAssembly 编译和执行的信息。
+> [!NOTE]
+> 具有严格的[内容安全策略(CSP)](/zh-CN/docs/Web/HTTP/CSP)的网页可能会阻止 WebAssembly 模块的编译和执行。请参阅 [script-src CSP](/zh-CN/docs/Web/HTTP/Headers/Content-Security-Policy/script-src) 以了解更多有关允许 WebAssembly 编译和执行的信息。
## 语法
@@ -49,7 +50,8 @@ WebAssembly.instantiateStreaming(fetch("simple.wasm"), importObject).then(
然后访问 `ResultObject` 的实例成员,并调用包含的导出函数。
-> **备注:** 为了使其工作,服务器应该返回一个 `application/wasm` MIME 类型的 `.wasm` 文件。
+> [!NOTE]
+> 为了使其工作,服务器应该返回一个 `application/wasm` MIME 类型的 `.wasm` 文件。
## 规范
diff --git a/files/zh-cn/webassembly/javascript_interface/memory/index.md b/files/zh-cn/webassembly/javascript_interface/memory/index.md
index b6729582ddc0f0..68d02537ac9323 100644
--- a/files/zh-cn/webassembly/javascript_interface/memory/index.md
+++ b/files/zh-cn/webassembly/javascript_interface/memory/index.md
@@ -26,7 +26,8 @@ var myMemory = new WebAssembly.Memory(memoryDescriptor);
- _maximum {{optional_inline}}_
- : 以 WebAssembly 页面为单位,可允许 WebAssembly 内存的 `最大值`。当存在此属性时,此参数用于提示引擎预先保留内存。但是,引擎可能会忽略或限制此预留请求。通常情况下大多数 WebAssembly 模块不需要设置 `最大值`。
-> **备注:** A WebAssembly 页面的大小为一个常量 65,536 字节,即 64KB。
+> [!NOTE]
+> A WebAssembly 页面的大小为一个常量 65,536 字节,即 64KB。
### 异常
diff --git a/files/zh-cn/webassembly/javascript_interface/table/index.md b/files/zh-cn/webassembly/javascript_interface/table/index.md
index 68aa65776c4f57..5e2eb5def30cc7 100644
--- a/files/zh-cn/webassembly/javascript_interface/table/index.md
+++ b/files/zh-cn/webassembly/javascript_interface/table/index.md
@@ -9,7 +9,8 @@ l10n:
**`WebAssembly.Table`** 是代表 WebAssembly Table 的 JavaScript 包装对象,具有类数组结构,存储了多个函数引用。在 JavaScript 或者 WebAssemble 中创建的 Table 对象可以同时被 JavaScript 或 WebAssembly 访问和更改。
-> **备注:** Table 对象目前只能存储函数引用,不过在将来可能会被扩展。
+> [!NOTE]
+> Table 对象目前只能存储函数引用,不过在将来可能会被扩展。
## 构造函数
diff --git a/files/zh-cn/webassembly/loading_and_running/index.md b/files/zh-cn/webassembly/loading_and_running/index.md
index e24158390d476b..a40d5fe7340444 100644
--- a/files/zh-cn/webassembly/loading_and_running/index.md
+++ b/files/zh-cn/webassembly/loading_and_running/index.md
@@ -55,9 +55,11 @@ fetch("module.wasm")
}
```
-> **备注:** 通常,我们只关心实例,但是,当我们想缓存模块,使用 [`postMessage()`](/zh-CN/docs/Web/API/MessagePort/postMessage) 与另外一个 worker 或 window 共享模块或者只是创建更多的实例的时候,拥有模块对象是很有用的。
+> [!NOTE]
+> 通常,我们只关心实例,但是,当我们想缓存模块,使用 [`postMessage()`](/zh-CN/docs/Web/API/MessagePort/postMessage) 与另外一个 worker 或 window 共享模块或者只是创建更多的实例的时候,拥有模块对象是很有用的。
-> **备注:** 这二种重载形式接受一个 [`WebAssembly.Module`](/zh-CN/docs/WebAssembly/JavaScript_interface/Module) 对象作为参数,并且返回一个直接包含一个实例对象作为其结果的 promise。参考[第二种重载示例](/zh-CN/docs/WebAssembly/JavaScript_interface/instantiate_static#第二种重载示例)。
+> [!NOTE]
+> 这二种重载形式接受一个 [`WebAssembly.Module`](/zh-CN/docs/WebAssembly/JavaScript_interface/Module) 对象作为参数,并且返回一个直接包含一个实例对象作为其结果的 promise。参考[第二种重载示例](/zh-CN/docs/WebAssembly/JavaScript_interface/instantiate_static#第二种重载示例)。
### 运行你的 WebAssembly 代码
@@ -79,7 +81,8 @@ WebAssembly.instantiateStreaming(fetch("myModule.wasm"), importObject).then(
);
```
-> **备注:** 关于如何从 WebAssembly 模块中导出的更多信息,请阅读[使用 WebAssembly JavaScript API](/zh-CN/docs/WebAssembly/Using_the_JavaScript_API) 和[理解 WebAssembly 文本格式](/zh-CN/docs/WebAssembly/Understanding_the_text_format)。
+> [!NOTE]
+> 关于如何从 WebAssembly 模块中导出的更多信息,请阅读[使用 WebAssembly JavaScript API](/zh-CN/docs/WebAssembly/Using_the_JavaScript_API) 和[理解 WebAssembly 文本格式](/zh-CN/docs/WebAssembly/Understanding_the_text_format)。
## 使用 XMLHttpRequest
@@ -106,4 +109,5 @@ request.onload = () => {
};
```
-> **备注:** 你可以在 [xhr-wasm.html](https://mdn.github.io/webassembly-examples/js-api-examples/xhr-wasm.html) 看到实际使用的示例。
+> [!NOTE]
+> 你可以在 [xhr-wasm.html](https://mdn.github.io/webassembly-examples/js-api-examples/xhr-wasm.html) 看到实际使用的示例。
diff --git a/files/zh-cn/webassembly/rust_to_wasm/index.md b/files/zh-cn/webassembly/rust_to_wasm/index.md
index 7bae275a58d50a..2a7feb75fdaf1d 100644
--- a/files/zh-cn/webassembly/rust_to_wasm/index.md
+++ b/files/zh-cn/webassembly/rust_to_wasm/index.md
@@ -26,7 +26,8 @@ Rust 和 WebAssembly 有两大主要用例:
前往 [Install Rust](https://www.rust-lang.org/install.html) 页面并跟随指示安装 Rust。这里会安装一个名为“rustup”的工具,这个工具能让你管理多个不同版本的 Rust。默认情况下,它会安装用于惯常 Rust 开发的 stable 版本 Rust Release。Rustup 会安装 Rust 的编译器 `rustc`、Rust 的包管理工具 `cargo`、Rust 的标准库 `rust-std` 以及一些有用的文档 `rust-docs`。
-> **备注:** 需要注意,在安装完成后,你需要把 cargo 的 `bin` 目录添加到你系统的 `PATH` 。一般来说它会自动添加,但需要你重启终端后才会生效。
+> [!NOTE]
+> 需要注意,在安装完成后,你需要把 cargo 的 `bin` 目录添加到你系统的 `PATH`。一般来说它会自动添加,但需要你重启终端后才会生效。
### wasm-pack
diff --git a/files/zh-cn/webassembly/text_format_to_wasm/index.md b/files/zh-cn/webassembly/text_format_to_wasm/index.md
index 660732c6476ce7..addde149a54b28 100644
--- a/files/zh-cn/webassembly/text_format_to_wasm/index.md
+++ b/files/zh-cn/webassembly/text_format_to_wasm/index.md
@@ -7,7 +7,8 @@ slug: WebAssembly/Text_format_to_Wasm
WebAssembly 有一个基于 S-表达式的文本表示形式,设计为在文本编辑器,浏览器开发人员工具等中暴露的一个中间形式。本文解释了它是如何工作的一些内容以及如何使用可用的工具把文本格式文件转换为.wasm 汇编格式文件。
-> **备注:** 文本格式文件通常被保存为.wat 扩展名;有时.wast 也被使用,它是说文件包含了额外的测试命令(断言等)并且它们不需要转换到.wasm 中。
+> [!NOTE]
+> 文本格式文件通常被保存为.wat 扩展名;有时.wast 也被使用,它是说文件包含了额外的测试命令(断言等)并且它们不需要转换到.wasm 中。
## 初识文本格式
@@ -40,7 +41,8 @@ WebAssembly 函数 exported_func 是被导出供我们的环境(比如,使
该命令会把 wasm 输出到一个叫做 simple.wasm 的文件,该文件包含了.wasm 汇编代码。
-> **备注:** 你可以使用 wasm2wat 工具把汇编代码转换为文本表示;例如,wasm2wat simple.wasm -o text.wat。
+> [!NOTE]
+> 你可以使用 wasm2wat 工具把汇编代码转换为文本表示;例如,wasm2wat simple.wasm -o text.wat。
## 查看汇编输出
diff --git a/files/zh-cn/webassembly/understanding_the_text_format/index.md b/files/zh-cn/webassembly/understanding_the_text_format/index.md
index caaf627a051f1d..653016548e8468 100644
--- a/files/zh-cn/webassembly/understanding_the_text_format/index.md
+++ b/files/zh-cn/webassembly/understanding_the_text_format/index.md
@@ -8,7 +8,8 @@ slug: WebAssembly/Understanding_the_text_format
为了能够让人类阅读和编辑 WebAssembly,wasm 二进制格式提供了相应的文本表示。这是一种用来在文本编辑器、浏览器开发者工具等工具中显示的中间形式。本文用基本语法的方式解释了这种文本表示是如何工作的,以及它是如何与它表示的底层字节码,及在 JavaScript 中表示 wasm 的封装对象关联起来的。
本质上,这种文本形式更类似于处理器的汇编指令。
-> **备注:** 如果你是一个 Web 开发者并且只是想在页面中加载 wasm 模块然后在你的代码中使用它(参考[使用 WebAssembly 的 JavaScript API](/zh-CN/docs/WebAssembly/Using_the_JavaScript_API)),那么,本文可能有点儿强人所难了。但是,如果你想编写 wasm 模块从而优化你的 JavaScript 的性能或者构建你自己的 WebAssembly 编译器,那么,本文是很有用的。
+> [!NOTE]
+> 如果你是一个 Web 开发者并且只是想在页面中加载 wasm 模块然后在你的代码中使用它(参考[使用 WebAssembly 的 JavaScript API](/zh-CN/docs/WebAssembly/Using_the_JavaScript_API)),那么,本文可能有点儿强人所难了。但是,如果你想编写 wasm 模块从而优化你的 JavaScript 的性能或者构建你自己的 WebAssembly 编译器,那么,本文是很有用的。
## S-表达式
@@ -106,7 +107,8 @@ WebAssembly 模块中的所有代码都是划分到函数里面。函数具有
这里,使用 `local.get $p1` 就可以代替 `local.get 0`,访问参数 i32 变量时,就可以通过 $p1 进行访问。
-> **备注:** 当文本转换为二进制后,二进制中只包含整数。
+> [!NOTE]
+> 当文本转换为二进制后,二进制中只包含整数。
## 栈式机器
@@ -191,7 +193,8 @@ function fetchAndInstantiate(url, importObject) {
}
```
-> **备注:** 你可以在 GitHub 上找到这个例子 [add.html](https://github.com/mdn/webassembly-examples/blob/master/understanding-text-format/add.html)([实时运行](https://mdn.github.io/webassembly-examples/understanding-text-format/add.html))。另外,参考 [WebAssembly.instantiate()](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/instantiate) 来获取关于实例化函数的更多细节以及 [wasm-utils.js](https://github.com/mdn/webassembly-examples/blob/master/wasm-utils.js) 来获取 fetchAndInstantiate() 的源代码。
+> [!NOTE]
+> 你可以在 GitHub 上找到这个例子 [add.html](https://github.com/mdn/webassembly-examples/blob/master/understanding-text-format/add.html)([实时运行](https://mdn.github.io/webassembly-examples/understanding-text-format/add.html))。另外,参考 [WebAssembly.instantiate()](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/instantiate) 来获取关于实例化函数的更多细节以及 [wasm-utils.js](https://github.com/mdn/webassembly-examples/blob/master/wasm-utils.js) 来获取 fetchAndInstantiate() 的源代码。
## 探索基本原则
@@ -211,7 +214,8 @@ function fetchAndInstantiate(url, importObject) {
i32.add))
```
-> **备注:** i32.const 只是定义一个 32 位整数并把它压入栈。你可以把 i32 替换为任何其他可用的类型,并把 const 值修改为你想要的任何值(这里,我们把这个值设置为 42)。
+> [!NOTE]
+> i32.const 只是定义一个 32 位整数并把它压入栈。你可以把 i32 替换为任何其他可用的类型,并把 const 值修改为你想要的任何值(这里,我们把这个值设置为 42)。
在这个例子中,你注意到一个 (export "getAnswerPlus1") 代码段,并且它声明在第二个函数的 func 语句之后——这声明我们想导出这个函数,以及定义导出的名字的简便方法。
@@ -229,7 +233,8 @@ fetchAndInstantiate("call.wasm").then(function (instance) {
});
```
-> **备注:** 你可以在 GitHub 上找到这个例子 [call.wasm](https://github.com/mdn/webassembly-examples/blob/master/understanding-text-format/call.html)(或[实时运行](https://mdn.github.io/webassembly-examples/understanding-text-format/call.html))。再提一次,查看 [wasm-utils.js](https://github.com/mdn/webassembly-examples/blob/master/wasm-utils.js) 来了解 fetchAndInstantiate() 的源代码。
+> [!NOTE]
+> 你可以在 GitHub 上找到这个例子 [call.wasm](https://github.com/mdn/webassembly-examples/blob/master/understanding-text-format/call.html)(或[实时运行](https://mdn.github.io/webassembly-examples/understanding-text-format/call.html))。再提一次,查看 [wasm-utils.js](https://github.com/mdn/webassembly-examples/blob/master/wasm-utils.js) 来了解 fetchAndInstantiate() 的源代码。
### 从 JavaScript 导入函数
@@ -267,7 +272,8 @@ fetchAndInstantiate("logger.wasm", importObject).then(function (instance) {
});
```
-> **备注:** 你可以在 GitHub 上找到这个例子 [logger.html](https://github.com/mdn/webassembly-examples/blob/master/understanding-text-format/logger.html)([实时运行](https://mdn.github.io/webassembly-examples/understanding-text-format/logger.html))。
+> [!NOTE]
+> 你可以在 GitHub 上找到这个例子 [logger.html](https://github.com/mdn/webassembly-examples/blob/master/understanding-text-format/logger.html)([实时运行](https://mdn.github.io/webassembly-examples/understanding-text-format/logger.html))。
### WebAssembly 内存
@@ -326,7 +332,8 @@ consoleLogString(offset, length) {
call $log))
```
-> **备注:** 注意上面的双分号语法,它允许在 WebAssembly 文件中添加注释。
+> [!NOTE]
+> 注意上面的双分号语法,它允许在 WebAssembly 文件中添加注释。
现在,我们可以从 JavaScript 中创建一个 1 页的内存(Memory)然后把它传递进去。这会在控制台输出"Hi"。
@@ -340,7 +347,8 @@ fetchAndInstantiate("logger2.wasm", importObject).then(function (instance) {
});
```
-> **备注:** 你可以在 GitHub 上找到完整源代码 [logger2.html](https://github.com/mdn/webassembly-examples/blob/master/understanding-text-format/logger2.html)([或者实时运行](https://mdn.github.io/webassembly-examples/understanding-text-format/logger2.html))。
+> [!NOTE]
+> 你可以在 GitHub 上找到完整源代码 [logger2.html](https://github.com/mdn/webassembly-examples/blob/master/understanding-text-format/logger2.html)([或者实时运行](https://mdn.github.io/webassembly-examples/understanding-text-format/logger2.html))。
### WebAssembly 表格
@@ -381,7 +389,8 @@ WebAssembly 可以增加一个 anyfunc 类型("any"的含义是该类型能够
- 元素段(elem section)能够将一个模块中的任意函数子集以任意顺序列入其中,并允许出现重复。列入其中的函数将会被表格引用并,且引用顺序是其出现的顺序。
- 元素段(elem section)中的 (i32.const 0) 值是一个偏移量——它需要在元素段开始的位置声明,其作用是表明函数引用是在表格中的什么索引位置开始存储的。这里我们指定的偏移量是 0,表格大小是 2(参考上面),因此,我们可以在索引 0 和 1 的位置填入两个引用。如果想在偏移量 1 的位置开始写入引用,那么,我们必须使用 (i32.const 1) 并且表格大小必须是 3.
-> **备注:** 未初始化的元素会被设定一个默认的调用即抛出(throw-on-call)值。
+> [!NOTE]
+> 未初始化的元素会被设定一个默认的调用即抛出(throw-on-call)值。
在 JavaScript 中,可以创建这样一个表格实例的等价的函数调用看起来如下所示:
@@ -460,9 +469,11 @@ fetchAndInstantiate("wasm-table.wasm").then(function (instance) {
});
```
-> **备注:** 你可以在 GitHub 上找到这个例子 [wasm-table.html](https://github.com/mdn/webassembly-examples/blob/master/understanding-text-format/wasm-table.html) ([实时查看](https://mdn.github.io/webassembly-examples/understanding-text-format/wasm-table.html))。
+> [!NOTE]
+> 你可以在 GitHub 上找到这个例子 [wasm-table.html](https://github.com/mdn/webassembly-examples/blob/master/understanding-text-format/wasm-table.html) ([实时查看](https://mdn.github.io/webassembly-examples/understanding-text-format/wasm-table.html))。
-> **备注:** 就像内存一样,表格也能够从 JavaScript 中创建 (参考 [WebAssembly.Table()](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Table)) 并且能够导入和导出到其他 wasm 模块。
+> [!NOTE]
+> 就像内存一样,表格也能够从 JavaScript 中创建 (参考 [WebAssembly.Table()](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Table)) 并且能够导入和导出到其他 wasm 模块。
### 改变表格和动态链接
@@ -511,7 +522,8 @@ fetchAndInstantiate("wasm-table.wasm").then(function (instance) {
4. 在这个函数的最后一部分,我们创建了常量值 0,然后调用表格中索引 0 处的函数,该函数正是我们之前在 shared0.wat 中的使用元素代码段(elem block)存储的 shared0func。
5. shared0func 在被调用之后会加载我们在 shared1.wat 中使用 i32.store 指令存储在内存中的 42。
-> **备注:** 上面的表达式会隐式地把这些值出栈,但是,你可以在使用指令的时候进行显式地声明。例如:
+> [!NOTE]
+> 上面的表达式会隐式地把这些值出栈,但是,你可以在使用指令的时候进行显式地声明。例如:
>
> ```wasm
> (i32.store (i32.const 0) (i32.const 42))
@@ -538,7 +550,8 @@ Promise.all([
每一个将被编译的模块都可以导入相同的内存和表格对象,这也就是共享相同的线性内存和表格的“地址空间”。
-> **备注:** 你可以在 GitHub 上找到这个例子 [shared-address-space.html](https://github.com/mdn/webassembly-examples/blob/master/understanding-text-format/shared-address-space.html)([或者实时运行](https://mdn.github.io/webassembly-examples/understanding-text-format/shared-address-space.html))。
+> [!NOTE]
+> 你可以在 GitHub 上找到这个例子 [shared-address-space.html](https://github.com/mdn/webassembly-examples/blob/master/understanding-text-format/shared-address-space.html)([或者实时运行](https://mdn.github.io/webassembly-examples/understanding-text-format/shared-address-space.html))。
## 总结
diff --git a/files/zh-cn/webassembly/using_the_javascript_api/index.md b/files/zh-cn/webassembly/using_the_javascript_api/index.md
index 7ef0e43a6ee3a9..c9a43167c70b4e 100644
--- a/files/zh-cn/webassembly/using_the_javascript_api/index.md
+++ b/files/zh-cn/webassembly/using_the_javascript_api/index.md
@@ -7,13 +7,15 @@ slug: WebAssembly/Using_the_JavaScript_API
如果你已经使用 Emscripten 等工具编译了另一种语言的模块,或者自己加载并运行代码,那么下一步是了解如何使用 WebAssembly JavaScript API 的其他功能。这篇文章告诉你你需要知道什么。
-> **备注:** 如果你不熟悉本文中提到到基础概念并且需要更多的解释,先阅读 [WebAssembly 概念](/zh-CN/docs/WebAssembly/Concepts) 然后再回来。
+> [!NOTE]
+> 如果你不熟悉本文中提到到基础概念并且需要更多的解释,先阅读 [WebAssembly 概念](/zh-CN/docs/WebAssembly/Concepts) 然后再回来。
## 一个简单的例子
让我们通过一步一步的例子来了解如何在 WebAssembly 中使用 Javascript API,和如何在网页中加载一个 wasm 模块。
-> **备注:** 你可以发现同样的代码在 [webassembly-examples](https://github.com/mdn/webassembly-examples) GitHub 仓库。
+> [!NOTE]
+> 你可以发现同样的代码在 [webassembly-examples](https://github.com/mdn/webassembly-examples) GitHub 仓库。
### 准备工作
@@ -55,11 +57,13 @@ fetch("simple.wasm")
});
```
-> **备注:** 我们已经非常详细地解释了这种语法如何工作通过[加载和运行 WebAssembly 代码](/zh-CN/docs/WebAssembly/Loading_and_running#使用Fetch)。如果不确定,请回到那里进行复习。
+> [!NOTE]
+> 我们已经非常详细地解释了这种语法如何工作通过[加载和运行 WebAssembly 代码](/zh-CN/docs/WebAssembly/Loading_and_running#使用Fetch)。如果不确定,请回到那里进行复习。
这样做的结果是执行我们导出的 WebAssembly 函数 exported_func,这样又调用了另一个我们导入的 JavaScript 函数 imported_func, 它将 WebAssembly 实例(42)中提供的值记录到控制台。如果你保存实例代码并且在支持 WebAssembly 的浏览器中运行,你将看到此操作。
-> **备注:** WebAssembly 在 Firefox 52+ 和 Chrome 57+/latest Opera 是默认支持的 (你也可以运行 wasm 代码 在 Firefox 47+ 通过将 _about:config_ 中的 `javascript.options.wasm` flag 设置为 enabling , 或者在 Chrome (51+) 以及 Opera (38+) 通过访问 _chrome://flags_ 并且将 _Experimental WebAssembly_ flag 设置为 enabling.)
+> [!NOTE]
+> WebAssembly 在 Firefox 52+ 和 Chrome 57+/latest Opera 是默认支持的 (你也可以运行 wasm 代码 在 Firefox 47+ 通过将 _about:config_ 中的 `javascript.options.wasm` flag 设置为 enabling , 或者在 Chrome (51+) 以及 Opera (38+) 通过访问 _chrome://flags_ 并且将 _Experimental WebAssembly_ flag 设置为 enabling.)
这是一个冗长的,令人费解的例子并且实现了很少的功能,但它确实有助于说明这是可能的——在 Web 应用中与 JavaScript 一起使用 WebAssembly 代码。正如我们一直说的,WebAssembly 并不旨在替代 JavaScript; 两者可以一起工作,借鉴对方的优势。
@@ -125,7 +129,8 @@ Note: 由于 {{domxref("ArrayBuffer")}} 的 byteLength 是不可变的,所以
1. 像前面那样在相同的目录下复制一份 memory.wasm。
- > **备注:** 你可以在这里 [memory.wat](https://github.com/mdn/webassembly-examples/blob/master/js-api-examples/memory.wat) 找到模块的文本表示形式。
+ > [!NOTE]
+ > 你可以在这里 [memory.wat](https://github.com/mdn/webassembly-examples/blob/master/js-api-examples/memory.wat) 找到模块的文本表示形式。
2. 回到你的示例文件 `memory.html`,像前面那样获取、编译和实例化你的 wasm 模块——在你的脚本代码底部加入下面的代码:
@@ -155,7 +160,8 @@ Note: 由于 {{domxref("ArrayBuffer")}} 的 byteLength 是不可变的,所以
- 它们允许 JavaScript 在模块编译之前或者同时获取和创建内存的初始内容。
- 它们允许一个单一的内存对象被多个模块实例导入,对于实现 WebAssembly 动态链接来说,这是一个关键的构建模块。
-> **备注:** 你可以在这里 [memory.html](https://github.com/mdn/webassembly-examples/blob/master/js-api-examples/memory.html)([或实时运行](https://mdn.github.io/webassembly-examples/js-api-examples/memory.html))找到我们的完整例子——这个版本使用了 [fetchAndInstantiate()](https://github.com/mdn/webassembly-examples/blob/master/wasm-utils.js) 函数。
+> [!NOTE]
+> 你可以在这里 [memory.html](https://github.com/mdn/webassembly-examples/blob/master/js-api-examples/memory.html)([或实时运行](https://mdn.github.io/webassembly-examples/js-api-examples/memory.html))找到我们的完整例子——这个版本使用了 [fetchAndInstantiate()](https://github.com/mdn/webassembly-examples/blob/master/wasm-utils.js) 函数。
## 表格
@@ -175,7 +181,8 @@ WebAssembly 表格是一个可变大小的带类型的引用数组,其中的
1. 在一个新的目录中复制一份 table.wasm。
- > **备注:** 你可以在 [table.wat](https://github.com/mdn/webassembly-examples/blob/master/js-api-examples/table.wat) 中查看模块的文本表示。
+ > [!NOTE]
+ > 你可以在 [table.wat](https://github.com/mdn/webassembly-examples/blob/master/js-api-examples/table.wat) 中查看模块的文本表示。
2. 创建一份 [HTML 模板](https://github.com/mdn/webassembly-examples/blob/master/template/template.html)的新副本并将其命名为`table.html`.
3. 如前所示,获取、编译并且实例化你的 wasm 模块——将下面的代码放入到 HTML body 底部的 [\` 一行里, `defer` 属性指明在页面加载完成之前,{{htmlelement("script")}}元素的内容不会执行。
+> [!NOTE]
+> 在完成版本的源代码中, `` 一行里, `defer` 属性指明在页面加载完成之前,{{htmlelement("script")}}元素的内容不会执行。
## 存储复杂数据 — IndexedDB
@@ -298,7 +302,8 @@ web storage 的一个关键特性是,数据在不同页面加载时都存在
要在 IndexedDB 中处理此问题,你需要创建一个请求对象(可以随意命名 - 命名为`request`,可以表明它的用途)。然后,在请求完成或者失败时,使用事件处理程序来运行代码,你将在下面看到这些代码。
- > **备注:** 版本号很重要。如果要升级数据库(例如:更改表结构),则必须使用增加的版本号或者`onupgradeneeded`处理程序内指定的不同模式(请参阅下文)等再次运行代码。在这个简单教程中,我们不讨论数据库升级。
+ > [!NOTE]
+ > 版本号很重要。如果要升级数据库(例如:更改表结构),则必须使用增加的版本号或者`onupgradeneeded`处理程序内指定的不同模式(请参阅下文)等再次运行代码。在这个简单教程中,我们不讨论数据库升级。
1. 在之前添加的事件处理程序下方添加以下代码 - 在`window.onload`处理程序内:
@@ -671,7 +676,8 @@ function deleteItem(e) {
Cache API 是另一种客户端存储机制,略有不同 - 它旨在保存 HTTP 响应,因此与服务工作者一起工作得非常好。
-> **备注:** 现在大多数现代浏览器都支持服务工作者和缓存。在撰写本文时,Safari 仍在忙着实施它,但它应该很快就会存在。
+> [!NOTE]
+> 现在大多数现代浏览器都支持服务工作者和缓存。在撰写本文时,Safari 仍在忙着实施它,但它应该很快就会存在。
### 一个 service worker 例子
diff --git a/files/zh-cn/learn/javascript/client-side_web_apis/drawing_graphics/index.md b/files/zh-cn/learn/javascript/client-side_web_apis/drawing_graphics/index.md
index 78c29ed629528e..0ad9d8cdf4a4c5 100644
--- a/files/zh-cn/learn/javascript/client-side_web_apis/drawing_graphics/index.md
+++ b/files/zh-cn/learn/javascript/client-side_web_apis/drawing_graphics/index.md
@@ -50,7 +50,8 @@ slug: Learn/JavaScript/Client-side_web_APIs/Drawing_graphics
由于原生的 WebGL 代码非常复杂,本文主要针对 2D 画布。然而,你也可以通过 [WebGL 介绍页面](/zh-CN/docs/Web/API/WebGL_API) 找到 WebGL 原生代码的教程,来学习如何更容易地使用 WebGL 库来创建一个 3D 场景。
-> **备注:** 画布的基本功能有良好的跨浏览器支持。但存在例外:IE 8 及以下不支持 2D 画布,IE 11 及以下不支持 WebGL。
+> [!NOTE]
+> 画布的基本功能有良好的跨浏览器支持。但存在例外:IE 8 及以下不支持 2D 画布,IE 11 及以下不支持 WebGL。
## 主动学习:开始使用 \
@@ -112,7 +113,8 @@ slug: Learn/JavaScript/Client-side_web_APIs/Drawing_graphics
此时滚动条就消失了。
-> **备注:** 如上文所讲,一般情况下图片的尺寸可以通过 HTML 属性或 DOM 属性来设定。你也可以使用 CSS,但问题是画布在渲染完毕后其尺寸就是固定的了,如果试图调整,就会与其他图象一样(其实渲染好的画布就是一副图片),所显示的内容将变得像素化或扭曲变形。
+> [!NOTE]
+> 如上文所讲,一般情况下图片的尺寸可以通过 HTML 属性或 DOM 属性来设定。你也可以使用 CSS,但问题是画布在渲染完毕后其尺寸就是固定的了,如果试图调整,就会与其他图象一样(其实渲染好的画布就是一副图片),所显示的内容将变得像素化或扭曲变形。
### 获取画布上下文(canvas context)并完成设置
@@ -124,7 +126,8 @@ slug: Learn/JavaScript/Client-side_web_APIs/Drawing_graphics
var ctx = canvas.getContext("2d");
```
-> **备注:** 可选上下文还包括 WebGL(`webgl`)、WebGL 2(`webgl2`)等等,但本文暂不涉及。
+> [!NOTE]
+> 可选上下文还包括 WebGL(`webgl`)、WebGL 2(`webgl2`)等等,但本文暂不涉及。
好啦,现已万事具备!`ctx` 变量包含一个 {{domxref("CanvasRenderingContext2D")}} 对象,画布上所有绘画操作都会涉及到这个对象。
@@ -200,7 +203,8 @@ ctx.fillRect(0, 0, width, height);
{{EmbedGHLiveSample("learning-area/javascript/apis/drawing-graphics/getting-started/2_canvas_rectangles.html", '100%', 250)}}
-> **备注:** 完整代码请访问 GitHub: [2_canvas_rectangles.html](https://github.com/mdn/learning-area/blob/main/javascript/apis/drawing-graphics/getting-started/2_canvas_rectangles.html)。
+> [!NOTE]
+> 完整代码请访问 GitHub: [2_canvas_rectangles.html](https://github.com/mdn/learning-area/blob/main/javascript/apis/drawing-graphics/getting-started/2_canvas_rectangles.html)。
### 绘制路径
@@ -289,7 +293,8 @@ ctx.fill();
`arc()` 函数有六个参数。前两个指定圆心的位置坐标,第三个是圆的半径,第四、五个是绘制弧的起、止角度(给定 0° 和 360° 便能绘制一个完整的圆),第六个是绘制方向(`false` 是顺时针,`true` 是逆时针)。
- > **备注:** 0° 设定为水平向右。
+ > [!NOTE]
+ > 0° 设定为水平向右。
2. 我们再来画一条弧:
@@ -310,9 +315,11 @@ ctx.fill();
{{EmbedGHLiveSample("learning-area/javascript/apis/drawing-graphics/getting-started/3_canvas_paths.html", '100%', 200)}}
-> **备注:** 完整代码可到 GitHub 下载:[3_canvas_paths.html](https://github.com/mdn/learning-area/blob/main/javascript/apis/drawing-graphics/getting-started/3_canvas_paths.html)。
+> [!NOTE]
+> 完整代码可到 GitHub 下载:[3_canvas_paths.html](https://github.com/mdn/learning-area/blob/main/javascript/apis/drawing-graphics/getting-started/3_canvas_paths.html)。
-> **备注:** 请访问我们的 [用画布绘图](/zh-CN/docs/Web/API/Canvas_API/Tutorial/Drawing_shapes) 入门课程来学习更多高级的路径绘制功能,比如贝叶斯曲线。
+> [!NOTE]
+> 请访问我们的 [用画布绘图](/zh-CN/docs/Web/API/Canvas_API/Tutorial/Drawing_shapes) 入门课程来学习更多高级的路径绘制功能,比如贝叶斯曲线。
### 文本
@@ -344,7 +351,8 @@ ctx.fillText("Canvas text", 50, 150);
{{EmbedGHLiveSample("learning-area/javascript/apis/drawing-graphics/getting-started/4_canvas_text.html", '100%', 180)}}
-> **备注:** 完整代码可到 GitHub 下载:[4_canvas_text.html](https://github.com/mdn/learning-area/blob/main/javascript/apis/drawing-graphics/getting-started/4_canvas_text.html).
+> [!NOTE]
+> 完整代码可到 GitHub 下载:[4_canvas_text.html](https://github.com/mdn/learning-area/blob/main/javascript/apis/drawing-graphics/getting-started/4_canvas_text.html).
可以自己尝试一下。访问 [绘制文本](/zh-CN/docs/Web/API/Canvas_API/Tutorial/Drawing_text) 获得关于画布文本选项的更多信息。
@@ -391,7 +399,8 @@ ctx.fillText("Canvas text", 50, 150);
{{EmbedGHLiveSample("learning-area/javascript/apis/drawing-graphics/getting-started/5_canvas_images.html", '100%', 260)}}
-> **备注:** 完整代码可到 GitHub 下载:[5_canvas_images.html](https://github.com/mdn/learning-area/blob/main/javascript/apis/drawing-graphics/getting-started/5_canvas_images.html).
+> [!NOTE]
+> 完整代码可到 GitHub 下载:[5_canvas_images.html](https://github.com/mdn/learning-area/blob/main/javascript/apis/drawing-graphics/getting-started/5_canvas_images.html).
## 循环和动画
@@ -470,7 +479,8 @@ ctx.fillText("Canvas text", 50, 150);
- 修改 `length` 和 `moveOffset` 的值。
- 我们引入了 `rand()` 函数但是没有使用,你可以试着用它引入一些随机数。
-> **备注:** 完整代码可到 GitHub 下载:[6_canvas_for_loop.html](https://github.com/mdn/learning-area/blob/main/javascript/apis/drawing-graphics/loops_animation/6_canvas_for_loop.html).
+> [!NOTE]
+> 完整代码可到 GitHub 下载:[6_canvas_for_loop.html](https://github.com/mdn/learning-area/blob/main/javascript/apis/drawing-graphics/loops_animation/6_canvas_for_loop.html).
### 动画
@@ -622,7 +632,8 @@ loop();
{{EmbedGHLiveSample("learning-area/javascript/apis/drawing-graphics/loops_animation/7_canvas_walking_animation.html", '100%', 260)}}
-> **备注:** 完整代码可到 GitHub 下载:[7_canvas_walking_animation.html](https://github.com/mdn/learning-area/blob/main/javascript/apis/drawing-graphics/loops_animation/7_canvas_walking_animation.html).
+> [!NOTE]
+> 完整代码可到 GitHub 下载:[7_canvas_walking_animation.html](https://github.com/mdn/learning-area/blob/main/javascript/apis/drawing-graphics/loops_animation/7_canvas_walking_animation.html).
### 简单的绘图应用
@@ -821,7 +832,8 @@ WebGL 基于 [OpenGL](/zh-CN/docs/Glossary/OpenGL) 图形编程语言实现,
你可以 [到 Github 下载最终代码](https://github.com/mdn/learning-area/tree/main/javascript/apis/drawing-graphics/threejs-cube)。
-> **备注:** 在我们的 GitHub repo 还有另一个趣味 3D 魔方示例——[Three.js Video Cube](https://github.com/mdn/learning-area/tree/main/javascript/apis/drawing-graphics/threejs-video-cube)(在线查看)。其中通过 {{domxref("MediaDevices.getUserMedia", "getUserMedia()")}} 来从电脑摄像头获取一段视频,将其投影到魔方上作为纹理。
+> [!NOTE]
+> 在我们的 GitHub repo 还有另一个趣味 3D 魔方示例——[Three.js Video Cube](https://github.com/mdn/learning-area/tree/main/javascript/apis/drawing-graphics/threejs-video-cube)(在线查看)。其中通过 {{domxref("MediaDevices.getUserMedia", "getUserMedia()")}} 来从电脑摄像头获取一段视频,将其投影到魔方上作为纹理。
## 小结
diff --git a/files/zh-cn/learn/javascript/client-side_web_apis/fetching_data/index.md b/files/zh-cn/learn/javascript/client-side_web_apis/fetching_data/index.md
index b74390951896f1..cd4e01e36709c1 100644
--- a/files/zh-cn/learn/javascript/client-side_web_apis/fetching_data/index.md
+++ b/files/zh-cn/learn/javascript/client-side_web_apis/fetching_data/index.md
@@ -55,7 +55,8 @@ l10n:
- 页面更新更加迅速,你不必等待页面刷新,这意味这网站的体验更加流畅、响应更加迅速。
- 每次更新时下载的数据更少,这意味着浪费的带宽更少。这在使用宽带连接的台式机上可能不是什么问题,但在移动设备或没有高速互联网连接的国家/地区则是一个主要问题。
-> **备注:** 在早期,这种通用技术被称为[异步](/zh-CN/docs/Glossary/Asynchronous)的 JavaScript 与 XML([Ajax](/zh-CN/docs/Glossary/AJAX))。但现在通常不是这种情况,相反你更有可能请求 JSON,不过由于结果依然相同,我们通常依旧使用术语“Ajax”来描述该技术。
+> [!NOTE]
+> 在早期,这种通用技术被称为[异步](/zh-CN/docs/Glossary/Asynchronous)的 JavaScript 与 XML([Ajax](/zh-CN/docs/Glossary/AJAX))。但现在通常不是这种情况,相反你更有可能请求 JSON,不过由于结果依然相同,我们通常依旧使用术语“Ajax”来描述该技术。
为了进一步加快速度,某些网站还会在首次请求时将资源和数据存储在用户的计算机上,这意味这在后续的访问中,会使用这些内容的本地版本,而不是在每次重新加载页面时都下载新的副本。内容仅在更新后才会从服务器重新加载。
diff --git a/files/zh-cn/learn/javascript/client-side_web_apis/index.md b/files/zh-cn/learn/javascript/client-side_web_apis/index.md
index 6e2e830ceb5068..4803930b6d6cee 100644
--- a/files/zh-cn/learn/javascript/client-side_web_apis/index.md
+++ b/files/zh-cn/learn/javascript/client-side_web_apis/index.md
@@ -15,7 +15,8 @@ l10n:
了解 [HTML](/zh-CN/docs/Learn/HTML) 和 [CSS](/zh-CN/docs/Learn/CSS) 的基本知识,也会对理解这个单元的内容大有裨益。
-> **备注:** 如果你正在使用一台无法创建你自己的文件的电脑、平板或其他设备,你可以尝试使用一些在线网页编辑器如 [JSBin](https://jsbin.com/) 或者 [Glitch](https://glitch.com/) 来尝试编辑一些代码示例。
+> [!NOTE]
+> 如果你正在使用一台无法创建你自己的文件的电脑、平板或其他设备,你可以尝试使用一些在线网页编辑器如 [JSBin](https://jsbin.com/) 或者 [Glitch](https://glitch.com/) 来尝试编辑一些代码示例。
## 指南
diff --git a/files/zh-cn/learn/javascript/client-side_web_apis/introduction/index.md b/files/zh-cn/learn/javascript/client-side_web_apis/introduction/index.md
index 6d4036e3959adb..5fc0208b133f48 100644
--- a/files/zh-cn/learn/javascript/client-side_web_apis/introduction/index.md
+++ b/files/zh-cn/learn/javascript/client-side_web_apis/introduction/index.md
@@ -42,7 +42,8 @@ _图片来自:[过载的插头接口](https://www.flickr.com/photos/easy-pics/
同样,比如说,编程来显示一些 3D 图形,使用以更高级语言编写的 API(例如 JavaScript 或 Python)将会比直接编写直接控制计算机的 GPU 或其他图形功能的低级代码(比如 C 或 C++)来执行操作要容易得多。
-> **备注:** 详细说明请见 [API 术语条目](/zh-CN/docs/Glossary/API)。
+> [!NOTE]
+> 详细说明请见 [API 术语条目](/zh-CN/docs/Glossary/API)。
### 客户端 JavaScript 中的 API
@@ -100,7 +101,8 @@ _图片来自:[过载的插头接口](https://www.flickr.com/photos/easy-pics/
API 使用一个或多个 [JavaScript 对象](/zh-CN/docs/Learn/JavaScript/Objects)在你的代码中进行交互,这些对象用作 API 使用的数据(包含在对象属性中)的容器以及 API 提供的功能(包含在对象方法中)。
-> **备注:** 如果你不熟悉对象如何工作,则应在继续之前学习 [JavaScript 对象](/zh-CN/docs/Learn/JavaScript/Objects)模块。
+> [!NOTE]
+> 如果你不熟悉对象如何工作,则应在继续之前学习 [JavaScript 对象](/zh-CN/docs/Learn/JavaScript/Objects)模块。
让我们回到 Web 音频 API 的例子——这是一个相当复杂的 API,它由多个对象组成。最重要的包括:
@@ -169,7 +171,8 @@ audioElement.addEventListener("ended", () => {
});
```
-> **备注:** 有些人可能会注意到,用于播放和暂停音轨的 `play()` 和 `pause()` 方法并不属于 Web 音频 API;它们属于 {{domxref("HTMLMediaElement")}} API,这是一个不同但紧密相关的 API。
+> [!NOTE]
+> 有些人可能会注意到,用于播放和暂停音轨的 `play()` 和 `pause()` 方法并不属于 Web 音频 API;它们属于 {{domxref("HTMLMediaElement")}} API,这是一个不同但紧密相关的 API。
接下来,我们使用 {{domxref("BaseAudioContext/createGain", "AudioContext.createGain()")}} 方法创建一个 {{domxref("GainNode")}} 对象,可以用于调整通过它的音频的音量,并创建另一个事件处理器,当滑块值改变时改变音频图的增益(音量)值:
@@ -221,7 +224,8 @@ Ball.prototype.draw = function () {
};
```
-> **备注:** 你可以在我们的[弹跳球演示](https://github.com/mdn/learning-area/blob/main/javascript/apis/introduction/bouncing-balls.html)中看到此代码(也可以[在线运行](https://mdn.github.io/learning-area/javascript/apis/introduction/bouncing-balls.html))。
+> [!NOTE]
+> 你可以在我们的[弹跳球演示](https://github.com/mdn/learning-area/blob/main/javascript/apis/introduction/bouncing-balls.html)中看到此代码(也可以[在线运行](https://mdn.github.io/learning-area/javascript/apis/introduction/bouncing-balls.html))。
### 它们使用事件来处理状态的变化
@@ -269,7 +273,8 @@ Web API 特性受到与 JavaScript 和其他 Web 技术(例如[同源策略](/
Web 音频和 {{domxref("HTMLMediaElement")}} API 受制于一种名为[自动播放策略](/zh-CN/docs/Web/API/Web_Audio_API/Best_practices#自动播放策略)的安全机制。这基本上意味着你不能在页面加载时自动播放音频:你必须允许用户通过按钮等控件启动音频播放。这样做的原因是,自动播放音频通常非常恼人,我们实在不应该让用户忍受它。
-> **备注:** 根据浏览器的严格程度,这种安全机制甚至可能会阻止示例在本地运行,也就是说,如果你在浏览器中加载本地示例文件,而不是从 Web 服务器上运行它的话。在撰写本文时,我们的 Web 音频 API 示例在 Google Chrome 浏览器上无法本地运行,必须上传到 GitHub 才能运行。
+> [!NOTE]
+> 根据浏览器的严格程度,这种安全机制甚至可能会阻止示例在本地运行,也就是说,如果你在浏览器中加载本地示例文件,而不是从 Web 服务器上运行它的话。在撰写本文时,我们的 Web 音频 API 示例在 Google Chrome 浏览器上无法本地运行,必须上传到 GitHub 才能运行。
## 总结
diff --git a/files/zh-cn/learn/javascript/client-side_web_apis/manipulating_documents/index.md b/files/zh-cn/learn/javascript/client-side_web_apis/manipulating_documents/index.md
index 7442ff9acf4b45..ff77d6ca6298c2 100644
--- a/files/zh-cn/learn/javascript/client-side_web_apis/manipulating_documents/index.md
+++ b/files/zh-cn/learn/javascript/client-side_web_apis/manipulating_documents/index.md
@@ -69,7 +69,8 @@ Web 浏览器是非常复杂的软件,有许多活动部件,其中许多部
![文档对象模型的树状结构表示:顶部节点是 doctype 和 HTML 元素。HTML 的子节点包括 head 和 body。每个子元素都是一个分支。所有的文本,甚至是空白处,也都被显示出来](dom-screenshot.png)
-> **备注:** 这个 DOM 树状图是用 Ian Hickson 的[在线 DOM 查看器](https://software.hixie.ch/utilities/js/live-dom-viewer/)生成的。
+> [!NOTE]
+> 这个 DOM 树状图是用 Ian Hickson 的[在线 DOM 查看器](https://software.hixie.ch/utilities/js/live-dom-viewer/)生成的。
树上的每个条目都被称为**节点**。你可以在上图中看到,一些节点代表元素(标识为 `HTML`、`HEAD`、`META` 等),另一些代表文本(标识为 `#text`)。还有[其他类型的节点](/zh-CN/docs/Web/API/Node/nodeType),但这些是你会遇到的主要类型。
@@ -215,7 +216,8 @@ linkPara.parentNode.removeChild(linkPara);
```
-> **备注:** 请注意,CSS 样式的 JavaScript 属性版本是用{{Glossary("camel_case", "小驼峰命名法")}}书写的,而 CSS 版本采用连字符({{Glossary("kebab_case", "烤串命名法")}})(例如,`backgroundColor` 对 `background-color`)。确保你不要把这些混为一谈,否则将无法工作。
+> [!NOTE]
+> 请注意,CSS 样式的 JavaScript 属性版本是用{{Glossary("camel_case", "小驼峰命名法")}}书写的,而 CSS 版本采用连字符({{Glossary("kebab_case", "烤串命名法")}})(例如,`backgroundColor` 对 `background-color`)。确保你不要把这些混为一谈,否则将无法工作。
还有一种在你的文档上动态操作样式的常见方法,我们现在就来看看。
@@ -248,7 +250,8 @@ linkPara.parentNode.removeChild(linkPara);
在接下来的几节中我们将看看 DOM API 一些更实际的用途。
-> **备注:** 你可以在 GitHub 上找到我们的 [dom-example.html 的完成版](https://github.com/mdn/learning-area/blob/main/javascript/apis/document-manipulation/dom-example-manipulated.html)演示([也可以看看它的在线运行版本](https://mdn.github.io/learning-area/javascript/apis/document-manipulation/dom-example-manipulated.html))。
+> [!NOTE]
+> 你可以在 GitHub 上找到我们的 [dom-example.html 的完成版](https://github.com/mdn/learning-area/blob/main/javascript/apis/document-manipulation/dom-example-manipulated.html)演示([也可以看看它的在线运行版本](https://mdn.github.io/learning-area/javascript/apis/document-manipulation/dom-example-manipulated.html))。
## 动手练习:一个动态的购物单
@@ -276,7 +279,8 @@ linkPara.parentNode.removeChild(linkPara);
10. 为删除按钮绑定事件处理程序。当点击按钮时,删除它所在的整个列表元素(`... `)。
11. 最后,使用 [`focus()`](/zh-CN/docs/Web/API/HTMLElement/focus) 方法聚焦输入框准备输入下一个购物项。
-> **备注:** 如果你卡住了,请查看[完成的购物清单](https://github.com/mdn/learning-area/blob/main/javascript/apis/document-manipulation/shopping-list-finished.html)([查看其在线版本](https://mdn.github.io/learning-area/javascript/apis/document-manipulation/shopping-list-finished.html))。
+> [!NOTE]
+> 如果你卡住了,请查看[完成的购物清单](https://github.com/mdn/learning-area/blob/main/javascript/apis/document-manipulation/shopping-list-finished.html)([查看其在线版本](https://mdn.github.io/learning-area/javascript/apis/document-manipulation/shopping-list-finished.html))。
## 总结
diff --git a/files/zh-cn/learn/javascript/client-side_web_apis/third_party_apis/index.md b/files/zh-cn/learn/javascript/client-side_web_apis/third_party_apis/index.md
index 2662e1403b4349..ec7ecdff7c4bf2 100644
--- a/files/zh-cn/learn/javascript/client-side_web_apis/third_party_apis/index.md
+++ b/files/zh-cn/learn/javascript/client-side_web_apis/third_party_apis/index.md
@@ -37,7 +37,8 @@ slug: Learn/JavaScript/Client-side_web_APIs/Third_party_APIs
让我们再来瞧一眼这个地图的例子 (see the [source code on GitHub](https://github.com/mdn/learning-area/blob/main/javascript/apis/introduction/maps-example.html); [see it live also](https://mdn.github.io/learning-area/javascript/apis/introduction/maps-example.html)), 从这里可以知道第三方 API 和浏览器 API 的区别是怎么样的。
-> **备注:** 你可能想要一次获得所有的代码示例,在这种情况下,你可以搜索 repo 来获取每个部分中需要的示例文件。
+> [!NOTE]
+> 你可能想要一次获得所有的代码示例,在这种情况下,你可以搜索 repo 来获取每个部分中需要的示例文件。
### 它们植根于第三方服务器
@@ -76,7 +77,8 @@ var map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
以上就是用 Google Maps API 建立一个简单地图所需要的所有信息。所有复杂的工作都全由你所连接的第三方服务器处理,包括展示正确地理位置的地图块,等等。
-> **备注:** 一些 api 处理对其功能的访问略有不同,相反,它们要求开发人员向特定的 URL 模式发出 HTTP 请求 (参见从服务器获取数据),以检索特定的数据。这些被称为 RESTful api,稍后我们将在文章中展示这个示例。
+> [!NOTE]
+> 一些 api 处理对其功能的访问略有不同,相反,它们要求开发人员向特定的 URL 模式发出 HTTP 请求 (参见从服务器获取数据),以检索特定的数据。这些被称为 RESTful api,稍后我们将在文章中展示这个示例。
### 权限的不同处理方式
@@ -109,7 +111,8 @@ URL 末尾提供的 URL 参数是一个开发人员密钥—应用程序的开
6. 单击创建凭据,然后选择 API 密钥。
7. 复制你的 API 密钥并将示例中的第一个{{htmlelement("script")}}元素中的现有密钥替换为你自己的密钥。(位于`?key=`和属性结束引号标记 (`"`) 之间的位置。)
- > **备注:** 获取 Google 相关 API 密钥可能会有一点困难——Google Cloud Platform API Manager 有许多不同的屏幕,并且工作流程可能因你是否设置账户而变得细微的不同。如果你在执行此步骤时遇到了困难,我们将很乐意为你提供帮助——[联系我们](/zh-CN/docs/Learn#Contact_us)。
+ > [!NOTE]
+ > 获取 Google 相关 API 密钥可能会有一点困难——Google Cloud Platform API Manager 有许多不同的屏幕,并且工作流程可能因你是否设置账户而变得细微的不同。如果你在执行此步骤时遇到了困难,我们将很乐意为你提供帮助——[联系我们](/zh-CN/docs/Learn#Contact_us)。
3. 打开你的 Google Maps 起始文件,找到`INSERT-YOUR-API-KEY-HERE`字符串,然后将其替换为你从 Google Cloud Platform API Manager dashboard 获取的实际 API 密钥。
@@ -148,9 +151,11 @@ URL 末尾提供的 URL 参数是一个开发人员密钥—应用程序的开
这里我们用`iconBase` 加上图标的文件名,从而创建完整 URL 的方式阐明了 icon 属性。现在尝试重新加载你的例子,你会看到你的地图上显示了一个定制的标记!
-> **备注:** 访问 [Customizing a Google Map: Custom Markers](https://developers.google.com/maps/documentation/javascript/custom-markers) 以查看更多信息。
+> [!NOTE]
+> 访问 [Customizing a Google Map: Custom Markers](https://developers.google.com/maps/documentation/javascript/custom-markers) 以查看更多信息。
-> **备注:** 访问 [Map marker or Icon names](https://fusiontables.google.com/DataSource?dsrcid=308519#map:id=3) 以找出还有哪些可以的图标,并查看它们的引用名称是什么。它们的文件名应当是当你点击它们时显示出的图标名,最后带有".png"。
+> [!NOTE]
+> 访问 [Map marker or Icon names](https://fusiontables.google.com/DataSource?dsrcid=308519#map:id=3) 以找出还有哪些可以的图标,并查看它们的引用名称是什么。它们的文件名应当是当你点击它们时显示出的图标名,最后带有".png"。
### 单击标记时显示弹出窗口
@@ -287,9 +292,11 @@ https://api.nytimes.com/svc/search/v2/articlesearch.json?api-key=4f3c267e125943d
&begin_date=20170301&end_date=20170312
```
-> **备注:** 更多 URL 参数的说明参考 [NYTimes developer docs](https://developer.nytimes.com/).
+> [!NOTE]
+> 更多 URL 参数的说明参考 [NYTimes developer docs](https://developer.nytimes.com/).
-> **备注:** 示例包含了基本的表单数据验证操作 — 表项提交之前必须有内容 (用 `required` 属性实现),此外,日期字段有确定的 `pattern` 属性,它们的值必须由 8 个数字组成 (`pattern="[0-9]{8}"`),否则不能提交。更多细节参考 [Form data validation](/zh-CN/docs/Learn/HTML/Forms/Form_validation)
+> [!NOTE]
+> 示例包含了基本的表单数据验证操作 — 表项提交之前必须有内容 (用 `required` 属性实现),此外,日期字段有确定的 `pattern` 属性,它们的值必须由 8 个数字组成 (`pattern="[0-9]{8}"`),否则不能提交。更多细节参考 [Form data validation](/zh-CN/docs/Learn/HTML/Forms/Form_validation)
### 从 api 请求数据
@@ -421,7 +428,8 @@ function displayResults(json) {
第二个函数基本上执行相反的操作,不过有个额外的步骤是检测 `pageNumber` 在 -1 之前是否已经是 0 — 如果 fetch 请求的 `page` URL 参数是负数,会导致错误。如果 `pageNumber` 已经是 0,则直接执行 [`return`](/zh-CN/docs/Web/JavaScript/Reference/Statements/return) 退出函数,避免多余的计算。 (如果当前页面已经是首页,就不需要重新加载)。
-> **备注:** 完整代码参考 [finished nytimes API example code on GitHub](https://github.com/mdn/learning-area/blob/main/javascript/apis/third-party-apis/nytimes/index.html) (实例参考 [see it running live here](https://mdn.github.io/learning-area/javascript/apis/third-party-apis/nytimes/)).
+> [!NOTE]
+> 完整代码参考 [finished nytimes API example code on GitHub](https://github.com/mdn/learning-area/blob/main/javascript/apis/third-party-apis/nytimes/index.html) (实例参考 [see it running live here](https://mdn.github.io/learning-area/javascript/apis/third-party-apis/nytimes/)).
## YouTube 示例
diff --git a/files/zh-cn/learn/javascript/first_steps/a_first_splash/index.md b/files/zh-cn/learn/javascript/first_steps/a_first_splash/index.md
index f04b3c9d6ef940..9947c3b19c0f93 100644
--- a/files/zh-cn/learn/javascript/first_steps/a_first_splash/index.md
+++ b/files/zh-cn/learn/javascript/first_steps/a_first_splash/index.md
@@ -24,7 +24,8 @@ slug: Learn/JavaScript/First_steps/A_first_splash
我们并不要求你立刻完整理解所有代码:你不需要借此学会 JavaScript,甚至不需要理解我们要求你编写的全部代码。当前只是概括地介绍一些抽象的概念,让你了解 JavaScript 的特性是如何协同工作的,以及获得编写 JavaScript 的一些感受。所有具体特性将在后续文章中详细介绍,如果你没有很快地全部理解它们,请不要担心!
-> **备注:** 可以看到,JavaScript 中许多代码特性和其他编程语言是一致的(函数、循环,等等)。尽管代码语法不尽相同,但概念基本类似。
+> [!NOTE]
+> 可以看到,JavaScript 中许多代码特性和其他编程语言是一致的(函数、循环,等等)。尽管代码语法不尽相同,但概念基本类似。
## 像程序员一样思考
@@ -136,7 +137,8 @@ let resetButton;
- 倒数第二个变量存储一个计数器并初始化为 1(用于跟踪玩家猜测的次数),最后一个变量存储对重置按钮的引用,这个按钮尚不存在(但稍后就有了)。
-> **备注:** 稍后将讲解更多关于变量和常量的信息。[参见下一篇文章](/zh-CN/docs/Learn/JavaScript/First_steps/Variables)。
+> [!NOTE]
+> 稍后将讲解更多关于变量和常量的信息。[参见下一篇文章](/zh-CN/docs/Learn/JavaScript/First_steps/Variables)。
### 函数(Function)
diff --git a/files/zh-cn/learn/javascript/first_steps/arrays/index.md b/files/zh-cn/learn/javascript/first_steps/arrays/index.md
index 418f457a4e7d55..c5eaa6eebbf306 100644
--- a/files/zh-cn/learn/javascript/first_steps/arrays/index.md
+++ b/files/zh-cn/learn/javascript/first_steps/arrays/index.md
@@ -174,7 +174,8 @@ slug: Learn/JavaScript/First_steps/Arrays
// shopping will now return [ "tahini", "milk", "cheese", "hummus", "noodles" ]
```
- > **备注:** 我们以前说过,但还是提醒一下——电脑从 0 开始计数!
+ > [!NOTE]
+ > 我们以前说过,但还是提醒一下——电脑从 0 开始计数!
3. 请注意,数组中包含数组的话称之为多维数组。你可以通过将两组方括号链接在一起来访问数组内的另一个数组。例如,要访问数组内部的一个项目,即 `random` 数组中的第三个项目(参见上一节),我们可以这样做:
@@ -216,7 +217,8 @@ for (let i = 0; i < sequence.length; i++) {
通常,你会看到一个包含在一个长长的字符串中的原始数据,你可能希望将有用的项目分成更有用的表单,然后对它们进行处理,例如将它们显示在数据表中。为此,我们可以使用 {{jsxref("String.prototype.split()","split()")}} 方法。在其最简单的形式中,这需要一个参数,你要将字符串分隔的字符,并返回分隔符之间的子串,作为数组中的项。
-> **备注:** 好吧,从技术上讲,这是一个字符串方法,而不是一个数组方法,但是我们把它放在数组中,因为它在这里很合适。
+> [!NOTE]
+> 好吧,从技术上讲,这是一个字符串方法,而不是一个数组方法,但是我们把它放在数组中,因为它在这里很合适。
1. 我们来玩一下这个方法,看看它是如何工作的。首先,在控制台中创建一个字符串:
@@ -407,7 +409,8 @@ window.addEventListener("load", updateCode);
在这个例子中,我们将展示一种更简单的使用方法 - 在这里我们给你一个假的搜索网站,一个搜索框。这个想法是,当在搜索框中输入时,列表中会显示 5 个先前的搜索字词。当列表项目数量超过 5 时,每当新项目被添加到顶部时,最后一个项目开始被删除,因此总是显示 5 个以前的搜索字词。
-> **备注:** 在真正的搜索应用中,你可能可以点击先前的搜索字词返回上一次搜索,并显示实际的搜索结果!我们现在只是保持简单的逻辑。
+> [!NOTE]
+> 在真正的搜索应用中,你可能可以点击先前的搜索字词返回上一次搜索,并显示实际的搜索结果!我们现在只是保持简单的逻辑。
要完成该应用程序,我们需要你:
diff --git a/files/zh-cn/learn/javascript/first_steps/index.md b/files/zh-cn/learn/javascript/first_steps/index.md
index c0e366b665739a..bd90fe0e7722ee 100644
--- a/files/zh-cn/learn/javascript/first_steps/index.md
+++ b/files/zh-cn/learn/javascript/first_steps/index.md
@@ -15,7 +15,8 @@ slug: Learn/JavaScript/First_steps
- [HTML 简介](/zh-CN/docs/Learn/HTML/Introduction_to_HTML)。
- [CSS 简介](/zh-CN/docs/Learn/CSS/Introduction_to_CSS)。
-> **备注:** 如果你无法在你使用的电脑/平板/其他设备上创建自己的文件,尝试使用在线编程应用来运行(大部分)代码示例,例如 [JSBin](https://jsbin.com/) 和 [Glitch](https://glitch.com/)。
+> [!NOTE]
+> 如果你无法在你使用的电脑/平板/其他设备上创建自己的文件,尝试使用在线编程应用来运行(大部分)代码示例,例如 [JSBin](https://jsbin.com/) 和 [Glitch](https://glitch.com/)。
## 学习指南
diff --git a/files/zh-cn/learn/javascript/first_steps/math/index.md b/files/zh-cn/learn/javascript/first_steps/math/index.md
index 6f1e81895a4bef..db946e2f968344 100644
--- a/files/zh-cn/learn/javascript/first_steps/math/index.md
+++ b/files/zh-cn/learn/javascript/first_steps/math/index.md
@@ -134,9 +134,11 @@ slug: Learn/JavaScript/First_steps/Math
-> **备注:** 你以后有时候会看到参与算术计算的数字被称为 操作数 ({{Glossary("Operand", "operands")}})。
+> [!NOTE]
+> 你以后有时候会看到参与算术计算的数字被称为 操作数 ({{Glossary("Operand", "operands")}})。
-> **备注:** 有时你可能会看到使用较旧的 {{jsxref("Math.pow()")}} 方法表达的指数,该方法的工作方式非常相似。例如,在 `Math.pow(7, 3)` 中,`7` 是基数,`3` 是指数,因此表达式的结果是 `343`。 `Math.pow(7, 3)` 相当于 `7 ** 3`。
+> [!NOTE]
+> 有时你可能会看到使用较旧的 {{jsxref("Math.pow()")}} 方法表达的指数,该方法的工作方式非常相似。例如,在 `Math.pow(7, 3)` 中,`7` 是基数,`3` 是指数,因此表达式的结果是 `343`。 `Math.pow(7, 3)` 相当于 `7 ** 3`。
我们可能不需要教你如何做基础数学,但我们想测试你对所涉及的语法的理解。尝试将下面的示例输入到[开发者工具 JavaScript 控制台](/zh-CN/docs/Learn/Discover_browser_developer_tools)中。
@@ -190,7 +192,8 @@ num2 + num1 / 8 + 2;
尝试看看。
-> **备注:** 注意:可以在[表达式和运算符](/zh-CN/docs/Web/JavaScript/Guide/Expressions_and_operators#运算符优先级)中找到所有 JavaScript 运算符的完整列表及其优先级。
+> [!NOTE]
+> 注意:可以在[表达式和运算符](/zh-CN/docs/Web/JavaScript/Guide/Expressions_and_operators#运算符优先级)中找到所有 JavaScript 运算符的完整列表及其优先级。
## 自增和自减运算符
@@ -200,7 +203,8 @@ num2 + num1 / 8 + 2;
guessCount++;
```
-> **备注:** 它们最常用于[循环](/zh-CN/docs/Web/JavaScript/Guide/Loops_and_iteration)中,你将在以后的课程中了解。例如,假设你想循环查看价格表,并为每个价格增加销售税。你可以使用循环依次查看每个值,并在每种情况下进行必要的计算,以添加销售税。当需要时,增量器用于移动到下一个值。我们实际上提供了一个简单的例子,显示了如何完成——[在线查看效果](https://mdn.github.io/learning-area/javascript/introduction-to-js-1/maths/loop.html),并[查看源代码](https://github.com/mdn/learning-area/blob/main/javascript/introduction-to-js-1/maths/loop.html),看看是否可以发现增量器!我们稍后将会详细介绍循环。
+> [!NOTE]
+> 它们最常用于[循环](/zh-CN/docs/Web/JavaScript/Guide/Loops_and_iteration)中,你将在以后的课程中了解。例如,假设你想循环查看价格表,并为每个价格增加销售税。你可以使用循环依次查看每个值,并在每种情况下进行必要的计算,以添加销售税。当需要时,增量器用于移动到下一个值。我们实际上提供了一个简单的例子,显示了如何完成——[在线查看效果](https://mdn.github.io/learning-area/javascript/introduction-to-js-1/maths/loop.html),并[查看源代码](https://github.com/mdn/learning-area/blob/main/javascript/introduction-to-js-1/maths/loop.html),看看是否可以发现增量器!我们稍后将会详细介绍循环。
我们来试试看你们的控制台。首先,请注意,你不能将这些直接应用于一个数字,这可能看起来很奇怪,但是我们为变量赋值一个新的更新值,而不是对该值进行操作。以下将返回错误:
@@ -229,7 +233,8 @@ num2--;
num2;
```
-> **备注:** 你可以使浏览器以其他方式进行操作 - 递增/递减变量,然后返回值 - 将操作符放在变量的开头,而不是结束。再次尝试上面的例子,但这次使用 `++num1` 和 `--num2`。
+> [!NOTE]
+> 你可以使浏览器以其他方式进行操作 - 递增/递减变量,然后返回值 - 将操作符放在变量的开头,而不是结束。再次尝试上面的例子,但这次使用 `++num1` 和 `--num2`。
## 赋值运算符
@@ -260,7 +265,8 @@ let y = 4; // y 包含值 4
x *= y; // x 现在包含值 12
```
-> **备注:** 虽然有很多可用的[赋值运算符](/zh-CN/docs/Web/JavaScript/Guide/Expressions_and_operators#Assignment_operators),但是这些是你现在应该学习的基本的一类。
+> [!NOTE]
+> 虽然有很多可用的[赋值运算符](/zh-CN/docs/Web/JavaScript/Guide/Expressions_and_operators#Assignment_operators),但是这些是你现在应该学习的基本的一类。
## 主动学习:调整画布框的大小
@@ -294,7 +300,8 @@ x *= y; // x 现在包含值 12
| <= | 小于或等于 | 测试左值是否小于或等于右值。 | `3 <= 2` |
| >= | 大于或等于 | 测试左值是否大于或等于正确值。 | `5 >= 4` |
-> **备注:** 你可能会看到有些人在他们的代码中使用`==`和`!=`来判断相等和不相等,这些都是 JavaScript 中的有效运算符,但它们与`===`/`!==`不同,前者测试值是否相同,但是数据类型可能不同,而后者的严格版本测试值和数据类型是否相同。严格的版本往往导致更少的错误,所以我们建议你使用这些严格的版本。
+> [!NOTE]
+> 你可能会看到有些人在他们的代码中使用`==`和`!=`来判断相等和不相等,这些都是 JavaScript 中的有效运算符,但它们与`===`/`!==`不同,前者测试值是否相同,但是数据类型可能不同,而后者的严格版本测试值和数据类型是否相同。严格的版本往往导致更少的错误,所以我们建议你使用这些严格的版本。
如果你尝试在控制台中输入这些值,你将看到它们都返回 `true`/`false` 值 - 我们在上一篇文章中提到的那些布尔值。这些是非常有用的,因为它们允许我们在我们的代码中做出决定 - 每次我们想要选择某种类型时,都会使用这些代码,例如:
@@ -333,7 +340,8 @@ function updateBtn() {
你可以在 updateBtn()函数内看到正在使用的等号运算符。在这种情况下,我们不会测试两个数学表达式是否具有相同的值 - 我们正在测试一个按钮的文本内容是否包含某个字符串 - 但它仍然是工作原理。如果按钮当前为“启动机器(start machine)”,则将其标签更改为“停止机器(stop machine)”,并根据需要更新标签。如果按钮上写着“停机”时被按下,我们将显示回原来的内容。
-> **备注:** 这种在两个状态之间来回交换的行为通常被称为**切换**。它在一个状态和另一个状态之间切换 - 点亮,熄灭等
+> [!NOTE]
+> 这种在两个状态之间来回交换的行为通常被称为**切换**。它在一个状态和另一个状态之间切换 - 点亮,熄灭等
## 总结
@@ -341,6 +349,7 @@ function updateBtn() {
在下一篇文章中,我们将探讨文本,以及 JavaScript 如何让我们操纵它。
-> **备注:** 如果你喜欢数学,并希望阅读更多关于它如何在 JavaScript 中实现的,那么你可以在 MDN's main JavaScript 部分读到更多关于它的内容。对于学习[数字与日期](/zh-CN/docs/Web/JavaScript/Guide/Numbers_and_dates)和[表达式与运算符](/zh-CN/docs/Web/JavaScript/Guide/Expressions_and_operators#运算符优先级)来说,那是一个不错的地方。
+> [!NOTE]
+> 如果你喜欢数学,并希望阅读更多关于它如何在 JavaScript 中实现的,那么你可以在 MDN's main JavaScript 部分读到更多关于它的内容。对于学习[数字与日期](/zh-CN/docs/Web/JavaScript/Guide/Numbers_and_dates)和[表达式与运算符](/zh-CN/docs/Web/JavaScript/Guide/Expressions_and_operators#运算符优先级)来说,那是一个不错的地方。
{{PreviousMenuNext("Learn/JavaScript/First_steps/Variables", "Learn/JavaScript/First_steps/Strings", "Learn/JavaScript/First_steps")}}
diff --git a/files/zh-cn/learn/javascript/first_steps/silly_story_generator/index.md b/files/zh-cn/learn/javascript/first_steps/silly_story_generator/index.md
index 8a71f137b8af7a..24d1fd308f3ec1 100644
--- a/files/zh-cn/learn/javascript/first_steps/silly_story_generator/index.md
+++ b/files/zh-cn/learn/javascript/first_steps/silly_story_generator/index.md
@@ -27,7 +27,8 @@ slug: Learn/JavaScript/First_steps/Silly_story_generator
测验开始之前需要下载并保存 [index.html](https://github.com/roy-tian/learning-area/blob/master/javascript/introduction-to-js-1/assessment-start/index.html)、[style.css](https://github.com/roy-tian/learning-area/blob/master/javascript/introduction-to-js-1/assessment-start/style.css)、[raw-text.txt](https://github.com/roy-tian/learning-area/blob/master/javascript/introduction-to-js-1/assessment-start/raw-text.txt)。
-> **备注:** 你还可以用类似 [JSBin](https://jsbin.com/) 或 [Glitch](https://glitch.com/) 这些在线编辑器来完成测验。你可以把 HTML、CSS 及 JavaScript 代码复制过去。如果你选的工具没有独立的 JavaScript 版面,可以随时在 HTML 页面中添加 `
+```
+
+### 控制 `contenteditable` 元素上的虚拟键盘
+
+默认情况下,使用 [`contenteditable`](/zh-CN/docs/Web/HTML/Global_attributes/contenteditable) 属性的元素在被轻触或点击时会触发虚拟键盘。在某些情况下,可能希望阻止这种行为,并在其他事件后手动显示虚拟键盘。
+
+将 [`virtualkeyboardpolicy`](/zh-CN/docs/Web/HTML/Global_attributes/virtualkeyboardpolicy) 属性设置为 `manual` 可以阻止浏览器默认处理虚拟键盘的行为,而是通过使用 {{domxref("VirtualKeyboard")}} 接口的 `show()` 和 `hide()` 方法自行处理。
+
+下面的代码片段展示了如何使用 `virtualkeyboardpolicy` 属性和 `navigator.virtualKeyboard.show()` 方法来在双击事件后显示虚拟键盘:
+
+```html
+
+
+```
+
+## 接口
+
+- {{domxref('VirtualKeyboard')}} {{experimental_inline}}
+ - : 提供用于检索键盘布局映射和切换对物理键盘的按键捕获的函数。
+
+## 对其他接口的扩展
+
+- {{domxref("Navigator.virtualKeyboard")}} {{ReadOnlyInline}} {{experimental_inline}}
+ - : 返回对 {{DOMxRef("VirtualKeyboard")}} API(用于控制屏幕虚拟键盘)的引用。
+- {{domxref("HTMLElement.virtualkeyboardpolicy")}} {{experimental_inline}}
+ - : 一个字符串,指示在元素聚焦时是否使用浏览器的默认策略显示虚拟键盘,或者手动处理虚拟键盘的显示。
+
+## 规范
+
+{{Specifications}}
+
+## 浏览器兼容性
+
+{{Compat}}
+
+## 参见
+
+- [使用虚拟键盘 API 实现完全控制](https://developer.chrome.com/docs/web-platform/virtual-keyboard/)
From f2bea2f93c3c49d1b44ea7fd80891ac95137b4c6 Mon Sep 17 00:00:00 2001
From: A1lo
Date: Sun, 28 Jul 2024 12:50:51 +0800
Subject: [PATCH 130/185] zh-cn: update Markdown in MDN docs to use GFM syntax
(#22553)
---
.../howto/markdown_in_mdn/index.md | 72 +++++++++----------
1 file changed, 33 insertions(+), 39 deletions(-)
diff --git a/files/zh-cn/mdn/writing_guidelines/howto/markdown_in_mdn/index.md b/files/zh-cn/mdn/writing_guidelines/howto/markdown_in_mdn/index.md
index 2ed27020f6df24..ebe860835fae9c 100644
--- a/files/zh-cn/mdn/writing_guidelines/howto/markdown_in_mdn/index.md
+++ b/files/zh-cn/mdn/writing_guidelines/howto/markdown_in_mdn/index.md
@@ -1,6 +1,8 @@
---
title: 如何使用 Markdown 来撰写文档
slug: MDN/Writing_guidelines/Howto/Markdown_in_MDN
+l10n:
+ sourceCommit: a5682b8bcf2b9761fa576004deea720f76735aaf
---
{{MDNSidebar}}
@@ -9,7 +11,7 @@ slug: MDN/Writing_guidelines/Howto/Markdown_in_MDN
## 基础:Github 风格的 Markdown
-MDN Markdown 的基础是 Github 风格的 Markdown(GFM): 。这意味着,对于本文中未指定的内容,你可以参考 GFM 规范。而 GFM 又是 CommonMark([https://spec.commonmark.org/](https://spec.commonmark.org/))的超集。
+MDN Markdown 的基础是 Github 风格的 Markdown(GFM): 。这意味着,对于本文中未指定的内容,你可以参考 GFM 规范。而 GFM 又是 CommonMark( )的超集。
## 链接
@@ -173,15 +175,19 @@ const greeting = "这是一个错误示例";
## 备注、警告和标注
-如果你需要特别声明一些内容。那么,可以使用一个带有特殊起始段落的 GFM 块引用。一共有三种类型:备注、警告和标注。
+有时作者需要特别强调某些内容。要做到这一点,可以使用 [GFM 备注块语法](https://github.com/orgs/community/discussions/16925),这是一种带有特殊起始行的 GFM 块引用。一共有三种类型:备注、警告和标注。
-- 要添加备注,请创建一个 GFM 块引用,起始段落以 `**备注:**` 开头。
-- 要添加警告,请创建一个 GFM 块引用,起始段落以 `**警告:**` 开头。
-- 要添加标注,请创建一个 GFM 块引用,起始段落以 `**标注:**` 开头。
+> [!NOTE]
+> MDN Web 文档在 GFM 添加 noteblock 语法之前就已经支持了自己的备注块语法。因此,MDN 仅支持 GFM 支持的五种备注块类型中的两种,并且支持另一种 GFM 不支持的类型。
-备注和警告将在输出中渲染为“**备注:**”或“**警告:**”文本,而标注不会。当你想要提供自定义标题时,标注会是一个不错的选择。
+- 要添加备注,请创建一个 GFM 块引用,起始行为 `[!NOTE]`。
+- 要添加警告,请创建一个 GFM 块引用,起始行为 `[!WARNING]`。
+- 要添加标注,请创建一个 GFM 块引用,起始行为 `[!CALLOUT]`。
-标记的处理是是基于生成的 AST,而不是指定的确切字符串。这意味着,使用 `备注: ` 也会生成注释。但是,请以 Markdown 语法为主要风格。
+备注和警告将在输出中添加本地化的“**备注:**”或“**警告:**”,而标注不会。当你想要提供自定义标题时,标注会是一个不错的选择。
+
+> [!WARNING]
+> 在旧的 MDN 语法中,类型是本地化的,并且会以粗体文本添加到第一个段落中,例如 `**备注:** Foo bar` 而不是 `[!NOTE] ⏎ Foo bar`。出于迁移的目的,此语法仍受支持。但请避免在新文档中使用。
多行块引用由空的块引用生成,就像普通的段落一样。此外,没有空格的多行内容会像常规 Markdown 行一样被处理和连接。
@@ -192,7 +198,8 @@ const greeting = "这是一个错误示例";
#### 备注
```md
-> **备注:** 这就是编写备注的方式。
+> [!NOTE]
+> 这就是编写备注的方式。
>
> 它可以有好几行。
```
@@ -201,21 +208,23 @@ const greeting = "这是一个错误示例";
```html
-
备注: 这就是编写备注的方式。
+
备注: 这就是编写备注的方式。
它可以有好几行。
```
此 HTML 将渲染为高亮显示的框,例如:
-> **备注:** 这就是编写备注的方式。
+> [!NOTE]
+> 这就是编写备注的方式。
>
> 它可以有好几行。
#### 警告
```md
-> **警告:** 这就是编写警告的方式。
+> [!WARNING]
+> 这就是编写警告的方式。
>
> 它可以有好几段。
```
@@ -224,21 +233,24 @@ const greeting = "这是一个错误示例";
```html
-
警告: 这就是编写警告的方式。
+
警告: 这就是编写警告的方式。
它可以有好几段。
```
此 HTML 将渲染为高亮显示的框,例如:
-> **警告:** 这就是编写警告的方式。
+> [!WARNING]
+> 这就是编写警告的方式。
>
> 它可以有好几段。
#### 标注
```md
-> **标注:** **这就是编写标注的方式。**
+> [!CALLOUT]
+>
+> **这就是编写标注的方式。**
>
> 它可以有好几段。
```
@@ -254,38 +266,19 @@ const greeting = "这是一个错误示例";
此 HTML 将渲染为高亮显示的框,例如:
-> **标注:**
+> [!CALLOUT]
>
> **这就是编写标注的方式。**
>
> 它可以有好几段。
-#### 警告的翻译
-
-因为文本“**备注:**”或“**警告:**”也会出现在渲染的输出中,因此必须考虑到翻译问题。实际上,这意味这 MDN 支持的每一种语言环境都必须提供这些字符串的翻译,平台必须识别到它们表明了这些结构需要特殊处理。
-
-这些本地化内容以 [gettext](https://www.gnu.org/software/gettext/) 格式存储在 [Yari](https://github.com/mdn/yari/tree/main/markdown/localizations) 的 JSON 文件中。请参考这些文件以确定应使用什么字符串来表示特定语言环境的“备注:”和“警告:”。如果未定义区域设置文件,将自动回退到英文版本。
-
-例如,如果我们想在德语中使用“Warnung”来表示“警告”,那么我们在德语页面应该写:
-
-```md
-> **Warnung:** So schreibt man eine Warnung.
-```
-
-这会产生:
-
-```html
-
-
Warnung: So schreibt man eine Warnung.
-
-```
-
#### 包含代码块的备注
这是一个包含代码块的例子。
````md
-> **备注:** 这是编写备注的方式。
+> [!NOTE]
+> 这是编写备注的方式。
>
> 它可以包含代码块。
>
@@ -300,7 +293,7 @@ const greeting = "这是一个错误示例";
```html
-
备注: 这是编写备注的方式。
+
备注: 这是编写备注的方式。
它可以包含代码块。
const s = "我在代码块中";
就像这样。
@@ -309,7 +302,8 @@ const greeting = "这是一个错误示例";
HTML 将渲染为包含代码块的框:
-> **备注:** 这是编写备注的方式。
+> [!NOTE]
+> 这是编写备注的方式。
>
> 它可以包含代码块。
>
@@ -482,7 +476,7 @@ GFM 表格语法的主要限制是:
#### GFM 表格最大宽度
-有时,即使可以使用 GFM 编写表格,也应该使用 HTML。因为 GFM 使用“ASCII art”来实现表格,当表格的一行变得过长时,将变得难以阅读。例如,考虑以下表格:
+有时,即使可以使用 GFM 编写表格,也应该使用 HTML。因为 GFM 使用“{{Glossary("ASCII")}} art”来实现表格,当表格的一行变得过长时,将变得难以阅读。例如,考虑以下表格:
```html
From d43dba838aaea0d80e90c838cb08824019914266 Mon Sep 17 00:00:00 2001
From: Hoarfroster
Date: Sun, 28 Jul 2024 13:21:43 +0800
Subject: [PATCH 131/185] chore(zh-cn): convert noteblocks for `/web` (part 12)
(#22638)
Co-authored-by: Jason Ren <40999116+jasonren0403@users.noreply.github.com>
---
.../zh-cn/web/events/event_handlers/index.md | 6 +++--
.../web/manifest/background_color/index.md | 3 ++-
files/zh-cn/web/manifest/index.md | 12 ++++++----
files/zh-cn/web/mathml/attribute/index.md | 3 ++-
files/zh-cn/web/mathml/authoring/index.md | 24 ++++++++++++-------
files/zh-cn/web/mathml/element/index.md | 3 ++-
.../zh-cn/web/mathml/element/maction/index.md | 3 ++-
files/zh-cn/web/mathml/element/math/index.md | 3 ++-
.../zh-cn/web/mathml/element/mfenced/index.md | 3 ++-
files/zh-cn/web/mathml/element/mfrac/index.md | 3 ++-
files/zh-cn/web/mathml/element/mi/index.md | 4 ++--
.../web/mathml/element/mmultiscripts/index.md | 3 ++-
files/zh-cn/web/mathml/element/mo/index.md | 3 ++-
.../zh-cn/web/mathml/element/mspace/index.md | 3 ++-
.../zh-cn/web/mathml/element/mstyle/index.md | 3 ++-
files/zh-cn/web/mathml/element/msub/index.md | 3 ++-
.../zh-cn/web/mathml/element/msubsup/index.md | 3 ++-
files/zh-cn/web/mathml/element/msup/index.md | 3 ++-
.../zh-cn/web/mathml/element/mtable/index.md | 3 ++-
.../web/mathml/element/semantics/index.md | 3 ++-
files/zh-cn/web/mathml/fonts/index.md | 12 ++++++----
.../global_attributes/mathbackground/index.md | 3 ++-
.../global_attributes/mathcolor/index.md | 3 ++-
.../global_attributes/mathsize/index.md | 6 +++--
files/zh-cn/web/mathml/index.md | 3 ++-
.../index.md | 6 +++--
.../buffering_seeking_time_ranges/index.md | 6 +++--
.../index.md | 24 ++++++++++++-------
.../audio_and_video_manipulation/index.md | 21 ++++++++++------
files/zh-cn/web/media/autoplay_guide/index.md | 12 ++++++----
.../web/media/formats/image_types/index.md | 21 ++++++++++------
.../web/media/formats/video_codecs/index.md | 3 ++-
.../index.md | 6 +++--
.../web/performance/dns-prefetch/index.md | 3 ++-
.../partitioned_cookies/index.md | 6 +++--
.../guides/caching/index.md | 3 ++-
.../offline_and_background_operation/index.md | 3 ++-
.../cycletracker/secure_connection/index.md | 6 +++--
.../js13kgames/installable_pwas/index.md | 3 ++-
.../practical_implementation_guides/index.md | 3 ++-
.../web/security/same-origin_policy/index.md | 6 +++--
.../web/security/secure_contexts/index.md | 3 ++-
.../security/subresource_integrity/index.md | 9 ++++---
.../index.md | 3 ++-
files/zh-cn/web/svg/attribute/d/index.md | 15 ++++++++----
.../zh-cn/web/svg/attribute/display/index.md | 3 ++-
.../web/svg/attribute/fill-rule/index.md | 3 ++-
files/zh-cn/web/svg/attribute/id/index.md | 3 ++-
.../svg/attribute/image-rendering/index.md | 3 ++-
files/zh-cn/web/svg/attribute/in/index.md | 3 ++-
files/zh-cn/web/svg/attribute/index.md | 3 ++-
.../svg/attribute/stroke-linejoin/index.md | 6 +++--
files/zh-cn/web/svg/attribute/target/index.md | 3 ++-
.../web/svg/attribute/transform/index.md | 6 +++--
.../web/svg/attribute/visibility/index.md | 3 ++-
files/zh-cn/web/svg/attribute/width/index.md | 3 ++-
files/zh-cn/web/svg/attribute/x/index.md | 3 ++-
files/zh-cn/web/svg/attribute/y/index.md | 3 ++-
.../web/svg/element/animatemotion/index.md | 3 ++-
files/zh-cn/web/svg/element/cursor/index.md | 3 ++-
.../web/svg/element/fedropshadow/index.md | 3 ++-
.../web/svg/element/foreignobject/index.md | 3 ++-
files/zh-cn/web/svg/element/image/index.md | 3 ++-
files/zh-cn/web/svg/element/index.md | 3 ++-
.../web/svg/element/radialgradient/index.md | 3 ++-
.../web/svg/svg_animation_with_smil/index.md | 3 ++-
.../svg/tutorial/fills_and_strokes/index.md | 3 ++-
.../zh-cn/web/svg/tutorial/gradients/index.md | 3 ++-
files/zh-cn/web/svg/tutorial/index.md | 1 -
.../tutorial/other_content_in_svg/index.md | 3 ++-
.../zh-cn/web/svg/tutorial/svg_fonts/index.md | 3 ++-
.../svg_in_html_introduction/index.md | 3 ++-
files/zh-cn/web/text_fragments/index.md | 3 ++-
files/zh-cn/web/tutorials/index.md | 4 +++-
.../xml/parsing_and_serializing_xml/index.md | 3 ++-
files/zh-cn/web/xpath/index.md | 3 ++-
76 files changed, 253 insertions(+), 128 deletions(-)
diff --git a/files/zh-cn/web/events/event_handlers/index.md b/files/zh-cn/web/events/event_handlers/index.md
index c717c1548f01e1..f68a07a3e209dc 100644
--- a/files/zh-cn/web/events/event_handlers/index.md
+++ b/files/zh-cn/web/events/event_handlers/index.md
@@ -17,7 +17,8 @@ slug: Web/Events/Event_handlers
有两种推荐的注册处理器的方法。可以将事件处理器代码赋值给目标元素对应的 _onevent_ 属性,或使用 {{domxref("EventTarget.addEventListener", "addEventListener()")}} 方法将处理器注册为元素的监听器,从而在事件触发时运行事件处理器的代码。无论哪种情况,处理器都将接收一个符合 [`Event` 接口](/zh-CN/docs/Web/API/Event)的对象。主要区别在于可以使用事件监听器方法添加(或删除)多个事件处理器。
-> **警告:** 不推荐使用 HTML onevent 属性设置事件处理器的第三种方法!它们会使标签变长,从而降低了可读性且变得难以调试。有关详细信息,请参阅[内联事件处理器](/zh-CN/docs/Learn/JavaScript/Building_blocks/Events#内联事件处理器——不要使用)。
+> [!WARNING]
+> 不推荐使用 HTML onevent 属性设置事件处理器的第三种方法!它们会使标签变长,从而降低了可读性且变得难以调试。有关详细信息,请参阅[内联事件处理器](/zh-CN/docs/Learn/JavaScript/Building_blocks/Events#内联事件处理器——不要使用)。
### 使用 onevent 属性
@@ -43,7 +44,8 @@ btn.onclick = greet;
在元素上设置事件处理器的最灵活的方法是使用 {{domxref("EventTarget.addEventListener")}} 方法。这种方法允许为一个元素分配多个监听器,并在需要时*删除*监听器(使用 {{domxref("EventTarget.removeEventListener")}} 方法)。
-> **备注:** 添加和删除事件处理器的功能允许你在不同情况下执行不同的操作,例如,让同一个按钮执行不同的操作。此外,在更复杂的程序中,清理旧的或未使用的事件处理器可以提高效率。
+> [!NOTE]
+> 添加和删除事件处理器的功能允许你在不同情况下执行不同的操作,例如,让同一个按钮执行不同的操作。此外,在更复杂的程序中,清理旧的或未使用的事件处理器可以提高效率。
下面我们展示了如何将一个简单的 `greet()` 函数设置为 `click` 事件的监听器/事件处理器(如果需要,你可以使用匿名函数代替具名函数)。请再次注意,事件(event)会作为第一个参数传递给事件处理器。
diff --git a/files/zh-cn/web/manifest/background_color/index.md b/files/zh-cn/web/manifest/background_color/index.md
index 8a402c35b7ef67..fc39202f736743 100644
--- a/files/zh-cn/web/manifest/background_color/index.md
+++ b/files/zh-cn/web/manifest/background_color/index.md
@@ -22,7 +22,8 @@ slug: Web/Manifest/background_color
因此,`background_color` 应与 {{cssxref("background-color")}} 网站样式表中的 CSS 属性匹配,以在启动 Web 应用程序和加载网站内容之间进行平滑过渡。
-> **备注:** 该 `background_color` 成员仅用于在从网络或存储介质加载主样式表时改善用户体验。当渐进式 Web 应用程序样式表可用时,用户代理不会将 {{cssxref("background-color")}} 用作 CSS 属性。
+> [!NOTE]
+> 该 `background_color` 成员仅用于在从网络或存储介质加载主样式表时改善用户体验。当渐进式 Web 应用程序样式表可用时,用户代理不会将 {{cssxref("background-color")}} 用作 CSS 属性。
## 实例
diff --git a/files/zh-cn/web/manifest/index.md b/files/zh-cn/web/manifest/index.md
index 0c854a14503c6e..011b70c8335958 100644
--- a/files/zh-cn/web/manifest/index.md
+++ b/files/zh-cn/web/manifest/index.md
@@ -81,7 +81,8 @@ Web 应用程序清单部署在你的 HTML 页面中,使用在你的文件的
"background_color": "red"
```
-> **备注:** background_color 只是在 web 应用程序加载时提高用户体验,而当 web 应用程序的样式表可用时,不能替代作为背景颜色使用。
+> [!NOTE]
+> background_color 只是在 web 应用程序加载时提高用户体验,而当 web 应用程序的样式表可用时,不能替代作为背景颜色使用。
### `description`
@@ -107,7 +108,8 @@ Web 应用程序清单部署在你的 HTML 页面中,使用在你的文件的
- `rtl` (由右到左)
- `auto` (由浏览器自动判断。
-> **备注:** 当省略时,默认为 auto
+> [!NOTE]
+> 当省略时,默认为 auto
### `display`
@@ -126,7 +128,8 @@ Web 应用程序清单部署在你的 HTML 页面中,使用在你的文件的
| `minimal-ui` | 该应用程序将看起来像一个独立的应用程序,但会有浏览器地址栏。样式因浏览器而异。 | `browser` |
| `browser` | 该应用程序在传统的浏览器标签或新窗口中打开,具体实现取决于浏览器和平台。这是默认的设置。 | (None) |
-> **备注:** 你可以使用显示模式媒体功能,根据[显示模式](/zh-CN/docs/Web/CSS/@media/display-mode)选择性地将 CSS 应用到你的应用程序。这可用于在从 URL 启动网站和从桌面图标启动网站之间提供一致的用户体验。
+> [!NOTE]
+> 你可以使用显示模式媒体功能,根据[显示模式](/zh-CN/docs/Web/CSS/@media/display-mode)选择性地将 CSS 应用到你的应用程序。这可用于在从 URL 启动网站和从桌面图标启动网站之间提供一致的用户体验。
### `icons`
@@ -205,7 +208,8 @@ Web 应用程序清单部署在你的 HTML 页面中,使用在你的文件的
"prefer_related_applications": false
```
-> **备注:** 如果省略,默认设置为 `false`.
+> [!NOTE]
+> 如果省略,默认设置为 `false`.
### `related_applications`
diff --git a/files/zh-cn/web/mathml/attribute/index.md b/files/zh-cn/web/mathml/attribute/index.md
index 45d1e22f5fd2fb..515e0e60ee3d92 100644
--- a/files/zh-cn/web/mathml/attribute/index.md
+++ b/files/zh-cn/web/mathml/attribute/index.md
@@ -9,7 +9,8 @@ l10n:
此页面是 MathML 属性的字母表。要了解每个属性的更多详细信息,请参见 [MathML 元素页面](/zh-CN/docs/Web/MathML/Element)和[全局属性页面](/zh-CN/docs/Web/MathML/Global_attributes)。[值](/zh-CN/docs/Web/MathML/Values)页面也介绍了有关 MathML 属性常用值的一些说明。
-> **备注:** 就像 [MathML](/zh-CN/docs/Web/MathML) 主页所解释的那样,MDN 使用 [MathML 核心](https://w3c.github.io/mathml-core/)作为参考规范。不过,一些浏览器仍在使用的遗留特性也被记录在案。你可以在 [MathML 4](https://w3c.github.io/mathml/) 中找到有关这些特性和其他特性的更多详细信息。
+> [!NOTE]
+> 就像 [MathML](/zh-CN/docs/Web/MathML) 主页所解释的那样,MDN 使用 [MathML 核心](https://w3c.github.io/mathml-core/)作为参考规范。不过,一些浏览器仍在使用的遗留特性也被记录在案。你可以在 [MathML 4](https://w3c.github.io/mathml/) 中找到有关这些特性和其他特性的更多详细信息。
diff --git a/files/zh-cn/web/mathml/authoring/index.md b/files/zh-cn/web/mathml/authoring/index.md
index 1bdfb22038ea4a..114ec5ba896d4c 100644
--- a/files/zh-cn/web/mathml/authoring/index.md
+++ b/files/zh-cn/web/mathml/authoring/index.md
@@ -54,9 +54,11 @@ l10n:
```
-> **备注:** 要在 XML 文档(例如 XHTML、EPUB 或 OpenDocument)中使用 MathML,请在每个 `` 元素中放置一个 `xmlns="http://www.w3.org/1998/Math/MathML"` 属性。
+> [!NOTE]
+> 要在 XML 文档(例如 XHTML、EPUB 或 OpenDocument)中使用 MathML,请在每个 `` 元素中放置一个 `xmlns="http://www.w3.org/1998/Math/MathML"` 属性。
-> **备注:** 某些电子邮件或即时通讯客户端能够发送和接收 HTML 格式的消息。因此,可以在此类消息中嵌入数学公式,只要标记清理程序未将 MathML 标签过滤掉。
+> [!NOTE]
+> 某些电子邮件或即时通讯客户端能够发送和接收 HTML 格式的消息。因此,可以在此类消息中嵌入数学公式,只要标记清理程序未将 MathML 标签过滤掉。
#### 对不支持 MathML 的浏览器的回退方案
@@ -78,7 +80,8 @@ l10n:
```
-> **备注:** 这些脚本会执行特性检测(探测 [mspace](/zh-CN/docs/Web/MathML/Element/mspace) 元素和 [mpadded](/zh-CN/docs/Web/MathML/Element/mpadded) 元素),这优于[浏览器嗅探](/zh-CN/docs/Web/HTTP/Browser_detection_using_the_user_agent)。此外,它们是在开源许可证下分发的,因此可以自由地将它们复制到你自己的服务器上,并根据需要进行调整。
+> [!NOTE]
+> 这些脚本会执行特性检测(探测 [mspace](/zh-CN/docs/Web/MathML/Element/mspace) 元素和 [mpadded](/zh-CN/docs/Web/MathML/Element/mpadded) 元素),这优于[浏览器嗅探](/zh-CN/docs/Web/HTTP/Browser_detection_using_the_user_agent)。此外,它们是在开源许可证下分发的,因此可以自由地将它们复制到你自己的服务器上,并根据需要进行调整。
#### 数学公式字体
@@ -100,7 +103,8 @@ l10n:
href="https://fred-wang.github.io/MathFonts/STIX/mathfonts.css" />
```
-> **备注:** MathFonts 页面中的字体和样式表是在开源许可下分发的,因此可以自由地将它们复制到你自己的服务器上,并根据需要进行修改。
+> [!NOTE]
+> MathFonts 页面中的字体和样式表是在开源许可下分发的,因此可以自由地将它们复制到你自己的服务器上,并根据需要进行修改。
## 从简单语法转换
@@ -245,7 +249,8 @@ latexmlc --dest foo.html --javascript=https://fred-wang.github.io/mathml.css/msp
latexmlc --dest foo.html --javascript=https://fred-wang.github.io/mathjax.js/mpadded-min.js foo.tex # Add the MathJax fallback
```
-> **备注:** 命令行工具可以在服务端使用,例如:[MediaWiki](https://www.mediawiki.org/wiki/MediaWiki) 使用 [Mathoid](https://github.com/wikimedia/mathoid) 以完成从 LaTeX 到 MathML 的转换。
+> [!NOTE]
+> 命令行工具可以在服务端使用,例如:[MediaWiki](https://www.mediawiki.org/wiki/MediaWiki) 使用 [Mathoid](https://github.com/wikimedia/mathoid) 以完成从 LaTeX 到 MathML 的转换。
## 图形界面
@@ -257,13 +262,15 @@ latexmlc --dest foo.html --javascript=https://fred-wang.github.io/mathjax.js/mpa
![Thunderbird 的 LaTeX 输入框](thunderbird.png)
-> **备注:** 你也可以使用 **Insert > HTML** 命令直接插入 MathML 内容。
+> [!NOTE]
+> 你也可以使用 **Insert > HTML** 命令直接插入 MathML 内容。
[LibreOffice](https://www.libreoffice.org/) 的公式编辑器(文件 → 新建 → 公式)提供了增强功能:它的 _StartMath_ 语法输入框提供了额外的公式面板来插入预定义的数学公式结构。
![Libre Office 中的 StarMath 输入框](libreoffice.png)
-> **备注:** 要获取 libreoffice 的 MathML 代码,请将文档保存为 `mml` 格式,并在你喜欢的文本编辑器中打开它。
+> [!NOTE]
+> 要获取 libreoffice 的 MathML 代码,请将文档保存为 `mml` 格式,并在你喜欢的文本编辑器中打开它。
### 所见即所得编辑器
@@ -273,7 +280,8 @@ latexmlc --dest foo.html --javascript=https://fred-wang.github.io/mathjax.js/mpa
![TeXmacs 的示例](texmacs.png)
-> **备注:** 默认情况下,Lyx 和 TeXmacs 会在它们的 HTML 输出中使用数学公式的图像。要使用 MathML,对于前者,请[参照这里的说明](https://github.com/brucemiller/LaTeXML/wiki/Integrating-LaTeXML-into-TeX-editors#lyx);对于后者,请选择 `User preference > Convert > Export mathematical formulas as MathML`。
+> [!NOTE]
+> 默认情况下,Lyx 和 TeXmacs 会在它们的 HTML 输出中使用数学公式的图像。要使用 MathML,对于前者,请[参照这里的说明](https://github.com/brucemiller/LaTeXML/wiki/Integrating-LaTeXML-into-TeX-editors#lyx);对于后者,请选择 `User preference > Convert > Export mathematical formulas as MathML`。
### 光学字符和手写识别
diff --git a/files/zh-cn/web/mathml/element/index.md b/files/zh-cn/web/mathml/element/index.md
index 592873a7b4fd82..00da8f394d44db 100644
--- a/files/zh-cn/web/mathml/element/index.md
+++ b/files/zh-cn/web/mathml/element/index.md
@@ -9,7 +9,8 @@ l10n:
这是一份按字母排序的 MathML 元素列表。所有这些元素都实现了 {{domxref("MathMLElement")}} 类。
-> **备注:** 如主 [MathML](/zh-CN/docs/Web/MathML) 页面所述,MDN 使用 [MathML Core](https://w3c.github.io/mathml-core/) 作为参考规范。但是,文档也记录了一些浏览器仍然实现的旧版特性。你可以在 [MathML 4](https://w3c.github.io/mathml/) 中找到这些和其他特性的更多详细信息。
+> [!NOTE]
+> 如主 [MathML](/zh-CN/docs/Web/MathML) 页面所述,MDN 使用 [MathML Core](https://w3c.github.io/mathml-core/) 作为参考规范。但是,文档也记录了一些浏览器仍然实现的旧版特性。你可以在 [MathML 4](https://w3c.github.io/mathml/) 中找到这些和其他特性的更多详细信息。
## MathML 元素(字母排序)
diff --git a/files/zh-cn/web/mathml/element/maction/index.md b/files/zh-cn/web/mathml/element/maction/index.md
index 2c5afb5f4e4597..be8cc6d001216a 100644
--- a/files/zh-cn/web/mathml/element/maction/index.md
+++ b/files/zh-cn/web/mathml/element/maction/index.md
@@ -9,7 +9,8 @@ l10n:
**``** [MathML](/zh-CN/docs/Web/MathML) 元素允许将行为绑定到数学表达式上。默认情况下,只有第一个子元素会被渲染,但是一些浏览器可能会根据 `actiontype` 和 `selection` 属性来实现自定义行为。
-> **备注:** 从历史的角度来看,该元素提供了一种使 MathML 公式可以交互的机制。但如今,建议使用 [JavaScript](/zh-CN/docs/Web/JavaScript) 和其他 Web 技术来实现这种用例。
+> [!NOTE]
+> 从历史的角度来看,该元素提供了一种使 MathML 公式可以交互的机制。但如今,建议使用 [JavaScript](/zh-CN/docs/Web/JavaScript) 和其他 Web 技术来实现这种用例。
## 属性
diff --git a/files/zh-cn/web/mathml/element/math/index.md b/files/zh-cn/web/mathml/element/math/index.md
index 204d46381db7fa..800cda588244dc 100644
--- a/files/zh-cn/web/mathml/element/math/index.md
+++ b/files/zh-cn/web/mathml/element/math/index.md
@@ -7,7 +7,8 @@ slug: Web/MathML/Element/math
**``** [MathML](/zh-CN/docs/Web/MathML) 元素是顶级的 MathML 元素,用于编写单个数学公式。可以将其放在允许[流式内容](/zh-CN/docs/Web/HTML/Content_categories#流式内容)的 HTML 内容中。
-> **备注:** 参阅[编写 MathML 页面](/zh-CN/docs/Web/MathML/Authoring#使用_mathml)以了解如何正确地在网页中集成 MathML 公式,有关更多的演示,请参阅[示例](/zh-CN/docs/Web/MathML/Examples)页面。
+> [!NOTE]
+> 参阅[编写 MathML 页面](/zh-CN/docs/Web/MathML/Authoring#使用_mathml)以了解如何正确地在网页中集成 MathML 公式,有关更多的演示,请参阅[示例](/zh-CN/docs/Web/MathML/Examples)页面。
## 属性
diff --git a/files/zh-cn/web/mathml/element/mfenced/index.md b/files/zh-cn/web/mathml/element/mfenced/index.md
index 9c3974880bcfcf..1d878f398e3a84 100644
--- a/files/zh-cn/web/mathml/element/mfenced/index.md
+++ b/files/zh-cn/web/mathml/element/mfenced/index.md
@@ -9,7 +9,8 @@ l10n:
`` [MathML](/zh-CN/docs/Web/MathML) 元素提供了向表达式添加自定义开和闭括号(如圆括号)以及分隔符(如逗号或分号)的可能。
-> **备注:** 从历史上看,`` 元素被定义为编写围栏表达式的一种简写形式,相当于涉及 {{MathMLElement("mrow")}} 和 {{MathMLElement("mo")}} 元素的扩展形式。现在,建议改用等效形式。
+> [!NOTE]
+> 从历史上看,`` 元素被定义为编写围栏表达式的一种简写形式,相当于涉及 {{MathMLElement("mrow")}} 和 {{MathMLElement("mo")}} 元素的扩展形式。现在,建议改用等效形式。
## 属性
diff --git a/files/zh-cn/web/mathml/element/mfrac/index.md b/files/zh-cn/web/mathml/element/mfrac/index.md
index f286a11c8dcbb3..5071d8deed5eab 100644
--- a/files/zh-cn/web/mathml/element/mfrac/index.md
+++ b/files/zh-cn/web/mathml/element/mfrac/index.md
@@ -26,7 +26,8 @@ l10n:
- `numalign` {{deprecated_inline}} {{Non-standard_Inline}}
- : 分数上的分子对齐方式。可能的值包括:`left`、`center`(默认)和 `right`。
-> **备注:** 对于 `linethickness` 属性,一些浏览器可能还接受不推荐使用的值 `medium`、`thin` 和 `thick`(其确切解释留给实现者)或[旧版 MathML 长度](/zh-CN/docs/Web/MathML/Values#旧版_mathml_长度)。
+> [!NOTE]
+> 对于 `linethickness` 属性,一些浏览器可能还接受不推荐使用的值 `medium`、`thin` 和 `thick`(其确切解释留给实现者)或[旧版 MathML 长度](/zh-CN/docs/Web/MathML/Values#旧版_mathml_长度)。
## 示例
diff --git a/files/zh-cn/web/mathml/element/mi/index.md b/files/zh-cn/web/mathml/element/mi/index.md
index d5f8966d02fa9e..7d51e7de0e1e90 100644
--- a/files/zh-cn/web/mathml/element/mi/index.md
+++ b/files/zh-cn/web/mathml/element/mi/index.md
@@ -13,8 +13,8 @@ l10n:
要使用特定形式的字符,如粗体/斜体、衬线体、无衬线体、手写体/书法体、等宽体、双线体等,你应该使用适当的[数学字母数字符号](https://zh.wikipedia.org/wiki/数学字母数字符号)。
-> **备注:** 在之前的规范(MathML3)中,`mathvariant` 属性用于定义可以应用于数学字母数字符号的字符格式的逻辑类。
-> 相关的值现已被弃用,并预计在未来版本中从浏览器中删除。
+> [!NOTE]
+> 在之前的规范(MathML3)中,`mathvariant` 属性用于定义可以应用于数学字母数字符号的字符格式的逻辑类。相关的值现已被弃用,并预计在未来版本中从浏览器中删除。
## 属性
diff --git a/files/zh-cn/web/mathml/element/mmultiscripts/index.md b/files/zh-cn/web/mathml/element/mmultiscripts/index.md
index 617591949e81b2..0baab11a893623 100644
--- a/files/zh-cn/web/mathml/element/mmultiscripts/index.md
+++ b/files/zh-cn/web/mathml/element/mmultiscripts/index.md
@@ -37,7 +37,8 @@ MathML 使用以下语法,即一个基本表达式,后跟任意数量的后
- `superscriptshift` {{deprecated_inline}} {{Non-standard_Inline}}
- : 表示将上标基线向上移动的最小量的 {{cssxref("length-percentage")}}。
-> **备注:** 对于 `subscriptshift` 和 `superscriptshift` 属性,一些浏览器可能还接受[旧版 MathML 长度](/zh-CN/docs/Web/MathML/Values#旧版_mathml_长度)。
+> [!NOTE]
+> 对于 `subscriptshift` 和 `superscriptshift` 属性,一些浏览器可能还接受[旧版 MathML 长度](/zh-CN/docs/Web/MathML/Values#旧版_mathml_长度)。
## 示例
diff --git a/files/zh-cn/web/mathml/element/mo/index.md b/files/zh-cn/web/mathml/element/mo/index.md
index 03b8bfdc883234..58a509d4afdd90 100644
--- a/files/zh-cn/web/mathml/element/mo/index.md
+++ b/files/zh-cn/web/mathml/element/mo/index.md
@@ -36,7 +36,8 @@ l10n:
- `symmetric`
- : 一个 [``](/zh-CN/docs/Web/MathML/Values#mathml_特定类型),表示拉伸运算符是否应该与虚拟的数学轴(中心分数线)垂直对称。
-> **备注:** 对于 `lspace`、`maxsize`、`minsize` 和 `rspace` 属性,一些浏览器可能还接受[旧版 MathML 长度](/zh-CN/docs/Web/MathML/Values#旧版_mathml_长度)。
+> [!NOTE]
+> 对于 `lspace`、`maxsize`、`minsize` 和 `rspace` 属性,一些浏览器可能还接受[旧版 MathML 长度](/zh-CN/docs/Web/MathML/Values#旧版_mathml_长度)。
## 示例
diff --git a/files/zh-cn/web/mathml/element/mspace/index.md b/files/zh-cn/web/mathml/element/mspace/index.md
index 125ac083b414bb..64c2c5c21fbf33 100644
--- a/files/zh-cn/web/mathml/element/mspace/index.md
+++ b/files/zh-cn/web/mathml/element/mspace/index.md
@@ -20,7 +20,8 @@ l10n:
- `width`
- : [``](/zh-CN/docs/Web/CSS/length-percentage) 值,表示空白的宽度。
-> **备注:** 对于 `depth`、`height`、`width` 属性,一些浏览器可能也接受[旧版 MathML 长度值](/zh-CN/docs/Web/MathML/Values#旧版_mathml_长度)。
+> [!NOTE]
+> 对于 `depth`、`height`、`width` 属性,一些浏览器可能也接受[旧版 MathML 长度值](/zh-CN/docs/Web/MathML/Values#旧版_mathml_长度)。
## 示例
diff --git a/files/zh-cn/web/mathml/element/mstyle/index.md b/files/zh-cn/web/mathml/element/mstyle/index.md
index a35808ccce82b9..ef4d56c88456db 100644
--- a/files/zh-cn/web/mathml/element/mstyle/index.md
+++ b/files/zh-cn/web/mathml/element/mstyle/index.md
@@ -9,7 +9,8 @@ l10n:
**``** [MathML](/zh-CN/docs/Web/MathML) 元素用于更改其子元素的样式。
-> **备注:** 从历史上看,该元素接受几乎所有的 MathML 属性,并用于覆盖其后代的默认属性值。后来,它被限制为仅包括在现有网页中使用的一些相关的样式属性。如今,这些样式属性是[所有 MathML 元素共有的](/zh-CN/docs/Web/MathML/Global_attributes),因此 `` 实际上等同于一个 [``](/zh-CN/docs/Web/MathML/Element/mrow) 元素。然而,`` 可能仍然关系到浏览器之外的 MathML 实现的兼容性。
+> [!NOTE]
+> 从历史上看,该元素接受几乎所有的 MathML 属性,并用于覆盖其后代的默认属性值。后来,它被限制为仅包括在现有网页中使用的一些相关的样式属性。如今,这些样式属性是[所有 MathML 元素共有的](/zh-CN/docs/Web/MathML/Global_attributes),因此 `` 实际上等同于一个 [``](/zh-CN/docs/Web/MathML/Element/mrow) 元素。然而,`` 可能仍然关系到浏览器之外的 MathML 实现的兼容性。
## 属性
diff --git a/files/zh-cn/web/mathml/element/msub/index.md b/files/zh-cn/web/mathml/element/msub/index.md
index efdd305ed16cf0..c0e0736db0ea6e 100644
--- a/files/zh-cn/web/mathml/element/msub/index.md
+++ b/files/zh-cn/web/mathml/element/msub/index.md
@@ -18,7 +18,8 @@ l10n:
- `subscriptshift` {{deprecated_inline}} {{Non-standard_Inline}}
- : {{cssxref("length-percentage")}} 值,表示下标基线向下移动的最小距离。
-> **备注:** 对于 `subscriptshift` 属性,一些浏览器可能也会接受[旧版 MathML 长度](/zh-CN/docs/Web/MathML/Values#旧版_mathml_长度)。
+> [!NOTE]
+> 对于 `subscriptshift` 属性,一些浏览器可能也会接受[旧版 MathML 长度](/zh-CN/docs/Web/MathML/Values#旧版_mathml_长度)。
## 示例
diff --git a/files/zh-cn/web/mathml/element/msubsup/index.md b/files/zh-cn/web/mathml/element/msubsup/index.md
index aee94fa9909f07..44a3d338ad37d3 100644
--- a/files/zh-cn/web/mathml/element/msubsup/index.md
+++ b/files/zh-cn/web/mathml/element/msubsup/index.md
@@ -20,7 +20,8 @@ l10n:
- `superscriptshift` {{deprecated_inline}} {{Non-standard_Inline}}
- : {{cssxref("length-percentage")}} 值,表示上标基线向上移动的最小距离。
-> **备注:** 对于 `subscriptshift` 和 `superscriptshift` 属性,一些浏览器可能也会接受[旧版 MathML 长度](/zh-CN/docs/Web/MathML/Values#旧版_mathml_长度)。
+> [!NOTE]
+> 对于 `subscriptshift` 和 `superscriptshift` 属性,一些浏览器可能也会接受[旧版 MathML 长度](/zh-CN/docs/Web/MathML/Values#旧版_mathml_长度)。
## 示例
diff --git a/files/zh-cn/web/mathml/element/msup/index.md b/files/zh-cn/web/mathml/element/msup/index.md
index 17f8d67ac23572..61234dfb7b7271 100644
--- a/files/zh-cn/web/mathml/element/msup/index.md
+++ b/files/zh-cn/web/mathml/element/msup/index.md
@@ -18,7 +18,8 @@ l10n:
- `superscriptshift` {{deprecated_inline}} {{Non-standard_Inline}}
- : {{cssxref("length-percentage")}} 值,表示上标基线向上移动的最小距离。
-> **备注:** 对于 `superscriptshift` 属性,一些浏览器可能也会接受[旧版 MathML 长度](/zh-CN/docs/Web/MathML/Values#旧版_mathml_长度)。
+> [!NOTE]
+> 对于 `superscriptshift` 属性,一些浏览器可能也会接受[旧版 MathML 长度](/zh-CN/docs/Web/MathML/Values#旧版_mathml_长度)。
## 示例
diff --git a/files/zh-cn/web/mathml/element/mtable/index.md b/files/zh-cn/web/mathml/element/mtable/index.md
index 47a40f8785258c..4522156ad9ea3c 100644
--- a/files/zh-cn/web/mathml/element/mtable/index.md
+++ b/files/zh-cn/web/mathml/element/mtable/index.md
@@ -45,7 +45,8 @@ l10n:
- `width` {{Non-standard_Inline}}
- : 一个用于指定整个表格的宽度的 {{cssxref("length-percentage")}}。
-> **备注:** 对于 `width` 属性,某些浏览器还可能接受[旧版 MathML 长度](/zh-CN/docs/Web/MathML/Values#旧版_mathml_长度)。
+> [!NOTE]
+> 对于 `width` 属性,某些浏览器还可能接受[旧版 MathML 长度](/zh-CN/docs/Web/MathML/Values#旧版_mathml_长度)。
## 示例
diff --git a/files/zh-cn/web/mathml/element/semantics/index.md b/files/zh-cn/web/mathml/element/semantics/index.md
index 953f0d72d90919..c527903c1f1309 100644
--- a/files/zh-cn/web/mathml/element/semantics/index.md
+++ b/files/zh-cn/web/mathml/element/semantics/index.md
@@ -14,7 +14,8 @@ l10n:
默认情况下,`` 元素的第一个子元素会被渲染,而其他子元素的 [display](/zh-CN/docs/Web/CSS/display) 属性会被设置为 `none`。
-> **备注:** 旧版 MathML 规范允许渲染器根据可用的注释来决定默认呈现方式。以下规则用于确定可见子元素,且已在某些浏览器中实现。请参阅 [MathML 4](https://w3c.github.io/mathml/) 以了解表现(Presentation)MathML 和内容(Content)MathML 之间的区别。
+> [!NOTE]
+> 旧版 MathML 规范允许渲染器根据可用的注释来决定默认呈现方式。以下规则用于确定可见子元素,且已在某些浏览器中实现。请参阅 [MathML 4](https://w3c.github.io/mathml/) 以了解表现(Presentation)MathML 和内容(Content)MathML 之间的区别。
>
> - 如果没有其他规则适用:默认情况下只渲染第一个子元素,该元素应该是 表现 MathML。
> - 如果第一个子元素是除了 `` 或 `` 之外的表现 MathML 元素,则渲染第一个子元素。
diff --git a/files/zh-cn/web/mathml/fonts/index.md b/files/zh-cn/web/mathml/fonts/index.md
index 8987bdd5678cf0..f6f32487648815 100644
--- a/files/zh-cn/web/mathml/fonts/index.md
+++ b/files/zh-cn/web/mathml/fonts/index.md
@@ -24,7 +24,8 @@ l10n:
5. 打开 `static_otf.zip` ZIP 压缩文件,然后进入 `static_otf` 目录。在那里的文件中,你将找到一个 `STIXTwoMath-Regular` 文件。
6. 打开 `STIXTwoMath-Regular` 文件,然后点击**安装**按钮。如果需要,你也可以对目录中的其他字体文件执行相同操作。
-> **备注:** Windows 上默认安装了 _Cambria Math_ 字体,应该可以确保相对良好的 MathML 渲染效果。
+> [!NOTE]
+> Windows 上默认安装了 _Cambria Math_ 字体,应该可以确保相对良好的 MathML 渲染效果。
### macOS
@@ -34,7 +35,8 @@ l10n:
2. 解压缩 ZIP 文件,进入 `latinmodern-math-1959` 目录,然后进入 `otf` 目录。你将找到一个 `latinmodern-math` 字体文件。
3. 双击 `latinmodern-math` 字体文件,然后点击打开的窗口中的**安装字体**按钮。
-> **备注:** 如果你使用的是 macOS Ventura(版本 13)或更高版本,则已经预装 _STIX Two Math_,你可以跳过以下步骤。
+> [!NOTE]
+> 如果你使用的是 macOS Ventura(版本 13)或更高版本,则已经预装 _STIX Two Math_,你可以跳过以下步骤。
按照以下步骤安装 _STIX Two Math_ 字体:
@@ -42,7 +44,8 @@ l10n:
2. 打开 `static_otf.zip` ZIP 压缩文件,然后进入 `static_otf` 目录。在那里的文件中,你将找到一个 `STIXTwoMath-Regular.otf` 文件。
3. 打开 `STIXTwoMath-Regular.otf` 文件,然后点击打开的窗口中的**安装字体**按钮。如果需要,你也可以对目录中的其他字体文件执行相同操作。
-> **备注:** 自 OS X Lion(版本 10.7)开始,已预安装了 _STIX_ 的废弃版本。虽然一些浏览器可以使用它,但强烈建议按照上述说明进行操作以实现最佳的数学渲染效果。
+> [!NOTE]
+> 自 OS X Lion(版本 10.7)开始,已预安装了 _STIX_ 的废弃版本。虽然一些浏览器可以使用它,但强烈建议按照上述说明进行操作以实现最佳的数学渲染效果。
### Linux
@@ -109,7 +112,8 @@ fc-cache -sf
你必须使用 [MathML 字体插件](https://addons.mozilla.org/firefox/addon/mathml-fonts/)。
-> **备注:** Noto Sans Math 提供了良好的 Unicode 数学符号的覆盖,并且 [Google 计划添加数学布局特性的支持](https://github.com/notofonts/math/issues/14#issuecomment-1161414446)。
+> [!NOTE]
+> Noto Sans Math 提供了良好的 Unicode 数学符号的覆盖,并且 [Google 计划添加数学布局特性的支持](https://github.com/notofonts/math/issues/14#issuecomment-1161414446)。
### 其他系统
diff --git a/files/zh-cn/web/mathml/global_attributes/mathbackground/index.md b/files/zh-cn/web/mathml/global_attributes/mathbackground/index.md
index cb25f69f9efdeb..f197639768da3b 100644
--- a/files/zh-cn/web/mathml/global_attributes/mathbackground/index.md
+++ b/files/zh-cn/web/mathml/global_attributes/mathbackground/index.md
@@ -9,7 +9,8 @@ l10n:
**`mathbackground`** [全局属性](/zh-CN/docs/Web/MathML/Global_attributes)设置 MathML 元素的[背景颜色](/zh-CN/docs/Web/CSS/background-color)。
-> **备注:** 尽可能使用 CSS 来设置 MathML 的样式。`mathbackground` 属性应仅在不支持 CSS 并且将被 CSS `background-color` 属性值覆盖的应用程序中使用。
+> [!NOTE]
+> 尽可能使用 CSS 来设置 MathML 的样式。`mathbackground` 属性应仅在不支持 CSS 并且将被 CSS `background-color` 属性值覆盖的应用程序中使用。
## 语法
diff --git a/files/zh-cn/web/mathml/global_attributes/mathcolor/index.md b/files/zh-cn/web/mathml/global_attributes/mathcolor/index.md
index 8d5dc3eddade74..d7e0cceefa47ec 100644
--- a/files/zh-cn/web/mathml/global_attributes/mathcolor/index.md
+++ b/files/zh-cn/web/mathml/global_attributes/mathcolor/index.md
@@ -9,7 +9,8 @@ l10n:
**`mathbackground`** [全局属性](/zh-CN/docs/Web/MathML/Global_attributes)设置 MathML 元素的[颜色](/zh-CN/docs/Web/CSS/color)。
-> **备注:** 尽可能使用 CSS 来为 MathML 设置样式。`mathcolor` 属性应仅在不支持 CSS 并且将被 CSS `color` 属性值覆盖的应用程序中使用。
+> [!NOTE]
+> 尽可能使用 CSS 来为 MathML 设置样式。`mathcolor` 属性应仅在不支持 CSS 并且将被 CSS `color` 属性值覆盖的应用程序中使用。
## 语法
diff --git a/files/zh-cn/web/mathml/global_attributes/mathsize/index.md b/files/zh-cn/web/mathml/global_attributes/mathsize/index.md
index 7b1866b7351032..3df9e1e84c92a2 100644
--- a/files/zh-cn/web/mathml/global_attributes/mathsize/index.md
+++ b/files/zh-cn/web/mathml/global_attributes/mathsize/index.md
@@ -9,7 +9,8 @@ l10n:
**`mathsize`** [全局属性](/zh-CN/docs/Web/MathML/Global_attributes)设置 MathML 元素的[字体大小](/zh-CN/docs/Web/CSS/font-size)。
-> **备注:** 尽可能使用 CSS 对 MathML 进行样式设置。`mathsize` 属性只应包含在不支持 CSS 的应用程序中,并且如果设置的话,其将被 CSS `font-size` 属性值覆盖。
+> [!NOTE]
+> 尽可能使用 CSS 对 MathML 进行样式设置。`mathsize` 属性只应包含在不支持 CSS 的应用程序中,并且如果设置的话,其将被 CSS `font-size` 属性值覆盖。
## 语法
@@ -32,7 +33,8 @@ l10n:
- : 一个正的 {{cssxref("<percentage>")}} 值,相对于父元素的字体大小。
-> **备注:** 一些浏览器可能还接受[旧版 MathML 长度](/zh-CN/docs/Web/MathML/Values#旧版_mathml_长度)。
+> [!NOTE]
+> 一些浏览器可能还接受[旧版 MathML 长度](/zh-CN/docs/Web/MathML/Values#旧版_mathml_长度)。
## 规范
diff --git a/files/zh-cn/web/mathml/index.md b/files/zh-cn/web/mathml/index.md
index 532dd3fd199f73..a0c9127e543c54 100644
--- a/files/zh-cn/web/mathml/index.md
+++ b/files/zh-cn/web/mathml/index.md
@@ -15,7 +15,8 @@ l10n:
以下是有关 MathML 文档、示例和工具的链接。MDN 将 [MathML Core](https://w3c.github.io/mathml-core/) 用作参考规范,但由于不稳定的标准化历史,旧版 MathML 特性可能仍会出现在现有的实现和 Web 内容中。
-> **备注:** 强烈建议开发人员和作者切换到 MathML Core,或许依赖其他 Web 技术来满足缺失的用例。Math WG 正在维护一组 [MathML polyfill](https://github.com/mathml-refresh/mathml-polyfills) 以便促进这一过渡。
+> [!NOTE]
+> 强烈建议开发人员和作者切换到 MathML Core,或许依赖其他 Web 技术来满足缺失的用例。Math WG 正在维护一组 [MathML polyfill](https://github.com/mathml-refresh/mathml-polyfills) 以便促进这一过渡。
## MathML 参考文档
diff --git a/files/zh-cn/web/media/audio_and_video_delivery/adding_captions_and_subtitles_to_html5_video/index.md b/files/zh-cn/web/media/audio_and_video_delivery/adding_captions_and_subtitles_to_html5_video/index.md
index b16155878f6e1b..3b23a9d0c0195e 100644
--- a/files/zh-cn/web/media/audio_and_video_delivery/adding_captions_and_subtitles_to_html5_video/index.md
+++ b/files/zh-cn/web/media/audio_and_video_delivery/adding_captions_and_subtitles_to_html5_video/index.md
@@ -13,7 +13,8 @@ slug: Web/Media/Audio_and_video_delivery/Adding_captions_and_subtitles_to_HTML5_
![带有播放、停止、音量和字幕的开启和关闭控制按钮的播放器。正在播放的视频显示了一个男人手持长矛状武器的场景,标题为“Esta hoja tiene pasado oscuro”](video-player-with-captions.png)
-> **备注:** 你可以[查看 Github 源码](https://github.com/iandevlin/iandevlin.github.io/tree/master/mdn/video-player-with-captions),或者[浏览在线示例](https://iandevlin.github.io/mdn/video-player-with-captions/)。
+> [!NOTE]
+> 你可以[查看 Github 源码](https://github.com/iandevlin/iandevlin.github.io/tree/master/mdn/video-player-with-captions),或者[浏览在线示例](https://iandevlin.github.io/mdn/video-player-with-captions/)。
## HTML 和视频字幕
@@ -298,7 +299,8 @@ WebVTT 的一个不太为人所知和支持的功能是通过 [CSS 扩展](https
}
```
-> **备注:** 一些带有 ::cue 的提示语的样式目前在 Chrome、Opera 和 Safari 上可以使用,但在 Firefox 上还不行。
+> [!NOTE]
+> 一些带有 ::cue 的提示语的样式目前在 Chrome、Opera 和 Safari 上可以使用,但在 Firefox 上还不行。
## 浏览器兼容性
diff --git a/files/zh-cn/web/media/audio_and_video_delivery/buffering_seeking_time_ranges/index.md b/files/zh-cn/web/media/audio_and_video_delivery/buffering_seeking_time_ranges/index.md
index 927ee7ed6dbf89..5295f445987295 100644
--- a/files/zh-cn/web/media/audio_and_video_delivery/buffering_seeking_time_ranges/index.md
+++ b/files/zh-cn/web/media/audio_and_video_delivery/buffering_seeking_time_ranges/index.md
@@ -103,7 +103,8 @@ window.onload = () => {
![一个简单的音频播放器,带有播放按钮、搜索栏和音量控制,下面有一系列代表时间范围的红色矩形。](bufferedtimeranges.png)
-> **备注:** 你可以查看 [JS Bin 上实时运行的时间范围代码](https://jsbin.com/memazaro/1/edit)。
+> [!NOTE]
+> 你可以查看 [JS Bin 上实时运行的时间范围代码](https://jsbin.com/memazaro/1/edit)。
## Seekable
@@ -213,7 +214,8 @@ window.onload = () => {
![一个简单的音频播放器,带有播放按钮、搜索栏和音量控制,以及控件下方的进度条,其中的绿色部分显示已播放的视频,还有一个浅灰色的部分表示已缓冲的部分。](bufferedprogress.png)
-> **备注:** 你可以查看 [JS Bin 上实时运行的缓冲代码](https://jsbin.com/badimipi/1/edit)。
+> [!NOTE]
+> 你可以查看 [JS Bin 上实时运行的缓冲代码](https://jsbin.com/badimipi/1/edit)。
## 关于 Played 的简短说明
diff --git a/files/zh-cn/web/media/audio_and_video_delivery/live_streaming_web_audio_and_video/index.md b/files/zh-cn/web/media/audio_and_video_delivery/live_streaming_web_audio_and_video/index.md
index 4d0d1e137ce2bd..97b15bb47c302b 100644
--- a/files/zh-cn/web/media/audio_and_video_delivery/live_streaming_web_audio_and_video/index.md
+++ b/files/zh-cn/web/media/audio_and_video_delivery/live_streaming_web_audio_and_video/index.md
@@ -43,7 +43,8 @@ slug: Web/Media/Audio_and_video_delivery/Live_streaming_web_audio_and_video
### RTSP
-> **备注:** 实时流协议 (RTSP) 控制媒体在两端传输的会话,且同时使用实时传输协议 (RTP) 和实时控制协议 (RTCP) 来传输媒体流。将 RTP 与 RTCP 结合使用可以实现自适应流。目前大部分浏览器还无法原生支持,但请留意 [Firefox OS 1.3 支持 RTSP](https://www.mozilla.org/en-US/firefox/os/notes/1.3/)。
+> [!NOTE]
+> 实时流协议 (RTSP) 控制媒体在两端传输的会话,且同时使用实时传输协议 (RTP) 和实时控制协议 (RTCP) 来传输媒体流。将 RTP 与 RTCP 结合使用可以实现自适应流。目前大部分浏览器还无法原生支持,但请留意 [Firefox OS 1.3 支持 RTSP](https://www.mozilla.org/en-US/firefox/os/notes/1.3/)。
>
> 某些厂商实现了专有的传输协议,类似 RealNetworks 以及他们的真实数据传输 (RDT)。
@@ -51,7 +52,8 @@ slug: Web/Media/Audio_and_video_delivery/Live_streaming_web_audio_and_video
RTSP 2.0 目前处于开发阶段,并且无法向后兼容 RTSP 1.0。
-> **警告:** 虽然 {{ htmlelement("audio") }} 与 {{ htmlelement("video") }} 标签与协议无关,但是目前没有浏览器可以在无插件的情况下支持除了 HTTP 外的协议,尽管这种局面可能会有所转变,但除了 HTTP 以外的协议可能会被防火墙或代理服务器拦截。
+> [!WARNING]
+> 虽然 {{ htmlelement("audio") }} 与 {{ htmlelement("video") }} 标签与协议无关,但是目前没有浏览器可以在无插件的情况下支持除了 HTTP 外的协议,尽管这种局面可能会有所转变,但除了 HTTP 以外的协议可能会被防火墙或代理服务器拦截。
## 使用流式协议
@@ -71,19 +73,22 @@ RTSP 2.0 目前处于开发阶段,并且无法向后兼容 RTSP 1.0。
比如,[在卸载 MSE 解码器后,你可以通过 JavaScript 实现 MPEG-DASH](https://web.archive.org/web/20170504035455/https://msopentech.com/blog/2014/01/03/streaming_video_player/).
-> **备注:** 时移是在直播流发生后使用实时流的过程。
+> [!NOTE]
+> 时移是在直播流发生后使用实时流的过程。
## 视频流文件格式
一些基于 HTTP 的实时流视频格式开始得到跨浏览器支持。
-> **备注:** 你可以通过 [设置自适应流媒体源](/zh-CN/docs/Web/Guide/Audio_and_video_delivery/Setting_up_adaptive_streaming_media_sources) 找到在 web 中使用的 HLS 和 MPEG-DASH 的编码指南。
+> [!NOTE]
+> 你可以通过 [设置自适应流媒体源](/zh-CN/docs/Web/Guide/Audio_and_video_delivery/Setting_up_adaptive_streaming_media_sources) 找到在 web 中使用的 HLS 和 MPEG-DASH 的编码指南。
### MPEG-DASH
DASH 意即基于 HTTP 的动态自适应流,最近已经被 Chrome、以及运行在 Window 8.1 的 IE 11 浏览器所支持。它依赖于媒体源扩展 (MSE),这些扩展被[DASH.js](https://github.com/Dash-Industry-Forum/dash.js/)之类的 JavaScript 库所使用。这种方式允许我们通过 XHR 下载视频流的数据块,并且将它“添加”到 {{ htmlelement("video") }}元素正在播放的流中。正因如此,如果我们检测到网络缓慢,我们可以从下一段开始请求低质量(较小)的数据块。这种技术也允许添加广告片段到流中。
-> **备注:** 你也可以 [将 MPEG-DASH 自适应流式系统与 WebM 一起使用](http://wiki.webmproject.org/adaptive-streaming/webm-dash-specification).
+> [!NOTE]
+> 你也可以 [将 MPEG-DASH 自适应流式系统与 WebM 一起使用](http://wiki.webmproject.org/adaptive-streaming/webm-dash-specification).
### HLS
@@ -129,13 +134,15 @@ Opus 是一个无版权的开放格式,针对不同类型文件使用不同的
目前,Opus 被桌面端和移动端的 Firefox 以及桌面端的 Chrome 和 Opera 浏览器所支持。
-> **备注:** 对于浏览器端实现 WebRTC 功能来说,[Opus 是必须要用到的格式](https://datatracker.ietf.org/doc/html/draft-ietf-rtcweb-audio-05)。
+> [!NOTE]
+> 对于浏览器端实现 WebRTC 功能来说,[Opus 是必须要用到的格式](https://datatracker.ietf.org/doc/html/draft-ietf-rtcweb-audio-05)。
### MP3, AAC, Ogg Vorbis
大部分通用的音频格式能够通过特殊的服务端技术进行传输。
-> **备注:** 相对于视频来说,音频没有键帧,可能更容易通过非流式格式来传输。
+> [!NOTE]
+> 相对于视频来说,音频没有键帧,可能更容易通过非流式格式来传输。
## 服务端流式技术
@@ -159,7 +166,8 @@ GStreamer 的插件如 [souphttpclientsink](https://gstreamer.freedesktop.org/da
[Icecast](https://www.icecast.org/) 服务是一种针对流式媒体的开源技术。它由 [Xiph.org Foundation](https://www.xiph.org/) 进行维护,通过 SHOUTcast 协议来传输 Ogg Vorbis/Theora 以及 MP3 和 AAC 格式。
-> **备注:** SHOUTcast 和 Icecast 是最流行的已确立的技术之一,但也有 [更多流媒体系统可用](https://en.wikipedia.org/wiki/List_of_streaming_media_systems#Servers).
+> [!NOTE]
+> SHOUTcast 和 Icecast 是最流行的已确立的技术之一,但也有 [更多流媒体系统可用](https://en.wikipedia.org/wiki/List_of_streaming_media_systems#Servers).
### 流式服务
diff --git a/files/zh-cn/web/media/audio_and_video_manipulation/index.md b/files/zh-cn/web/media/audio_and_video_manipulation/index.md
index 66e098a4f9282b..00605ebf78f023 100644
--- a/files/zh-cn/web/media/audio_and_video_manipulation/index.md
+++ b/files/zh-cn/web/media/audio_and_video_manipulation/index.md
@@ -115,7 +115,8 @@ processor.doLoad();
你还可通过在源 `` 元素中采用 {{cssxref("filter-function/grayscale", "grayscale()")}} CSS 功能以达到同样的效果。
-> **备注:** 由于存在潜在安全问题,如果你的视频和代码处在不同域,你需要在视频服务器上启用 [CORS(跨源资源共享)](/zh-CN/docs/Web/HTTP/CORS)。
+> [!NOTE]
+> 由于存在潜在安全问题,如果你的视频和代码处在不同域,你需要在视频服务器上启用 [CORS(跨源资源共享)](/zh-CN/docs/Web/HTTP/CORS)。
### 视频与 WebGL
@@ -123,7 +124,8 @@ processor.doLoad();
{{EmbedGHLiveSample('dom-examples/webgl-examples/tutorial/sample8/index.html', 670, 510) }}
-> **备注:** 你可在 [GitHub 上找到演示的源代码](https://github.com/mdn/dom-examples/tree/main/webgl-examples/tutorial/sample8)([查看在线演示](https://mdn.github.io/dom-examples/webgl-examples/tutorial/sample8/))。
+> [!NOTE]
+> 你可在 [GitHub 上找到演示的源代码](https://github.com/mdn/dom-examples/tree/main/webgl-examples/tutorial/sample8)([查看在线演示](https://mdn.github.io/dom-examples/webgl-examples/tutorial/sample8/))。
### 播放速度
@@ -193,7 +195,8 @@ window.addEventListener("load", setPlaybackRate);
{{ EmbedLiveSample('可编辑示例', 700, 450) }}
-> **备注:** 尝试在线的 [playbackRate 示例](https://jsbin.com/qomuvefu/2/edit)。
+> [!NOTE]
+> 尝试在线的 [playbackRate 示例](https://jsbin.com/qomuvefu/2/edit)。
## 音频处理
@@ -297,7 +300,8 @@ window.addEventListener("load", setFilter);
{{ EmbedLiveSample('可编辑示例_2', 700, 450) }}
-> **备注:** 除非你启用了 [CORS](/zh-CN/docs/Web/HTTP/CORS),否则,为避免安全问题,你的视频应与你的代码处于同一个域中。
+> [!NOTE]
+> 除非你启用了 [CORS](/zh-CN/docs/Web/HTTP/CORS),否则,为避免安全问题,你的视频应与你的代码处于同一个域中。
#### 常用音频滤镜
@@ -312,7 +316,8 @@ window.addEventListener("load", setFilter);
- 陷波(Notch):允许所有频率的信号通过,但一组频率除外。
- 全通(All Pass):允许所有频率的信号通过,但改变个频率之间的相位关系。
-> **备注:** 参见 {{domxref("BiquadFilterNode")}} 以了解详情。
+> [!NOTE]
+> 参见 {{domxref("BiquadFilterNode")}} 以了解详情。
### 卷积和脉冲
@@ -350,7 +355,8 @@ source.start(0);
context.listener.setPosition(0, 0, 0);
```
-> **备注:** 你可以在 [GitHub 仓库中找到示例](https://github.com/mdn/webaudio-examples/tree/master/panner-node)(也可以[查看在线演示](https://mdn.github.io/webaudio-examples/panner-node/))。
+> [!NOTE]
+> 你可以在 [GitHub 仓库中找到示例](https://github.com/mdn/webaudio-examples/tree/master/panner-node)(也可以[查看在线演示](https://mdn.github.io/webaudio-examples/panner-node/))。
### JavaScript 编解码器
@@ -365,7 +371,8 @@ context.listener.setPosition(0, 0, 0);
- Opus:[Opus.js](https://github.com/audiocogs/opus.js)
- Vorbis:[vorbis.js](https://github.com/audiocogs/vorbis.js)
-> **备注:** 你可以在 Audiocogs [尝试一些演示](http://audiocogs.org/codecs/);Audiocogs 还提供了一个框架——[Aurora.js](http://audiocogs.org/codecs/),旨在帮助你使用 JavaScript 创建自己的编解码器。
+> [!NOTE]
+> 你可以在 Audiocogs [尝试一些演示](http://audiocogs.org/codecs/);Audiocogs 还提供了一个框架——[Aurora.js](http://audiocogs.org/codecs/),旨在帮助你使用 JavaScript 创建自己的编解码器。
## 示例
diff --git a/files/zh-cn/web/media/autoplay_guide/index.md b/files/zh-cn/web/media/autoplay_guide/index.md
index 37ecff700757ad..32cf71b853db6c 100644
--- a/files/zh-cn/web/media/autoplay_guide/index.md
+++ b/files/zh-cn/web/media/autoplay_guide/index.md
@@ -45,7 +45,8 @@ audioElement.play();
详情,请参阅 [Google Chrome](https://developers.google.com/web/updates/2017/09/autoplay-policy-changes) 和 [WebKit](https://webkit.org/blog/7734/auto-play-policy-changes-for-macos/) 的自动播放政策。
-> **备注:** 换句话说,如果在尚无任何用户交互的页面中通过编程方式启动播放,则通常会阻止任何包含音频在内的媒体的播放。
+> [!NOTE]
+> 换句话说,如果在尚无任何用户交互的页面中通过编程方式启动播放,则通常会阻止任何包含音频在内的媒体的播放。
## 能自动播放的媒体元素
@@ -101,13 +102,15 @@ function handleFirstPlay(event) {
此时,你的网站或应用程序可以开始执行依赖于视频启动的任何操作。
-> **备注:** 此方法不区分自动播放和用户手动开始播放。
+> [!NOTE]
+> 此方法不区分自动播放和用户手动开始播放。
### play() 方法
术语“自动播放”还指脚本尝试在处理用户输入事件的上下文之外触发包含音频的媒体播放的场景。这是通过调用媒体元素的 {{domxref("HTMLMediaElement.play", "play()")}} 方法来完成的。
-> **备注:** 强烈建议你尽可能使用 `autoplay` 属性,因为 `autoplay` 属性对自动播放首选项的支持比其他自动播放媒体的方式更广泛。它还让浏览器负责开始播放,并优化播放的时间。
+> [!NOTE]
+> 强烈建议你尽可能使用 `autoplay` 属性,因为 `autoplay` 属性对自动播放首选项的支持比其他自动播放媒体的方式更广泛。它还让浏览器负责开始播放,并优化播放的时间。
#### 示例:播放视频
@@ -159,7 +162,8 @@ if (startPlayPromise !== undefined) {
你还可以指定 `'none'` 以完全禁用自动播放,`'*'` 以允许来自所有域的自动播放,或指定一个或多个可以自动播放媒体的特定来源。这些来源由空格字符分隔。
-> **备注:** 指定的功能策略适用于文档以及嵌套在其中的每个 {{HTMLElement("iframe")}},除非这些框架包含为该框架以及嵌套在其中的所有框架设置新的功能策略的 [`allow`](/zh-CN/docs/Web/HTML/Element/iframe#allow)。
+> [!NOTE]
+> 指定的功能策略适用于文档以及嵌套在其中的每个 {{HTMLElement("iframe")}},除非这些框架包含为该框架以及嵌套在其中的所有框架设置新的功能策略的 [`allow`](/zh-CN/docs/Web/HTML/Element/iframe#allow)。
当使用 `
-> **备注:** 与 WebP 和 AVIF 等较新的格式相比,PNG、JPEG 和 GIF 等较老的格式性能较差,但却能获得更广泛的“历史”浏览器支持。较新的图像格式越来越受欢迎,因为不支持这些格式的浏览器变得越来越无关紧要(即市场份额几乎为零)。
+> [!NOTE]
+> 与 WebP 和 AVIF 等较新的格式相比,PNG、JPEG 和 GIF 等较老的格式性能较差,但却能获得更广泛的“历史”浏览器支持。较新的图像格式越来越受欢迎,因为不支持这些格式的浏览器变得越来越无关紧要(即市场份额几乎为零)。
下面列出了 web 上出现的图像格式,但 web 内容应避免使用这些格式(通常是因为这些格式没有广泛的浏览器支持,或者有更好的替代格式)。
@@ -146,9 +147,11 @@ slug: Web/Media/Formats/Image_types
-> **备注:** 每种图像格式的缩写可链接到有关该格式的较长描述、其功能和详细的浏览器兼容性信息(包括哪些版本引入了支持以及后来可能引入的特定特殊功能)。
+> [!NOTE]
+> 每种图像格式的缩写可链接到有关该格式的较长描述、其功能和详细的浏览器兼容性信息(包括哪些版本引入了支持以及后来可能引入的特定特殊功能)。
-> **备注:** Safari 11.1 新增了使用视频格式替代 gif 动画的功能,而其他浏览器没有添加这方面的支持。详见 [Chromium bug](https://crbug.com/791658) 和 [Firefox bug](https://bugzil.la/895131) 以了解更多信息。
+> [!NOTE]
+> Safari 11.1 新增了使用视频格式替代 gif 动画的功能,而其他浏览器没有添加这方面的支持。详见 [Chromium bug](https://crbug.com/791658) 和 [Firefox bug](https://bugzil.la/895131) 以了解更多信息。
## 图像文件类型详介
@@ -258,7 +261,8 @@ APNG 适用于无需与其他活动或音轨同步的基本动画,如进度指
AV1 图像文件格式(AVIF)是一种功能强大、开源、免版税的文件格式,它在高效图像文件格式(HEIF)容器中对 AV1 比特流进行编码。
-> **备注:** AVIF 有可能成为在 web 内容中共享图像的“下一件大事”。它具有最先进的特性和性能,却没有阻碍同类替代产品发展的复杂许可和专利使用费的束缚。
+> [!NOTE]
+> AVIF 有可能成为在 web 内容中共享图像的“下一件大事”。它具有最先进的特性和性能,却没有阻碍同类替代产品发展的复杂许可和专利使用费的束缚。
AV1 是一种编码格式,最初设计用于在互联网上传输视频。该格式得益于近年来视频编码技术的长足进步,并有可能受益于对硬件渲染的相关支持。不过,在某些情况下它也有缺点,因为视频和图像编码有一些不同的要求。
@@ -351,7 +355,8 @@ Chrome、Opera、Safari 和 Firefox 支持 AVIF(Firefox 支持静态图像,
**BMP**(**位图图像**)文件类型在 Windows 计算机上最为常见,一般只用于 web 应用程序和内容中的特殊情况。
-> **警告:** 网站内容通常应避免使用 BMP 文件。最常见的 BMP 文件格式将数据表示为未压缩的光栅图像,与 png 或 jpg 图像类型相比,文件大小较大。目前有更高效的 BMP 格式,但并未广泛使用,web 浏览器也很少支持。
+> [!WARNING]
+> 网站内容通常应避免使用 BMP 文件。最常见的 BMP 文件格式将数据表示为未压缩的光栅图像,与 png 或 jpg 图像类型相比,文件大小较大。目前有更高效的 BMP 格式,但并未广泛使用,web 浏览器也很少支持。
BMP 理论上支持多种内部数据表示。最简单也是最常用的 BMP 文件形式是一种未压缩的光栅图像,每个像素占 3 个字节,分别代表其红、绿、蓝三部分,每行用 `0x00` 字节填充,宽度为 4 字节的倍数。
@@ -555,7 +560,8 @@ ICO(Microsoft Windows 图标)文件格式是微软为 Windows 系统的桌
一个 ICO 文件可以包含多个图标,文件开头有一个目录,列出每个图标的详细信息。目录之后是图标的数据。每个图标的数据既可以是不带文件头的 [BMP](#bmp(位图文件)) 图像,也可以是完整的 [PNG](#png(便携式网络图形)) 图像(包括文件头)。如果使用 ICO 文件,则应使用 BMP 格式,因为直到 Windows Vista 才添加了对 ICO 文件内的 PNG 的支持,而且这种支持可能并不完善。
-> **警告:** ICO 文件*不应*用于网页内容。此外,如[为不同的使用环境提供图标](/zh-CN/docs/Web/HTML/Element/link#提供用于不同用法上下文的图标)所述,它们作为网站图标的使用已经减少,转而使用 PNG 文件和 {{HTMLElement("link")}} 元素。
+> [!WARNING]
+> ICO 文件*不应*用于网页内容。此外,如[为不同的使用环境提供图标](/zh-CN/docs/Web/HTML/Element/link#提供用于不同用法上下文的图标)所述,它们作为网站图标的使用已经减少,转而使用 PNG 文件和 {{HTMLElement("link")}} 元素。
@@ -1255,7 +1261,8 @@ WebP 目前已在主要网络浏览器的最新版本中获得广泛支持,但
-> **备注:** 在 macOS 版 Safari 上,WebP 支持取决于 Safari 和 macOS 的版本。你需要 Safari 14 或更高版本,以及 macOS Big Sur (11) 或更高版本。
+> [!NOTE]
+> 在 macOS 版 Safari 上,WebP 支持取决于 Safari 和 macOS 的版本。你需要 Safari 14 或更高版本,以及 macOS Big Sur (11) 或更高版本。
### XBM(X Window 系统位图文件)
diff --git a/files/zh-cn/web/media/formats/video_codecs/index.md b/files/zh-cn/web/media/formats/video_codecs/index.md
index 8f1856d7a76939..7a0311aec99e88 100644
--- a/files/zh-cn/web/media/formats/video_codecs/index.md
+++ b/files/zh-cn/web/media/formats/video_codecs/index.md
@@ -1745,7 +1745,8 @@ VP9 被浏览器广泛支持,并且编解码器的硬件实现相当普遍。V
```
-> **备注:** 无论 {{HTMLElement("video")}} 元素中是否有任何 {{HTMLElement("source")}} 元素,{{HTMLElement("video")}} 元素都是需要闭合的 `` 标签。
+> [!NOTE]
+> 无论 {{HTMLElement("video")}} 元素中是否有任何 {{HTMLElement("source")}} 元素,{{HTMLElement("video")}} 元素都是需要闭合的 `` 标签。
### 高质量视频演示的建议
diff --git a/files/zh-cn/web/performance/css_javascript_animation_performance/index.md b/files/zh-cn/web/performance/css_javascript_animation_performance/index.md
index 158e0877c3730e..1543c23bd55ab2 100644
--- a/files/zh-cn/web/performance/css_javascript_animation_performance/index.md
+++ b/files/zh-cn/web/performance/css_javascript_animation_performance/index.md
@@ -20,7 +20,8 @@ CSS 中的 transition 和 animation 都可以用于编写动画,它们都有
{{domxref("Window.requestAnimationFrame","requestAnimationFrame()")}} 提供了一种用 JavaScript 代码制作动画的高效方式。本方法的回调函数在绘制下一帧之前由浏览器调用。与需要一个延迟参数的 {{domxref("setTimeout()")}} 或 {{domxref("setInterval()")}} 相比,`requestAnimationFrame()` 效率高得多。开发人员可以在 `requestAnimationFrame()` 回调函数中通过简单地改变元素的样式(或者更新画布绘制,等等)来创建动画。
-> **备注:** 像 CSS transitions 和 animations 一样,当页面在后台运行时,`requestAnimationFrame()` 会暂停。
+> [!NOTE]
+> 像 CSS transitions 和 animations 一样,当页面在后台运行时,`requestAnimationFrame()` 会暂停。
更多细节请阅读 [animating with JavaScript from setinterval to requestAnimationFrame](https://hacks.mozilla.org/2011/08/animating-with-javascript-from-setinterval-to-requestanimationframe/).
@@ -175,7 +176,8 @@ function animate(time) {
激活之后,再次运行上面的例子。可以看到 CSS 动画的帧速率现在高多了。
-> **备注:** 在 Nightly 和 Developer 版本,你可能看到 OMTA 是默认激活的,所以你需要反过来测试(先测试激活 OMTA 的情况,然后是没有激活的情况)。
+> [!NOTE]
+> 在 Nightly 和 Developer 版本,你可能看到 OMTA 是默认激活的,所以你需要反过来测试(先测试激活 OMTA 的情况,然后是没有激活的情况)。
## 总结
diff --git a/files/zh-cn/web/performance/dns-prefetch/index.md b/files/zh-cn/web/performance/dns-prefetch/index.md
index 4e36e573c680ae..a484e3e056a5c5 100644
--- a/files/zh-cn/web/performance/dns-prefetch/index.md
+++ b/files/zh-cn/web/performance/dns-prefetch/index.md
@@ -56,7 +56,8 @@ Link:
; rel=dns-prefetch
```
-> **备注:** 如果页面需要建立与许多第三方域的连接,则将它们预先连接会适得其反。`preconnect` 提示最好仅用于最关键的连接。对于其他的连接,只需使用 `
` 即可节省第一步——DNS 查询——的时间。
+> [!NOTE]
+> 如果页面需要建立与许多第三方域的连接,则将它们预先连接会适得其反。`preconnect` 提示最好仅用于最关键的连接。对于其他的连接,只需使用 `
` 即可节省第一步——DNS 查询——的时间。
配对这些提示的逻辑是因为对 dns-prefetch 的支持比对预连接的支持要好。不支持预连接的浏览器仍然可以通过回退到 dns-prefetch 来获得更多好处。由于这是 HTML 特性,因此容错性很强。如果不支持的浏览器遇到 dns-prefetch 提示(或任何其他资源提示),则网站不会中断,只是不会获得它提供的好处。
diff --git a/files/zh-cn/web/privacy/privacy_sandbox/partitioned_cookies/index.md b/files/zh-cn/web/privacy/privacy_sandbox/partitioned_cookies/index.md
index bfcd13c801dc0f..54ed519aec91ba 100644
--- a/files/zh-cn/web/privacy/privacy_sandbox/partitioned_cookies/index.md
+++ b/files/zh-cn/web/privacy/privacy_sandbox/partitioned_cookies/index.md
@@ -32,7 +32,8 @@ l10n:
Set-Cookie: __Host-example=34d8g; SameSite=None; Secure; Path=/; Partitioned;
```
-> **备注:** 分区 cookie 必须与 `Secure` 一同设置。此外,建议在设置分区 cookie 时使用 `__Host` 前缀,以将它们绑定到主机名而不是可注册的域名。
+> [!NOTE]
+> 分区 cookie 必须与 `Secure` 一同设置。此外,建议在设置分区 cookie 时使用 `__Host` 前缀,以将它们绑定到主机名而不是可注册的域名。
如果设置了 `Partitioned`,cookie 将使用两个键进行存储,即主机键和一个新的**分区键**。分区键基于向设置 cookie 的 URL 端点发出请求时浏览器访问的顶级 URL 的方案(scheme)和 {{Glossary("eTLD", "eTLD +1")}}。
@@ -42,7 +43,8 @@ Set-Cookie: __Host-example=34d8g; SameSite=None; Secure; Path=/; Partitioned;
2. 存储 cookie 的键现在为 `{("https://site-a.example"), ("3rd-party.example")}`。
3. 当用户访问 `https://site-b.example`,该站点也嵌入了 `https://3rd-party.example`,因为分区键不一致,所以新嵌入的实例不再能够访问前一页面设置的 cookie。
-> **备注:** CHIPS 类似于 Firefox 实现的[状态分区机制](/zh-CN/docs/Web/Privacy/State_Partitioning)。不同之处在于,状态分区将 cookie 存储和检索分区到每个顶级站点的单独的 cookie 存储空间中,而没有在需要时可以选择启用第三方 cookie 的机制。随着浏览器开始逐步淘汰第三方 cookie 的使用,当开发人员开始处理此更改时,仍然需要允许第三方 cookie 的有效和非跟踪的使用。
+> [!NOTE]
+> CHIPS 类似于 Firefox 实现的[状态分区机制](/zh-CN/docs/Web/Privacy/State_Partitioning)。不同之处在于,状态分区将 cookie 存储和检索分区到每个顶级站点的单独的 cookie 存储空间中,而没有在需要时可以选择启用第三方 cookie 的机制。随着浏览器开始逐步淘汰第三方 cookie 的使用,当开发人员开始处理此更改时,仍然需要允许第三方 cookie 的有效和非跟踪的使用。
## 有效的第三方嵌入场景
diff --git a/files/zh-cn/web/progressive_web_apps/guides/caching/index.md b/files/zh-cn/web/progressive_web_apps/guides/caching/index.md
index 1b8f59424d4dec..2fb2969e077ced 100644
--- a/files/zh-cn/web/progressive_web_apps/guides/caching/index.md
+++ b/files/zh-cn/web/progressive_web_apps/guides/caching/index.md
@@ -46,7 +46,8 @@ PWA 可以在任何时候缓存资源,但在实践中,大多数 PWA 选择
- **在 service worker 的 `install` 事件处理程序中(预缓存)**:当 service worker 被安装时,浏览器会在 service worker 的全局作用域中触发一个名为 {{domxref("ServiceWorkerGlobalScope.install_event", "install")}} 的事件。此时,service worker 可以*预缓存*资源,从网络获取它们并将它们存储在缓存中。
- > **备注:** service worker 的安装时间与 PWA 的安装时间不同。一个 service worker 的 `install` 事件会在 service worker 被下载和执行后立即触发,这通常会发生在用户首次访问你的网站时。
+ > [!NOTE]
+ > service worker 的安装时间与 PWA 的安装时间不同。一个 service worker 的 `install` 事件会在 service worker 被下载和执行后立即触发,这通常会发生在用户首次访问你的网站时。
>
> 即使用户从未将你的网站安装为 PWA,其 service worker 也会被安装和激活。
diff --git a/files/zh-cn/web/progressive_web_apps/guides/offline_and_background_operation/index.md b/files/zh-cn/web/progressive_web_apps/guides/offline_and_background_operation/index.md
index f7f7d3cc6e7be5..0336d8f4f67905 100644
--- a/files/zh-cn/web/progressive_web_apps/guides/offline_and_background_operation/index.md
+++ b/files/zh-cn/web/progressive_web_apps/guides/offline_and_background_operation/index.md
@@ -116,7 +116,8 @@ self.addEventListener("fetch", (event) => {
这意味着在许多情况下,即使网络连接不稳定,Web 应用程序也能正常运行。从主应用程序代码的角度来看,这完全是透明的:应用程序只需发出网络请求并获取响应。此外,由于 service worker 在单独的线程中运行,主应用程序代码可以保持对用户输入的响应,同时获取和缓存资源。
-> **备注:** 这里描述的策略只是 service worker 实现缓存的一种方式。具体来说,在缓存优先策略中,我们先从缓存中查找响应,然后再尝试从网络中获取,这意味着我们更有可能返回一个快速的响应而无需承担网络成本,但也更有可能返回一个过期的响应。
+> [!NOTE]
+> 这里描述的策略只是 service worker 实现缓存的一种方式。具体来说,在缓存优先策略中,我们先从缓存中查找响应,然后再尝试从网络中获取,这意味着我们更有可能返回一个快速的响应而无需承担网络成本,但也更有可能返回一个过期的响应。
>
> 另一种策略是*网络优先*策略,即首先尝试从服务器获取资源,如果设备离线,则回退到缓存。
>
diff --git a/files/zh-cn/web/progressive_web_apps/tutorials/cycletracker/secure_connection/index.md b/files/zh-cn/web/progressive_web_apps/tutorials/cycletracker/secure_connection/index.md
index ee9503dc41147f..7986b33d0df97a 100644
--- a/files/zh-cn/web/progressive_web_apps/tutorials/cycletracker/secure_connection/index.md
+++ b/files/zh-cn/web/progressive_web_apps/tutorials/cycletracker/secure_connection/index.md
@@ -21,7 +21,8 @@ Service worker 以及 PWA,都[被限制在安全上下文中](/zh-CN/docs/Web/
我们正在使用 `file://` 协议查看我们的页面。这适用于我们代码库的当前状态,并且在我们[添加 JavaScript 功能](/zh-CN/docs/Web/Progressive_web_apps/Tutorials/CycleTracker/JavaScript_functionality)之后将继续适用。然而,就像许多其他 API 一样,清单文件和 service worker(都是 PWA 的要求)需要安全连接。PWA 需要通过基于 `https` 的 web 服务器或使用 `localhost`、`127.0.0.1`(无论是否带有端口号)的本地开发环境来提供。如果我们使用 `files://` 协议查看我们完成的应用,我们的[清单文件](/zh-CN/docs/Web/Progressive_web_apps/Tutorials/CycleTracker/Manifest_file)将被忽略,任何我们添加的 [service worker](/zh-CN/docs/Web/Progressive_web_apps/Tutorials/CycleTracker/Service_workers) 都将失败。
-> **备注:** 通过 `https` 提供你的应用不仅对 PWA 有益,而且对所有网站有益,因为它确保了在你的 web 服务器和用户的浏览器之间传输的信息是端到端加密的。许多 [Web API 需要安全上下文](/zh-CN/docs/Web/Security/Secure_Contexts/features_restricted_to_secure_contexts)。即使你没有创建可安装的 PWA,当你向任何 web 应用添加特性时,你都可能会遇到需要安全上下文的情况。
+> [!NOTE]
+> 通过 `https` 提供你的应用不仅对 PWA 有益,而且对所有网站有益,因为它确保了在你的 web 服务器和用户的浏览器之间传输的信息是端到端加密的。许多 [Web API 需要安全上下文](/zh-CN/docs/Web/Security/Secure_Contexts/features_restricted_to_secure_contexts)。即使你没有创建可安装的 PWA,当你向任何 web 应用添加特性时,你都可能会遇到需要安全上下文的情况。
我们需要一个本地开发环境来完成教程。[使 PWA 可安装](/zh-CN/docs/Web/Progressive_web_apps/Guides/Making_PWAs_installable)的一部分是安全服务器。文件需要在 web 上通过安全连接提供,以获取 PWA 提供的好处,并将我们的应用程序作为 PWA 分发。
@@ -63,7 +64,8 @@ ws --https
在上面的命令中,你可能需要在 install 前加上 `sudo`。
-> **备注:** 如果你正在追求隐私,请意识到你正在自己构建此 PWA,它可以从自己的开发环境中安装在自己的机器上,而无需访问互联网。这个应用程序没有跟踪。这是一个尽可能私密的应用程序。
+> [!NOTE]
+> 如果你正在追求隐私,请意识到你正在自己构建此 PWA,它可以从自己的开发环境中安装在自己的机器上,而无需访问互联网。这个应用程序没有跟踪。这是一个尽可能私密的应用程序。
## 安全的外部服务器
diff --git a/files/zh-cn/web/progressive_web_apps/tutorials/js13kgames/installable_pwas/index.md b/files/zh-cn/web/progressive_web_apps/tutorials/js13kgames/installable_pwas/index.md
index e1f94952bc27d1..a85d5889a61ac0 100644
--- a/files/zh-cn/web/progressive_web_apps/tutorials/js13kgames/installable_pwas/index.md
+++ b/files/zh-cn/web/progressive_web_apps/tutorials/js13kgames/installable_pwas/index.md
@@ -30,7 +30,8 @@ slug: Web/Progressive_web_apps/Tutorials/js13kGames/Installable_PWAs
```
-> **备注:** 这类清单文件有一些曾经常被使用的扩展名:`manifest.webapp` 在 Firefox OS 应用清单中很流行,而许多人使用 `manifest.json` 作为网页清单(因为内容是 JSON 格式的)。但是,`.webmanifest` 扩展名是在 [W3C 清单规范](https://w3c.github.io/manifest/)中显式指定的,所以这里我们使用这个扩展名。
+> [!NOTE]
+> 这类清单文件有一些曾经常被使用的扩展名:`manifest.webapp` 在 Firefox OS 应用清单中很流行,而许多人使用 `manifest.json` 作为网页清单(因为内容是 JSON 格式的)。但是,`.webmanifest` 扩展名是在 [W3C 清单规范](https://w3c.github.io/manifest/)中显式指定的,所以这里我们使用这个扩展名。
文件的内容是这个样子的:
diff --git a/files/zh-cn/web/security/practical_implementation_guides/index.md b/files/zh-cn/web/security/practical_implementation_guides/index.md
index 05e68968c69b21..95efef637237a5 100644
--- a/files/zh-cn/web/security/practical_implementation_guides/index.md
+++ b/files/zh-cn/web/security/practical_implementation_guides/index.md
@@ -5,7 +5,8 @@ slug: Web/Security/Practical_implementation_guides
你可以采取一些措施来确保你的网站安全。本文提供了各种建议,以及提供更多有用信息的其他文章的链接。
-> **备注:** 本篇文章仍未撰写完毕,遵循它的指引不一定能保证你的站点完全安全。
+> [!NOTE]
+> 本篇文章仍未撰写完毕,遵循它的指引不一定能保证你的站点完全安全。
## 用户信息安全
diff --git a/files/zh-cn/web/security/same-origin_policy/index.md b/files/zh-cn/web/security/same-origin_policy/index.md
index 1af5638b099388..2e3cba947e3c8c 100644
--- a/files/zh-cn/web/security/same-origin_policy/index.md
+++ b/files/zh-cn/web/security/same-origin_policy/index.md
@@ -39,7 +39,8 @@ slug: Web/Security/Same-origin_policy
## 源的更改
-> **警告:** 这里描述的方法(使用 {{domxref("document.domain")}} setter)已被弃用,因为它破坏了同源策略所提供的安全保护,并使浏览器中的源模型复杂化,导致互操作性问题和安全漏洞。
+> [!WARNING]
+> 这里描述的方法(使用 {{domxref("document.domain")}} setter)已被弃用,因为它破坏了同源策略所提供的安全保护,并使浏览器中的源模型复杂化,导致互操作性问题和安全漏洞。
满足某些限制条件的情况下,页面是可以修改它的源。脚本可以将 {{domxref("document.domain")}} 的值设置为其当前域或其当前域的父域。如果将其设置为其当前域的父域,则这个较短的父域将用于后续源检查。
@@ -55,7 +56,8 @@ document.domain = "company.com";
该机制有一些局限性。如果启用了 [`document-domain`](/zh-CN/docs/Web/HTTP/Headers/Permissions-Policy/document-domain) [`Permissions-Policy`](/zh-CN/docs/Web/HTTP/Headers/Permissions-Policy),或该文档在沙箱 [`