Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

chore(zh): maintain redirected links (part 3) #22865

Merged
merged 9 commits into from
Aug 13, 2024
Original file line number Diff line number Diff line change
Expand Up @@ -39,12 +39,9 @@ window.addEventListener("load", function () {
});
```

> [!NOTE]
> Chrome 不允許於載入事件中呼叫 [`Notification.requestPermission()`](/zh-TW/docs/Web/API/Notification.requestPermission) (參閱 [issue 274284](https://code.google.com/p/chromium/issues/detail?id=274284))。

### 已安裝的 Apps
### 已安裝的 App

在安裝 Apps 之後,若於 [Apps 的 manifest 檔案](/zh-TW/docs/%E6%87%89%E7%94%A8%E7%A8%8B%E5%BC%8F/Manifest-840092-dup)中直接添加權限,即可省去再次向使用者要求權限的動作。
在安裝 App 之後,若於 [App 的 manifest 檔案](/zh-TW/docs/Mozilla/Add-ons/WebExtensions/manifest.json)中直接添加權限,即可省去再次向使用者要求權限的動作。

```json
permissions: {
Expand Down
2 changes: 1 addition & 1 deletion files/zh-tw/web/api/response/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ slug: Web/API/Response

## 範例

在[基本 fetch 範例](https://github.com/mdn/fetch-examples/tree/master/basic-fetch) ([run example live](http://mdn.github.io/fetch-examples/basic-fetch/)) 中,我們使用 `fetch()` 呼叫來得到圖片,並使用 {{htmlelement("img")}} tag 顯示。 這裡的`fetch()` 呼叫返回了一個 promise,它使用與資源 fetch 操作有關的 `Response` 進行解析。你可能有發現,由於我們要求的是一張圖片,所以需要用 {{domxref("Body.blob")}} ({{domxref("Response")}} 時做了 body) 讓 response 有正確的 MIME 類型。
在[基本 fetch 範例](https://github.com/mdn/dom-examples/tree/main/fetch/basic-fetch) ([run example live](https://mdn.github.io/dom-examples/fetch/basic-fetch/)) 中,我們使用 `fetch()` 呼叫來得到圖片,並使用 {{htmlelement("img")}} tag 顯示。 這裡的`fetch()` 呼叫返回了一個 promise,它使用與資源 fetch 操作有關的 `Response` 進行解析。你可能有發現,由於我們要求的是一張圖片,所以需要用 {{domxref("Body.blob")}} ({{domxref("Response")}} 時做了 body) 讓 response 有正確的 MIME 類型。

```js
const image = document.querySelector(".my-image");
Expand Down
5 changes: 2 additions & 3 deletions files/zh-tw/web/api/server-sent_events/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ slug: Web/API/Server-sent_events

- Remy Sharp's [EventSource polyfill](https://github.com/remy/polyfills/blob/master/EventSource.js)
- Yaffle's [EventSource polyfill](https://github.com/Yaffle/EventSource)
- Rick Waldron's [jquery plugin](https://github.com/rwldrn/jquery.eventsource)
- Rick Waldron's [jquery plugin](https://github.com/rwaldron/jquery.eventsource)

## 相關主題

Expand All @@ -31,5 +31,4 @@ slug: Web/API/Server-sent_events
## 參見

- A [Twitter like application](http://hacks.mozilla.org/2011/06/a-wall-powered-by-eventsource-and-server-sent-events/) powered by server-sent events and [its code on Github](https://github.com/mozilla/webowonder-demos/tree/master/demos/friends%20timeline).
- [HTML5 and Server-sent events](http://dsheiko.com/weblog/html5-and-server-sent-events)
- [Server-sent events using Asp.Net](http://rajudasa.blogspot.in/2012/05/html5-server-sent-events-using-aspnet.html)
- [HTML5 and Server-sent events](https://dsheiko.com/weblog/html5-and-server-sent-events/)
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ evtSource.addEventListener("ping", function (event) {
上述的程式碼大同小異,不同之處在於若伺服器傳送了 `event` 欄位值為「ping」的訊息時它就會把 `data` 欄位的值解析為 JSON 並輸出到畫面上。

> [!WARNING]
> 當連線不是透過 **HTTP/2** 時,SSE 會受到最大連線數限制所苦,尤其當開啟多個分頁。每個瀏覽器有自己的限制數而且被限制在很低的數量(6)。這個問題已經被 [Chrome](https://bugs.chromium.org/p/chromium/issues/detail?id=275955) 和 [Firefox](https://bugzilla.mozilla.org/show_bug.cgi?id=906896) 標註為「Won't fix」(不修復)。限制是基於每個瀏覽器 + 網域,也就是說你可以針對 www\.example1.com 網域在所有的分頁中開啟六個 SSE 連線,另一個網域 www\.example2.com 也可以開啟六個(根據 [Stackoverflow](https://stackoverflow.com/a/5326159/1905229))。當使用 HTTP/2 時最大同時 _HTTP streams_ 連線數是由伺服器和客戶端之間協調(預設 100)。
> 當連線不是透過 **HTTP/2** 時,SSE 會受到最大連線數限制所苦,尤其當開啟多個分頁。每個瀏覽器有自己的限制數而且被限制在很低的數量(6)。這個問題已經被 [Chrome](https://bugs.chromium.org/p/chromium/issues/detail?id=275955) 和 [Firefox](https://bugzilla.mozilla.org/show_bug.cgi?id=906896) 標註為「Won't fix」(不修復)。限制是基於每個瀏覽器 + 網域,也就是說你可以針對 www\.example1.com 網域在所有的分頁中開啟六個 SSE 連線,另一個網域 www\.example2.com 也可以開啟六個(根據 [Stackoverflow](https://stackoverflow.com/questions/5195452/websockets-vs-server-sent-events-eventsource/5326159))。當使用 HTTP/2 時最大同時 _HTTP streams_ 連線數是由伺服器和客戶端之間協調(預設 100)。

## 從伺服器發送事件

Expand Down Expand Up @@ -97,7 +97,7 @@ while (true) {
迴圈的執行會獨立於連線的狀態,,所以在迴圈裡必須檢查連線的狀態,若斷線了要關閉連線(譬如,客戶端關閉了網頁)。

> [!NOTE]
> 你可以從下列的 Github 文章中找到包含本文所使用程式碼的完整範例 —— 參考 [Simple SSE demo using PHP.](https://github.com/mdn/dom-examples/tree/master/server-sent-events)
> 你可以從下列的 Github 文章中找到包含本文所使用程式碼的完整範例——參考 [Simple SSE demo using PHP.](https://github.com/mdn/dom-examples/tree/main/server-sent-events)

## 錯誤處理

Expand Down Expand Up @@ -133,7 +133,7 @@ evtSource.close();
- `event`
- : 事件的類型。如果有指定則在瀏覽器端會對該事件名稱的監聽器發布事件;網頁的原始碼必須使用 `addEventListener()` 來監聽已命名的事件。 `onmessage` 處理器只有在訊息沒有指定事件名稱時才會被呼叫。
- `data`
- : 訊息的資料欄位。當 EventSource 連續接收到多列以 `data:` 開頭的內容;[它會串接這些內容](http://www.w3.org/TR/eventsource/#dispatchMessage)並為每一列插入一個換行字元。最後的換行會被移除。
- : 訊息的資料欄位。當 EventSource 連續接收到多列以 `data:` 開頭的內容;[它會串接這些內容](https://html.spec.whatwg.org/multipage/#dispatchMessage)並為每一列插入一個換行字元。最後的換行會被移除。
- `id`
- : {{domxref("EventSource")}} 物件的最新一個事件 ID 。
- `retry`
Expand Down
6 changes: 3 additions & 3 deletions files/zh-tw/web/api/web_audio_api/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -51,9 +51,9 @@ Web Audio API 亦可控制音訊的空間定位 (Spatialized) 作業:透過 so
## 線上教學

- 使用 Web Audio API
- [Getting Started with the Web Audio API](http://www.html5rocks.com/tutorials/webaudio/intro/) (僅說明 WebKit-only 的非標準建置)
- [混合定位音訊 (Positional Audio) 與 WebGL](http://www.html5rocks.com/tutorials/webaudio/positional_audio/)
- [以 Web Audio API 開發遊戲音訊](http://www.html5rocks.com/tutorials/webaudio/games/)
- [Getting Started with the Web Audio API](https://web.dev/articles/webaudio-intro) (僅說明 WebKit-only 的非標準建置)
- [混合定位音訊 (Positional Audio) 與 WebGL](https://web.dev/articles/webaudio-positional-audio)
- [以 Web Audio API 開發遊戲音訊](https://web.dev/articles/webaudio-games)
- [將 webkitAudioContext 程式碼移植為標準的 AudioContext](/zh-TW/docs/Web_Audio_API/Porting_webkitAudioContext_code_to_standards_based_AudioContext)

## 規格
Expand Down
33 changes: 17 additions & 16 deletions files/zh-tw/web/api/web_workers_api/using_web_workers/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,11 @@ worker 可以產生新 worker,只要新 worker 的來源 (origin) 和父頁面

## Dedicated workers

dedicated worker 只能被產生它的檔案存取,下面我們先介紹簡單的 [Basic dedicated worker example](https://github.com/mdn/simple-web-worker) ([run dedicated worker](http://mdn.github.io/simple-web-worker/)) 範例。這個範例會將兩個數字送入 worker 相乘,然後再於前端頁面顯示相乘結果。
dedicated worker 只能被產生它的檔案存取,下面我們先介紹簡單的 [Basic dedicated worker example](https://github.com/mdn/dom-examples/tree/main/web-workers/simple-web-worker) ([run dedicated worker](https://mdn.github.io/dom-examples/web-workers/simple-web-worker/)) 範例。這個範例會將兩個數字送入 worker 相乘,然後再於前端頁面顯示相乘結果。

### 偵測 Worker 功能

為了向下相容、避免錯誤,最好是確保 worker 存在後再取用之 ([main.js](https://github.com/mdn/simple-web-worker/blob/gh-pages/main.js)):
為了向下相容、避免錯誤,最好是確保 worker 存在後再取用之[main.js](https://github.com/mdn/dom-examples/blob/main/web-workers/simple-web-worker/main.js)):

```js
if (window.Worker) {
Expand All @@ -40,15 +40,15 @@ if (window.Worker) {

### 產生 dedicated worker

只要呼叫 {{domxref("Worker.Worker", "Worker()")}} 建構子,傳入 JS 檔案的 URI,便可以生成一個 worker 執行緒 ([main.js](https://github.com/mdn/simple-web-worker/blob/gh-pages/main.js)):
只要呼叫 {{domxref("Worker.Worker", "Worker()")}} 建構子,傳入 JS 檔案的 URI,便可以生成一個 worker 執行緒[main.js](https://github.com/mdn/dom-examples/blob/main/web-workers/simple-web-worker/main.js)):

```js hidden
var myWorker = new Worker("worker.js");
```

### 和 dedicated worker 發送訊息

{{domxref("Worker.postMessage", "postMessage()")}} 方法以及 {{domxref("Worker.onmessage", "onmessage")}} 事件處理器就是和 worker 發送訊息的關鍵 ([main.js](https://github.com/mdn/simple-web-worker/blob/gh-pages/main.js)):
{{domxref("Worker.postMessage", "postMessage()")}} 方法以及 {{domxref("Worker.onmessage", "onmessage")}} 事件處理器就是和 worker 發送訊息的關鍵[main.js](https://github.com/mdn/dom-examples/blob/main/web-workers/simple-web-worker/main.js)):

```js
first.onchange = function () {
Expand All @@ -64,7 +64,7 @@ second.onchange = function () {

範例中有兩個 {{htmlelement("input")}} 元素,first 和 second,當元素值改變時,我們會利用 postMessage() 方法告訴 worker 改變的值 (這邊用陣列,也可以用其他類別)。

然後在 worker 裡我們從 `onmessage` 接收訊息 ([worker.js](https://github.com/mdn/simple-web-worker/blob/gh-pages/worker.js)):
然後在 worker 裡我們從 `onmessage` 接收訊息[worker.js](https://github.com/mdn/dom-examples/blob/main/web-workers/simple-web-worker/worker.js)):

```js
onmessage = function (e) {
Expand All @@ -88,17 +88,18 @@ myWorker.onmessage = function (e) {

拿到存在事件 data 中的計算值後,我們接著將值以 `textContent` 顯示出來。

> **備註:** `建構 Worker` 的 URI 必須遵從[same-origin policy](/zh-TW/docs/Web/Security/Same-origin_policy)。目前各家瀏覽器在這方面存有歧異,Gecko 10.0 以後允許 data URI 而 Internet Explorer 10 不允許 Blob URI。
> [!NOTE]
> 建構 `Worker` 的 URI 必須遵從[same-origin policy](/zh-TW/docs/Web/Security/Same-origin_policy)。目前各家瀏覽器在這方面存有歧異,Gecko 10.0 以後允許 data URI 而 Internet Explorer 10 不允許 Blob URI。

> [!NOTE]
> 在主執行緒中存取 `onmessage` `與 postMessage` 需要主動掛在 worker 物件上,在 worker 執行緒則不用,這是因為 worker 執行緒的全域物件便是 worker 物件。
> 在主執行緒中存取 `onmessage` 與 `postMessage` 需要主動掛在 worker 物件上,在 worker 執行緒則不用,這是因為 worker 執行緒的全域物件便是 worker 物件。

> [!NOTE]
> 和 worker 傳送的資料並非共享而是複製一份後傳送,詳細請參照 [和 workers 傳遞資料:更多細節](#和_workers_傳遞資料:更多細節)。

### 結束 worker

`在主執行緒裡呼叫` {{domxref("Worker", "terminate")}} 就可結束 worker :
在主執行緒裡呼叫 {{domxref("Worker", "terminate")}} 就可結束 worker:

```js
myWorker.terminate();
Expand Down Expand Up @@ -146,7 +147,7 @@ importScripts("foo.js", "bar.js"); /* imports two scripts */

## Shared workers

shared worker 能夠被多個程式腳本存取,縱使跨越不同 window、iframe 或 worker。這邊的 [Basic shared worker example](https://github.com/mdn/simple-shared-worker) ([run shared worker](http://mdn.github.io/simple-shared-worker/)) 範例和 dedicated worker 範例類似,但多了兩個可以讓多個檔案存取的函數:_數字相乘以及數字平方_。
shared worker 能夠被多個程式腳本存取,縱使跨越不同 window、iframe 或 worker。這邊的 [Basic shared worker example](https://github.com/mdn/dom-examples/tree/main/web-workers/simple-shared-worker) ([run shared worker](https://mdn.github.io/dom-examples/web-workers/simple-shared-worker/)) 範例和 dedicated worker 範例類似,但多了兩個可以讓多個檔案存取的函數:_數字相乘以及數字平方_。

請注意 dedicated worker 與 shared worker 間的差異處,範例裡會有兩份 HTML 頁面,各自都利用同一個 worker 處理運算。

Expand All @@ -158,15 +159,15 @@ shared worker 能夠被多個程式腳本存取,縱使跨越不同 window、if

### 產生 shared worker

和 dedicated worker 做法差不多,只是用另一個 SharedWorker 建構子來產生 shared worker,見 [index.html](https://github.com/mdn/simple-shared-worker/blob/gh-pages/index.html) 和 [index2.html](http://mdn.github.io/simple-shared-worker/index2.html):
和 dedicated worker 做法差不多,只是用另一個 SharedWorker 建構子來產生 shared worker,見 [index.html](https://github.com/mdn/dom-examples/blob/main/web-workers/simple-shared-worker/index.html) 和 [index2.html](https://github.com/mdn/dom-examples/blob/main/web-workers/simple-shared-worker/index2.html):

```js
var myWorker = new SharedWorker("worker.js");
```

相當不 一樣的是和 shared worker 溝通必須要透過 port 物件,其實 dedicated worker 也是如此,只不過一切是在背景後自動完成。

開啟 port 連線一是在 onmessage 事件下背景完成,二是藉由主動呼叫 start() 好開始傳送訊息。範例 [multiply.js](https://github.com/mdn/simple-shared-worker/blob/gh-pages/multiply.js) 以及 [worker.js](https://github.com/mdn/simple-shared-worker/blob/gh-pages/worker.js) 因為註冊了 onmessage 事件,所以其實可以省略呼叫 start(),然而若是 message 事件是經由 `addEventListener()註冊,那麼便需要呼叫 start() 了。`
開啟 port 連線一是在 onmessage 事件下背景完成,二是藉由主動呼叫 start() 好開始傳送訊息。範例 [multiply.js](https://github.com/mdn/dom-examples/blob/main/web-workers/simple-shared-worker/multiply.js) 以及 [worker.js](https://github.com/mdn/dom-examples/blob/main/web-workers/simple-shared-worker/worker.js) 因為註冊了 onmessage 事件,所以其實可以省略呼叫 start(),然而若是 message 事件是經由 `addEventListener()` 註冊,那麼便需要呼叫 start() 了。

當使用 start() 開啟 port 連線,那麼雙向溝通便需要主執行緒和 worker 兩端都呼叫 start()。

Expand All @@ -180,7 +181,7 @@ port.start(); // called in worker thread, assuming the port variable references

### 和 shared worker 發送訊息

如同前面,現在可以呼叫 `postMessage()` 發送訊息,只不過這次需要透過 port 物件 (一樣請參考 [multiply.js](https://github.com/mdn/simple-shared-worker/blob/gh-pages/multiply.js) 和 [square.js](https://github.com/mdn/simple-shared-worker/blob/gh-pages/square.js)):
如同前面,現在可以呼叫 `postMessage()` 發送訊息,只不過這次需要透過 port 物件一樣請參考 [multiply.js](https://github.com/mdn/dom-examples/blob/main/web-workers/simple-shared-worker/multiply.js) 和 [square.js](https://github.com/mdn/dom-examples/blob/main/web-workers/simple-shared-worker/square.js)):

```js
squareNumber.onchange = function () {
Expand All @@ -189,7 +190,7 @@ squareNumber.onchange = function () {
};
```

worker 方面也增加了一些程式碼 ([worker.js](https://github.com/mdn/simple-shared-worker/blob/gh-pages/worker.js)):
worker 方面也增加了一些程式碼[worker.js](https://github.com/mdn/dom-examples/blob/main/web-workers/simple-shared-worker/worker.js)):

```js
onconnect = function (e) {
Expand All @@ -208,7 +209,7 @@ onconnect = function (e) {

取得 port 之後,我們註冊 port 上的 onmessage 事件,當有訊息進來便取回資料進行運算後回傳回去;註冊 onmessage 事件的同時也自動建立連線,所以說不需要呼叫 start() 了。

最後在主執行緒端,我們同樣由 onmessage 事件取回回傳過來的訊息 (一樣請參考 [multiply.js](https://github.com/mdn/simple-shared-worker/blob/gh-pages/multiply.js) 和 [square.js](https://github.com/mdn/simple-shared-worker/blob/gh-pages/square.js)):
最後在主執行緒端,我們同樣由 onmessage 事件取回回傳過來的訊息一樣請參考 [multiply.js](https://github.com/mdn/dom-examples/blob/main/web-workers/simple-shared-worker/multiply.js) 和 [square.js](https://github.com/mdn/dom-examples/blob/main/web-workers/simple-shared-worker/square.js)):

```js
myWorker.port.onmessage = function (e) {
Expand All @@ -227,7 +228,7 @@ myWorker.port.onmessage = function (e) {

和 workers 傳遞的資料會先被複製一份,而非共享;經過序列化後 (serialized) 傳輸,然後在另一端反序列化 (de-serialized) 取出,大部份的瀏覽器都是以 [結構化複製 (structured cloning)](/zh-TW/docs/Web/Guide/API/DOM/The_structured_clone_algorithm) 實作這項特色.

下面的 `emulateMessage() 會模擬和 worker 傳遞訊息時,複製資料的行為。`
下面的 `emulateMessage()` 會模擬和 worker 傳遞訊息時,複製資料的行為。

```js
function emulateMessage(vVal) {
Expand Down Expand Up @@ -299,7 +300,7 @@ onmessage = function (oEvent) {

#### 範例 1: 非同步 `eval()`

下面透過 [data URL](/zh-TW/docs/Web/HTTP/data_URIs) 和 `eval(),`示範如何在 worker 非同步執行允許的程式碼:
下面透過 [data URL](/zh-TW/docs/Web/HTTP/data_URIs) 和 `eval()`,示範如何在 worker 非同步執行允許的程式碼:

```js
// Syntax: asyncEval(code[, listener])
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -266,12 +266,12 @@ function drawScene(gl, programInfo, buffers) {

## 矩陣運算

矩陣的運算看起來很複雜,但其實[一步一步運算其實不會那麼困難](https://webglfundamentals.org/webgl/lessons/webgl-2d-matrices.html)。大部分使用者不會寫自己的運算函數,多半是使用現成的矩陣函數庫,這個例子中我們用的是 [glMatrix library](http://glmatrix.net/) 。
矩陣的運算看起來很複雜,但其實[一步一步運算其實不會那麼困難](https://webglfundamentals.org/webgl/lessons/webgl-2d-matrices.html)。大部分使用者不會寫自己的運算函數,多半是使用現成的矩陣函數庫,這個例子中我們用的是 [glMatrix library](https://glmatrix.net/) 。

可參考以下資料

- [Matrices](https://webglfundamentals.org/webgl/lessons/webgl-2d-matrices.html) on WebGLFundamentals
- [Matrices](http://mathworld.wolfram.com/Matrix.html) on Wolfram MathWorld
- [Matrix](<http://en.wikipedia.org/wiki/Matrix_(mathematics)>) on Wikipedia
- [Matrices](https://mathworld.wolfram.com/Matrix.html) on Wolfram MathWorld
- [Matrix](https://zh.wikipedia.org/wiki/矩阵) on Wikipedia

{{PreviousNext("Web/API/WebGL_API/Tutorial/Getting_started_with_WebGL", "Web/API/WebGL_API/Tutorial/Using_shaders_to_apply_color_in_WebGL")}}
Loading