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'). diff --git a/files/fr/web/html/element/input/date/index.md b/files/fr/web/html/element/input/date/index.md index 188be12a780398..cd221fb8bd3346 100644 --- a/files/fr/web/html/element/input/date/index.md +++ b/files/fr/web/html/element/input/date/index.md @@ -138,7 +138,7 @@ On ne peut donc ici que sélectionner une date en avril 2017. Seule la partie du ### Contrôler la taille du champ de saisie -`` ne permet pas d'utiliser des attributs de dimensionnement tels que [`size`](/fr/docs/Web/HTML/Element/Input#attr-size). Il est nécessaire d'utiliser [CSS](/fr/docs/Web/CSS) pour adresser ces aspects de mise en forme. +`` ne permet pas d'utiliser des attributs de dimensionnement tels que [`size`](/fr/docs/Web/HTML/Element/Input#attr-size). Il est nécessaire d'utiliser [CSS](/fr/docs/Web/CSS) pour gérer ces aspects de mise en forme. ## Validation diff --git a/files/ja/_redirects.txt b/files/ja/_redirects.txt index 0f15b499ea5c06..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 @@ -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 @@ -3184,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 @@ -3486,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 @@ -4058,6 +4058,7 @@ /ja/docs/Web/HTML/Element/h6 /ja/docs/Web/HTML/Element/Heading_Elements /ja/docs/Web/HTML/Element/image /ja/docs/Web/HTML/Element/img /ja/docs/Web/HTML/Element/input/datetime /ja/docs/Web/HTML/Element/input/datetime-local +/ja/docs/Web/HTML/Element/menuitem /ja/docs/Web/HTML/Element /ja/docs/Web/HTML/Element/video/waiting_event /ja/docs/Web/API/HTMLMediaElement/waiting_event /ja/docs/Web/HTML/Focus_management_in_HTML /ja/docs/Web/API/Document/hasFocus /ja/docs/Web/HTML/Forms /ja/docs/Learn/Forms @@ -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 473dce8e02796e..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"] @@ -20931,16 +20931,6 @@ "modified": "2020-10-15T21:19:27.214Z", "contributors": ["mfuji09", "YuichiNukiyama", "yyss", "ethertank"] }, - "Web/HTML/Element/menuitem": { - "modified": "2020-11-28T12:02:55.965Z", - "contributors": [ - "mfuji09", - "YuichiNukiyama", - "yyss", - "hamasaki", - "yuji38kwmt" - ] - }, "Web/HTML/Element/meta": { "modified": "2020-10-15T21:26:24.555Z", "contributors": ["mfuji09", "yyss", "mizunashi_mana", "hashedhyphen"] @@ -21941,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"] @@ -30430,10 +30416,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/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 つあります。 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
プロパティ定義場所目的
- event.target - - DOM Event Interface - - このイベントを発行した呼び出しの左側にある DOM 要素。 -
- event.currentTarget - - DOM Event Interface - - その EventListeners が現在処理されている EventTarget です。イベントキャプチャとバブリングが発生すると、この値は変化します。 -
- event.relatedTarget - - DOM MouseEvent Interface - イベントのセカンダリーターゲットを特定します。
- event.explicitOriginalTarget - - Event.webidl - - {{ Non-standard_inline() }} イベントが無名の境界通過以外の理由で再ターゲットされた場合、再ターゲットが発生する前にターゲットに設定されます。例えば、マウスイベントがテキストノードの上で発生した場合、その親ノードに再ターゲットされます([Firefox バグ 185889](https://bugzil.la/185889))。その場合、 .target は親ノードを表示し、.explicitOriginalTarget はテキストノードを表示します。 - .originalTarget とは異なり、.explicitOriginalTarget には無名コンテンツが含まれることはありません。 -
- event.originalTarget - - Event.webidl - - {{ Non-standard_inline() }} 再ターゲットされる前の、イベントの本来のターゲットです。詳細は Anonymous Content#Event_Flow_and_Targeting を参照してください。 -
event.composedTarget - Event.webidl - - {{ Non-standard_inline() }} Shadow DOM から合成する前の、イベントの元の非ネイティブターゲット。 -
- -### `explicitOriginalTarget` と `originalTarget` の使用 - -> **メモ:** これらのプロパティは、 Mozilla ベースのブラウザーでのみ利用可能です。 - -### 例 +{{LearnSidebar}}{{PreviousMenuNext("Learn/JavaScript/Building_blocks/Events","Learn/JavaScript/Building_blocks/Image_gallery", "Learn/JavaScript/Building_blocks")}} + +ウェブページは見出し、テキストの段落、画像、ボタンなどの「要素」で構成されており、これらの要素に発生するイベントを待ち受けすることができることを見てきました。例えば、ボタンにリスナーを追加すると、ユーザーがボタンをクリックしたときに実行することができます。 + +また、これらの要素は他の要素の中に「入れ子」にすることができます。例えば、{{htmlelement("button")}} は {{htmlelement("div")}} 要素の中に置くことができます。この場合、 `
` 要素を親要素、 ` +
+

+```
+
+ここではボタンは別の要素 {{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 + + + +``` + +以下のものがあります。 + +- ` + + +``` + +```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, "", "") }}
+
+この場合、メッセージの順番は逆になります。`` イベントハンドラーが最初に起動し、続いて `
` イベントハンドラーが起動し、続いて ` +
+

+
+```
+
+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")}} 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"; 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) - - : より複雑なアドオンの開発作業を順を追って説明します。 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(); 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/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 も同じような反応をするかもしれません。 +場合によっては、そのシグナルを吸収する意味があるかもしれません。 ## 仕様書 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) ``` ### 引数 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"` 属性を記載しなければなりません。 例えば、次のようにします。 diff --git a/files/ja/web/api/element/ariacolindextext/index.md b/files/ja/web/api/element/ariacolindextext/index.md new file mode 100644 index 00000000000000..a070ddbddaaf8c --- /dev/null +++ b/files/ja/web/api/element/ariacolindextext/index.md @@ -0,0 +1,88 @@ +--- +title: Element.ariaColIndexText +slug: Web/API/Element/ariaColIndexText +l10n: + sourceCommit: 388135bbfb0c1f852a17f52a6bfe6e85c8dc1abc +--- + +{{APIRef("DOM")}}{{SeeCompatTable}} + +**`ariaColIndexText`** は {{domxref("Element")}} インターフェイスのプロパティで、[`aria-colindextext`](/ja/docs/Web/Accessibility/ARIA/Attributes/aria-colindextext) 属性の値を反映し、aria-colindex の人間が読むための代替テキストを定義します。 + +## 値 + +文字列です。 + +## 例 + +この例では、ID が `role-heading` の要素の `aria-colindex` 属性に "Aria Role column" が設定されています。`ariaColIndexText` を使用して、値を文字列 "New column name" に更新します。 + +```html + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Semantic Elements to use instead of ARIA's roles +
+ ARIA Role + + Semantic Element +
headerh1
headerh6
rowgroupthead
termdt
+``` + +```js +let el = document.getElementById("role-heading"); +console.log(el.ariaColIndexText); // "Aria Role" +el.ariaColIndexText = "New column name"; +console.log(el.ariaColIndexText); // "New column name" +``` + +## 仕様書 + +{{Specifications}} + +## ブラウザーの互換性 + +{{Compat}} + +## 関連情報 + +- [ARIA: table role](/ja/docs/Web/Accessibility/ARIA/Roles/table_role) diff --git a/files/ja/web/api/element/ariarowindextext/index.md b/files/ja/web/api/element/ariarowindextext/index.md new file mode 100644 index 00000000000000..f60bc65b4a3e64 --- /dev/null +++ b/files/ja/web/api/element/ariarowindextext/index.md @@ -0,0 +1,87 @@ +--- +title: Element.ariaRowIndexText +slug: Web/API/Element/ariaRowIndexText +l10n: + sourceCommit: 388135bbfb0c1f852a17f52a6bfe6e85c8dc1abc +--- + +{{APIRef("DOM")}}{{SeeCompatTable}} + +**`ariaRowIndexText`** は {{domxref("Element")}} インターフェイスのプロパティで、[`aria-rowindextext`](/ja/docs/Web/Accessibility/ARIA/Attributes/aria-rowindextext) 属性の値を反映し、aria-rowindex の人間が読むための代替テキストを定義します。 + +## 値 + +文字列です。 + +## 例 + +この例では、ID が `role-heading` の要素の `aria-rowindextext` 属性に "Heading row" が設定されています。`ariaRowIndexText` を使用して、値を文字列 "Updated heading row" に更新します。 + +```html + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Semantic Elements to use instead of ARIA's roles +
+ ARIA Role + + Semantic Element +
headerh1
headerh6
rowgroupthead
termdt
+``` + +```js +let el = document.getElementById("role-heading"); +console.log(el.ariaRowIndexText); // "Heading row" +el.ariaRowIndexText = "Updated heading row"; +console.log(el.ariaRowIndexText); // "Updated heading row" +``` + +## 仕様書 + +{{Specifications}} + +## ブラウザーの互換性 + +{{Compat}} + +## 関連情報 + +- [ARIA: table role](/ja/docs/Web/Accessibility/ARIA/Roles/table_role) diff --git a/files/ja/web/api/element/checkvisibility/index.md b/files/ja/web/api/element/checkvisibility/index.md new file mode 100644 index 00000000000000..e4a913cabb87b5 --- /dev/null +++ b/files/ja/web/api/element/checkvisibility/index.md @@ -0,0 +1,185 @@ +--- +title: "Element: checkVisibility() メソッド" +short-title: checkVisibility() +slug: Web/API/Element/checkVisibility +l10n: + sourceCommit: 2b07e7febdc4b51243873b0b4978228a603f3f73 +--- + +{{APIRef("DOM")}} + +**`checkVisibility()`** は {{domxref("Element")}} インターフェイスのメソッドで、この要素が可視状態であるかどうかを検査します。 + +このメソッドは以下のどちらかの場合に `false` を返します。 + +- 例えば CSS の {{cssxref("display")}} プロパティが [`none`](/ja/docs/Web/CSS/display#none) または [`contents`](/ja/docs/Web/CSS/display#contents) に設定されている場合のように、要素に関連づけられたボックスがない場合。 +- 要素または祖先要素が {{cssxref("content-visibility")}} プロパティを [`hidden`](/ja/docs/Web/CSS/content-visibility#hidden) に設定しているため、要素が描画されない場合。 + +オプションの引数を指定することで、「可視」の意味を他の解釈として検査することができます。 +例えば、要素の不透明度が `0` であるかどうか、要素の [`visibility`](/ja/docs/Web/CSS/visibility) プロパティの値が不可視であるかどうか、要素 {{cssxref("content-visibility")}} プロパティの値が [`auto`](/ja/docs/Web/CSS/content-visibility#auto) であり、現在その描画がスキップされているかどうかを追加で検査することができます。 + +## 構文 + +```js-nolint +checkVisibility(options) +``` + +### 引数 + +- `options` {{optional_inline}} + + - : 実行する追加チェックを示すオブジェクト。 + 可能なオプションは以下の通りです。 + + - `contentVisibilityAuto` + - : `true` を指定すると、要素 {{cssxref("content-visibility")}} プロパティに値 [`auto`](/ja/docs/Web/CSS/content-visibility#auto) がある(または継承している)場合に、現在その描画がスキップされているかどうかを調べます。 + 既定では `false` です。 + - `opacityProperty` + - : `true` を指定すると、要素の {{cssxref("opacity")}} プロパティが `0` の値である(または継承している)かどうかを調べます。 + 既定では `false` です。 + - `visibilityProperty` + + - : `true` を指定すると、{{cssxref("visibility")}} プロパティの値によって要素が不可視になっているかどうかを調べます。 + 既定では `false` です。 + + > **メモ:** 不可視の要素には、[`visibility: hidden`](/ja/docs/Web/CSS/visibility#hidden) が設定された要素や、[`visibility: collapse`](/ja/docs/Web/CSS/visibility#collapse) が設定された要素が含まれます。 + + - `checkOpacity` + - : [`opacityProperty`](#opacityproperty) の過去の別名です。 + - `checkVisibilityCSS` + - : [`visibilityProperty`](#visibilityproperty) の過去の別名です。 + +### 返値 + +以下の条件に当てはまる場合は `false`、当てはまらない場合は `true` となります。 + +- 要素に関連づけられたボックスがない場合。 +- 要素の {{cssxref("content-visibility")}} プロパティが [`hidden`](/ja/docs/Web/CSS/visibility#hidden) の値である(または継承している)場合。 +- `opacityProperty`(または `checkOpacity`)が `true` で、要素 {{cssxref("opacity")}} プロパティの値が `0` である(または継承している)場合。 +- `visibilityProperty`(または `checkVisibilityCSS`)が `true` で、{{cssxref("visibility")}} プロパティの値によって要素が不可視になっている場合。 +- `contentVisibilityAuto` が `true` で、{{cssxref("content-visibility")}} プロパティの値が [`auto`](/ja/docs/Web/CSS/content-visibility#auto) の値で(または継承している)、要素の描画がスキップされている場合。 + +## 例 + +### さまざまな CSS で checkVisibility() の検査 + +次の例では、`display`、`content-visibility`、`visibility`、`opacity` の各 CSS プロパティのさまざまな値の場合に、`checkVisibility()` の結果がどのように変化するかを検査することができます。 + +#### HTML + +この HTML は ` + + + + + + + + + + +``` + +次に `
` があり、引数にオプションを渡さなかった場合と、別個のオプション値が渡された場合の `checkVisibility()` の検査の結果を出力するために使用します。
+最後には、検査される要素(選択された CSS プロパティ値が適用される要素)があります。
+
+```html
+

+
可視性を検査する要素
+``` + +#### CSS + +CSSはテストする要素を強調表示するだけです。 + +```css +#test_element { + border: solid; + border-color: blue; +} +``` + +#### JavaScript + +下記のコードは、それぞれの ` + +
``` -_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)}} ## 仕様書 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()` から戻る前に返されます。 ## 構文 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()` の呼び出しでも使用することが賢明でしょう。 ## 例 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) 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) 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()")}} です。 ## 例 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")}} インターフェイスから継承したメソッドもあります。_ ## 仕様書 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")}} を使用してください。_ ## ブラウザーの互換性 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")}} オブジェクトによって表されるファイルの名前を返します。セキュリティ上の理由から、パスはこのプロパティから除外されます。 ## 値 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 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 固有のインターフェイスは一切使用しません)。 ## ドロップゾーンの定義 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/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)` のような式が必要となります。 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)モジュール diff --git a/files/ja/web/html/element/menuitem/index.md b/files/ja/web/html/element/menuitem/index.md deleted file mode 100644 index b1a095ce53cca8..00000000000000 --- a/files/ja/web/html/element/menuitem/index.md +++ /dev/null @@ -1,134 +0,0 @@ ---- -title: -slug: Web/HTML/Element/menuitem -l10n: - sourceCommit: 76600240fbe75e083e964bc3707cce81e99999c2 ---- - -{{HTMLSidebar}}{{Deprecated_Header}}{{Non-standard_header}} - -**``** は [HTML](/ja/docs/Web/HTML) の要素で、ユーザーがポップアップメニューから呼び出すことができるコマンドを表します。メニューボタンに割り当てるメニューはもちろん、コンテキストメニューも含みます。 - -コマンドはテキストのラベルと任意で外観を表すアイコン、あるいは代わりに別の要素で動作を定義する*インダイレクトコマンド*で明示的に定義できます。また、任意でコマンドにチェックボックスを含めたり、ラジオボタンを共有するグループにすることができます (インダイレクトコマンドのメニュー項目を `` および `` 要素に対して定義するとき、チェックボックスまたはラジオボタンを持ちます)。 - -## 属性 - -この要素には[グローバル属性](/ja/docs/Web/HTML/Global_attributes)があります。特に `title` 属性はコマンドの説明やヒントを出すのに使われます。 - -- `checked` {{Deprecated_Inline}} {{Non-standard_Inline}} - - : コマンドが選択されているか否かを示す論理属性。`type` 属性が `checkbox` または `radio` のときのみ使われます。 -- `command` {{Deprecated_Inline}} {{Non-standard_Inline}} - - : 別の要素の ID を指定して、間接的に実行するコマンドを示します。 `checked`, `disabled`, `icon`, `label`, `radiogroup`, `type` 属性も含むメニューアイテムで使用してはいけません。 -- `default` {{Deprecated_Inline}} {{Non-standard_Inline}} - - : この論理属性は、メニューのサブジェクト要素 (`button` や `input` など) と同じコマンドを使用することを示します。 -- `disabled` {{Deprecated_Inline}} {{Non-standard_Inline}} - - : 現在の状態ではコマンドを使用できないことを示す論理属性です。`disabled` は `hidden` とは異なりますので注意してください。`disabled` 属性は、状態の変化によってコマンドが妥当になる状況で適切です。 -- `icon` {{Deprecated_Inline}} {{Non-standard_Inline}} - - : コマンドを表す画像を提供するために、画像の URL を指定します。 -- `label` - - : ユーザーに表示する、コマンドの名前です。`command` 属性を提供しない場合は必須です。 -- `radiogroup` {{Deprecated_Inline}} {{Non-standard_Inline}} - - : この属性は、選択されたときにラジオボタンを切り替えるコマンドのグループの名前を指定します。`type` 属性が `radio` である場合に限り使用できます。 -- `type` {{Deprecated_Inline}} {{Non-standard_Inline}} - - - : この属性は、コマンドの種類を以下の 3 つの値のいずれかで示すことができます。 - - - `command`: 関連付けられたアクションを持つ、通常のコマンド。値がない場合の既定値です。 - - `checkbox`: 2 つの異なる状態を切り替えできるコマンドを表します。 - - `radio`: ラジオボタンで切り替え可能なコマンドのグループから 1 つを選択します。 - -## 例 - -### HTML - -```html - -
Right-click to see the adjusted context menu
- - - Checkbox -
- - Commands don't render their contents. - - - Commands don't render their contents. - -
- Radio Button 1 - Radio Button 2 -
-``` - -### CSS - -```css -div { - width: 300px; - height: 80px; - background-color: lightgreen; -} -``` - -### 結果 - -{{EmbedLiveSample("Example", '100%', 80)}} - -## 技術的概要 - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- コンテンツカテゴリー - なし。
許可されている内容なし。これは{{Glossary("void element", "空要素")}}です。
タグの省略開始タグが必須で、終了タグはあってはいけません。
許可されている親要素 - ポップアップメニュー状態である {{HTMLElement("menu")}} - 要素。({{HTMLElement("menu")}} 要素の - type 属性を指定する場合は - popup にしなければなりません。属性がない場合は - {{HTMLElement("menu")}} - の親要素自体がポップアップメニュー状態の - {{HTMLElement("menu")}} であることが必要です。) -
許可されている ARIA ロールなし
DOM インターフェイス{{DOMxRef("HTMLMenuItemElement")}}
- -## 仕様書 - -現行のどの仕様書にも含まれていません。 - -## ブラウザーの互換性 - -どのブラウザーでも対応していません。この要素を唯一対応していたブラウザー Firefox は、85 で対応を削除しました。 - -## 関連情報 - -- [HTML context menus in Firefox (Screencast and Code)](https://hacks.mozilla.org/2011/11/html5-context-menus-in-firefox-screencast-and-code/) diff --git a/files/ja/web/html/element/template/index.md b/files/ja/web/html/element/template/index.md index a57886f30757cf..526c922459ff61 100644 --- a/files/ja/web/html/element/template/index.md +++ b/files/ja/web/html/element/template/index.md @@ -2,25 +2,78 @@ title: "