` のハンドラが実行されるのはなぜでしょう?
## バブリング(Bubbling)
バブリングの原理はシンプルです。
-**要素上でイベントが起きると、最初にその上のハンドラが実行され、次にその親のハンドラが実行され、他の祖先に到達するまでそれらが行われます。**
+**要素上でイベントが発生すると、最初にその要素上のハンドラが実行され、次にその親要素のハンドラが実行され、さらに他の祖先を実行します。**
-たとえば、3つのネストされた要素 `FORM > DIV > P` があり、それぞれにハンドラがあります:
+たとえば、3つのネストされた要素 `FORM > DIV > P` があり、それぞれにハンドラがあるとします:
```html run autorun
\ No newline at end of file
diff --git a/2-ui/2-events/02-bubbling-and-capturing/event-order-bubbling@2x.png b/2-ui/2-events/02-bubbling-and-capturing/event-order-bubbling@2x.png
deleted file mode 100644
index e3a070cb80..0000000000
Binary files a/2-ui/2-events/02-bubbling-and-capturing/event-order-bubbling@2x.png and /dev/null differ
diff --git a/2-ui/2-events/02-bubbling-and-capturing/eventflow.png b/2-ui/2-events/02-bubbling-and-capturing/eventflow.png
deleted file mode 100644
index 95c5c08e0a..0000000000
Binary files a/2-ui/2-events/02-bubbling-and-capturing/eventflow.png and /dev/null differ
diff --git a/2-ui/2-events/02-bubbling-and-capturing/eventflow.svg b/2-ui/2-events/02-bubbling-and-capturing/eventflow.svg
new file mode 100644
index 0000000000..566064cd6b
--- /dev/null
+++ b/2-ui/2-events/02-bubbling-and-capturing/eventflow.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/2-ui/2-events/02-bubbling-and-capturing/eventflow@2x.png b/2-ui/2-events/02-bubbling-and-capturing/eventflow@2x.png
deleted file mode 100644
index d52c4f70c9..0000000000
Binary files a/2-ui/2-events/02-bubbling-and-capturing/eventflow@2x.png and /dev/null differ
diff --git a/2-ui/2-events/03-event-delegation/2-sliding-tree/task.md b/2-ui/2-events/03-event-delegation/2-sliding-tree/task.md
index a84fba5d38..1013069300 100644
--- a/2-ui/2-events/03-event-delegation/2-sliding-tree/task.md
+++ b/2-ui/2-events/03-event-delegation/2-sliding-tree/task.md
@@ -11,4 +11,4 @@ importance: 5
要件:
- イベントハンドラは1つだけ(移譲を使ってください)
-- ノードタイトルの外側(空の巣ペース)のクリックでは何もしないようにしてください。
+- ノードタイトルの外側(空のスペース)のクリックでは何もしないようにしてください。
diff --git a/2-ui/2-events/03-event-delegation/article.md b/2-ui/2-events/03-event-delegation/article.md
index e4d8b79d27..cd7310bc32 100644
--- a/2-ui/2-events/03-event-delegation/article.md
+++ b/2-ui/2-events/03-event-delegation/article.md
@@ -81,7 +81,7 @@ function highlight(td) {
当然、その `
` でクリックが起きた場合、それは `event.target` の値になります。
-
+
`table.onclick` ハンドラでは、このような `event.target` を取り、クリックが `` の中で行われたのかそうでないのかを知る必要があります。
@@ -102,7 +102,7 @@ table.onclick = function(event) {
説明:
1. メソッド `elem.closest(selector)` はセレクタに合致する最も近い祖先を返します。我々のケースではソース要素から上昇し ` | ` を探します。
2. もし `event.target` がどの ` | ` の内側にもない場合、その呼出は `null` を返し、何もする必要はありません。
-3. ネストしたテーブルでは、`event.target` は現在のテーブルの外側ににある ` | ` かもしれません。なので、実際に *テーブルの* ` | ` かどうかをチェックします。
+3. ネストしたテーブルでは、`event.target` は現在のテーブルの外側にある ` | ` かもしれません。なので、実際に *テーブルの* ` | ` かどうかをチェックします。
4. もしそうであれば、強調表示します。
## 移譲サンプル: マークアップ内のアクション
@@ -113,7 +113,7 @@ table.onclick = function(event) {
例えば、"Save" と "Load", "Search" などのボタンをもつメニューを作りたいとします。そしてメソッド `save`, `load`, `search`.... を持つオブジェクトがあります。
-最初の考えは、各ボタンに別々のハンドラを割り当てる事かもしれません。しかし、よりエレガントな方法があります。私たちはメニュー全体に対してハンドラを追加し、呼び出すメソッドを持っているに対して `date-action` 属性を追加します。:
+最初の考えは、各ボタンに別々のハンドラを割り当てる事かもしれません。しかし、よりエレガントな方法があります。私たちはメニュー全体に対してハンドラを追加し、呼び出すメソッドがあるボタンに対して `date-action` 属性を追加します。:
```html
@@ -161,7 +161,7 @@ table.onclick = function(event) {
```
-`this.onClick` は `(*)` で `this` がバインドされていることに注意してください。それは重要です。なぜなら、そうしていなければ `this` はメニューオブジェクトではなく DOM 要素を参照し、`this[action]` は我々が必要とするものではいからです。
+`this.onClick` は `(*)` で `this` がバインドされていることに注意してください。それは重要です。なぜなら、そうしていなければ `this` はメニューオブジェクトではなく DOM 要素を参照し、`this[action]` は我々が必要とするものではないからです。
したがって、この移譲が我々に与えれくれたものはなんでしょう?
@@ -260,13 +260,13 @@ One more counter:
```compare
+ 初期化の簡素化とメモリの節約: 多くのハンドラを追加する必要はありません。
-+ コードを減らす code: 要素を追加または削除するときに、ハンドラを追加/削除する必要はありません。
++ より少ないコード: 要素を追加または削除するときに、ハンドラを追加/削除する必要はありません。
+ DOM の変更: `innerHTML` などで要素を一括して追加/削除することができます
```
-移譲はには、もちろん制限があります:
+移譲には、もちろん制限があります:
```compare
- まず、イベントがバブリングする必要があります。バブリングしないイベントもあります。また低レベルのハンドラは `event.stopPropagation()` を使うべきではありません。
-- 2つ目に、移譲は CPU負荷を上げる可能性があります。なぜなら、コンテナレベルのハンドラは、関心があるかどうかに関わらずコンテナの任意の場所のイベントに反応するたmです。しかし通常その負荷は無視できるので、考慮しません。
+- 2つ目に、移譲は CPU負荷を上げる可能性があります。なぜなら、コンテナレベルのハンドラは、関心があるかどうかに関わらずコンテナの任意の場所のイベントに反応するためです。しかし通常その負荷は無視できるので、考慮しません。
```
diff --git a/2-ui/2-events/03-event-delegation/bagua-bubble.png b/2-ui/2-events/03-event-delegation/bagua-bubble.png
deleted file mode 100644
index f0433aeb18..0000000000
Binary files a/2-ui/2-events/03-event-delegation/bagua-bubble.png and /dev/null differ
diff --git a/2-ui/2-events/03-event-delegation/bagua-bubble.svg b/2-ui/2-events/03-event-delegation/bagua-bubble.svg
new file mode 100644
index 0000000000..c4cd1ee1e2
--- /dev/null
+++ b/2-ui/2-events/03-event-delegation/bagua-bubble.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/2-ui/2-events/03-event-delegation/bagua-bubble@2x.png b/2-ui/2-events/03-event-delegation/bagua-bubble@2x.png
deleted file mode 100644
index 8cc5ca913f..0000000000
Binary files a/2-ui/2-events/03-event-delegation/bagua-bubble@2x.png and /dev/null differ
diff --git a/2-ui/2-events/04-default-browser-action/article.md b/2-ui/2-events/04-default-browser-action/article.md
index 82c50c1f58..437b190ae3 100644
--- a/2-ui/2-events/04-default-browser-action/article.md
+++ b/2-ui/2-events/04-default-browser-action/article.md
@@ -108,7 +108,7 @@ menu.onclick = function(event) {
バブリングの停止が必要に見える実践的な例を見てみましょう。しかし、実際にはバブリングを止めることなく上手く行うことができます。
-デフォルトでは、`contextmen` イベント時(マウスの右クリック)のブラウザは、標準オプション付きのコンテキストメニューを表示します。私たちはそれを防いで、独自のメニューを表示することができます:
+デフォルトでは、`contextmenu` イベント時(マウスの右クリック)のブラウザは、標準オプション付きのコンテキストメニューを表示します。私たちはそれを防いで、独自のメニューを表示することができます:
```html autorun height=50 no-beautify run
@@ -187,7 +187,7 @@ menu.onclick = function(event) {
```
-これで、すべて正しく動作します。ネストされた要素を持っており、それらが独自のコンテキストメニューを持っている場合も動作します。ただ、各 `contextmen` ハンドラの中で `event.defaultPrevented` を確認してください。
+これで、すべて正しく動作します。ネストされた要素を持っており、それらが独自のコンテキストメニューを持っている場合も動作します。ただ、各 `contextmenu` ハンドラの中で `event.defaultPrevented` を確認してください。
```smart header="event.stopPropagation() と event.preventDefault()"
明らかに分かるように、`event.stopPropagation()` と `event.preventDefault()` (`return false` としても知られている)は2つの異なるものです。それらはお互い関係ありません。
diff --git a/2-ui/2-events/05-dispatch-events/article.md b/2-ui/2-events/05-dispatch-events/article.md
index b7d88dc478..b5e9dde8a3 100644
--- a/2-ui/2-events/05-dispatch-events/article.md
+++ b/2-ui/2-events/05-dispatch-events/article.md
@@ -156,7 +156,7 @@ alert(event.clientX); // undefined, 未知のプロパティは無視されま
`detail` プロパティは任意のデータを持てます。技術的には、通常の `new Event` オブジェクトを作った後、そこに任意のプロパティを割り当てる事ができるため、それなしでも生きていくことはできます。しかし、`CustomEvent` は他のイベントプロパティとの衝突を避けるための特別な `detail` フィールドを提供します。
-イベントクラスは "どのような種類のイベント" かを示し、もしイベントがカスタムであれば、それが何であるかを明確にするために `CusstomEvent` を使うべきです。
+イベントクラスは "どのような種類のイベント" かを示し、もしイベントがカスタムであれば、それが何であるかを明確にするために `CustomEvent` を使うべきです。
## event.preventDefault()
@@ -211,13 +211,13 @@ alert(event.clientX); // undefined, 未知のプロパティは無視されま
## イベント中のイベントは同期的です
-通常、イベントは非同期に処理されます。つまり: ブラウザが `onclick` を処理しており、そのプロセスの中で新しいイベントが起きた場合、`onclick` が終わるまでそれは待ちます。
+通常、イベントは待ち行列に入れられてから処理されます。つまり: ブラウザが `onclick` を処理しており、そのプロセスの中で新しいイベントが起きた場合(例えばマウスが移動したなど)、その処理は待ち行列に入れられ、対応する `mousemove` のハンドラは `onclick` の処理が終了したあとに呼ばれます。
-例外は、あるイベントが別のイベントから開始された場合です。
+注目すべき例外は、あるイベントが別のイベントから開始された場合(例えば `dispatchEvent` の使用)です。そのようなイベントは直ちに処理されます: 新しいイベントハンドラが呼ばれ、それから現在のイベント処理が再開します。
-次に、制御はネストされたイベントハンドラに飛び、その後戻ってきます。
+例えば、以下のコードでは、 `menu-open` イベントは `onclick` の途中でトリガされます。
-例えば、ここではネストされた `menu-open` イベントは `onclick` の間、同期的に処理されます。:
+これは、 `onclick` のハンドラの終了を待たずに直ちに処理されます:
```html run
@@ -239,11 +239,15 @@ alert(event.clientX); // undefined, 未知のプロパティは無視されま
```
-ネストされたイベント `menu-open` はバブルアップし `document` で処理されることに注意してください。ネストされたイベントの伝搬は、外部のコード(`onclick`) に戻る前に完全に終了します。
+出力の順番は次のとおりです: 1 → nested → 2
-それは `dispatchEvent` についてだけでなく、他のケースも同様です。イベントハンドラ中の JavaScrit は別のイベントにつながるメソッドを呼び出すことができます -- それらも同期的に処理されます。
+ネストされたイベント `menu-open` は `document` で捕捉されることに注意してください。ネストされたイベントの伝搬や処理は、外部のコード(`onclick`) に戻る前に完全に終了します。
-もしそれが気に入らなければ、`onclick` の末尾に `dispatchEvent` (または他のイベントトリガ呼び出し) を置くか、不便であれば `setTimeout(..., 0)` で囲みます。:
+それは `dispatchEvent` についてだけでなく、他のケースも同様です。もしイベントハンドラが他のイベントを引き起こすメソッドを呼び出すと – これらも同期的に、ネストされた関数の要領で処理されます。
+
+これが気に入らないとしましょう。 `menu-open` や他のネストされたイベントとは無関係に `onclick` を最初に完全に処理したいとします。
+
+その場合、 `dispatchEvent` (あるいは他のイベントを引き起こす呼び出し)を `onclick` の最後に置くか、もっと良い方法として、それらをゼロ遅延の `setTimeout` でラップします:
```html run
@@ -265,6 +269,10 @@ alert(event.clientX); // undefined, 未知のプロパティは無視されま
```
+これで現在のコードの実行後に、 `menu.onclick` を含め、 `dispatchEvent` を非同期に実行できます。つまりイベントハンドラが完全に切り離されました。
+
+出力の順番は次の通りとなりました: 1 → 2 → nested
+
## サマリ
イベントを生成するためには、最初にイベントオブジェクトを作成する必要があります。
diff --git a/2-ui/3-event-details/1-mouse-events-basics/article.md b/2-ui/3-event-details/1-mouse-events-basics/article.md
index 35ebb98ada..65ad33087b 100644
--- a/2-ui/3-event-details/1-mouse-events-basics/article.md
+++ b/2-ui/3-event-details/1-mouse-events-basics/article.md
@@ -1,87 +1,96 @@
-# マウスイベントの基本
-マウスイベントは "マウス操作" だけでなく、互換性のためにタッチデバイスでもエミュレートされます。
+# マウスイベント
-このチャプターでは、マウスイベントとそれらのプロパティの詳細について説明していきます。
+この章では、マウスイベントとそのプロパティの詳細を説明します。
-[cut]
+注意: マウスイベント は "マウスデバイス" だけではなく、スマートフォンやタブレットなど互換性のためにエミュレートされた他のデバイスから来ることもあります。
-## マウスイベントタイプ
+## マウスイベントの種類
-マウスイベントは2つのカテゴリに分けることができます: "シンプル" と "複雑" です。
-
-### シンプルなイベント
-
-最も使用されるシンプルなイベントは:
+ここまでで、既にいくつかのイベントは見てきました:
`mousedown/mouseup`
-: 要素上でマウスボタンがクリックされた/離された。
+: 要素上でマウスボタンがクリックされた/離されました。
`mouseover/mouseout`
-: マウスポイントが要素に来る/でていく。
+: マウスポイントが要素に来る/出ていきました。
`mousemove`
-: 要素上のすべてのマウス移動で、このイベントが発生します。
-
-...他のイベントタイプもあります、それらは後ほど説明します。
-
-### 複雑なイベント [$Complex events]
+: 要素上でのマウス移動毎にこのイベントが発生します。
`click`
-: `mousedown` の後に発生し、マウスの左ボタンを使われた場合は同じ要素に `mouseup` を送ります。
-
-`contextmenu`
-: マウスの右ボタンが使わた場合、`mousedown` の後に発生します。
+: `mousedown` の後に発生し、マウスの左ボタンを使われた場合は同じ要素に `mouseup` が発生します。
`dblclick`
-: 要素をダブルクリックした後に発生します。
+: 短時間の間に同じ要素で2回クリックされた後に発生します。最近はめったに使われません。
-複雑なイベントはシンプルなイベントから作られます。なので、論理的にはそれ無しでもやっていけます。しかしそれらはとても便利なので存在しています。
+`contextmenu`
+: マウスの右ボタンが使われた場合に発生します。が、コンテキストメニューを開く方法は他にもあります。例 特別なキーボードのキーを使用する場合です。この場合でもイベントが発生するので、正確にはマウスイベントではありません。
+
+...他にもいくつかイベントがあります。後ほど説明します。
### イベント順
-アクションは複数のイベントをトリガする場合があります。
+上の一覧を見てわかるように、ユーザアクションは複数のイベントを発生させることがあります。
-例えば、ボタンが押されたとき、クリックは最初に `mousedown` をトリガし、次に クリックが離されたときに `mouseup` と `click` をトリガします。
+例えば、左ボタンのクリックは最初に `mousedown` を発生させ、ボタンが押された後、それが離されたときに `mouseup` と `click` が発生します。
-1つのアクションが複数イベントを開始する場合、それらの順序は固定です。つまり、ハンドラは `mousedown` -> `mouseup` -> `click` の順番で呼び出されます。イベントは同じシーケンスで処理されます: `onmouseup` は `onclick` の実行の前に完了します。
+1つのアクションが複数イベントを発生させる場合、順序は決まっています。つまり、ハンドラは `mousedown` -> `mouseup` -> `click` の順番で呼び出されます。
```online
下のボタンをクリックし、イベントを見てみてください。ダブルクリックも試してみてください。
-下のテストスタンドでは、すべてのマウスイベントが記録され、それらの間で1秒以上の遅延がある場合、水平ルーラーで区切っています。
+下のテストスタンドでは、すべてのマウスイベントが記録され、イベント間で1秒以上の時間がある場合には水平ルーラーで区切っています。
-マウスボタンを検出する `which` プロパティも見ることができます。
+また、マウスのボタンを検出するための `button` プロパティが見えますが、これについては後述します。
```
-## ボタンを取得する: which
+## マウスボタン
+
+クリック関連のイベントには常に `button` プロパティがあり、正確なマウスボタンが取得できます。
-クリック関連のイベントは常にボタンが取得できる `which` プロパティを持っています。
+通常、`click` や `contextmenu` では使いません。なぜなら前者は左クリックのときだけ、後者は -- 右クリックのときにだけ起こるからです。
-これは `click` や `contextmenu` では使われません。なぜなら前者は左クリックのときだけ、後者は -- 右クリックのときにだけ起こるからです。
+一方、`mousedown` と `mouseup` ハンドラが `event.button` を必要とする場合があります。これらのイベントはどちらのボタンでも発生するためです。このとき、`button` で "右マウスダウン" と "左マウスダウン" が区別できます。
-しかし、もし `mousedown` と `mouseup` を追跡している場合、それが必要です。なぜならそれらのイベントは左右どちらのボタンでもトリガするためです。したがって、`which` は "右マウスダウン" と "左マウスダウン" を区別することができます。
+`event.button` がとり得る値は以下です:
-3つのとり得る値があります:
+| ボタン状態 | `event.button` |
+|--------------|----------------|
+| 左ボタン (主) | 0 |
+| 中央ボタン (補助) | 1 |
+| 右ボタン (副) | 2 |
+| X1 ボタン (戻る) | 3 |
+| X2 ボタン (進む) | 4 |
-- `event.which == 1` -- 左ボタン
-- `event.which == 2` - 中央ボタン
-- `event.which == 3` - 右ボタン
+ほとんどのマウスデバイスは、左右の2つのボタンのみなので、取り得る値は `0` か `2` です。タッチデバイスもタップ時に同様のイベントを生成します。
-中央のボタンは今のところいくらかエキゾチックで、ほとんど使われていません。
+また、`event.buttons` というプロパティもあり、これは現在押されているすべてのボタンを整数値として持っています。実際にはこのプロパティはほとんど使われませんが、[MDN](mdn:/api/MouseEvent/buttons) で詳細が確認できます。
+
+```warn header="`event.which` は非推奨です"
+古いコードでは `event.which` プロパティが使われていることがあります。これは、ボタンを取得する古い非標準の方法で、以下の値が取られます:
+
+- `event.which == 1` – 左ボタン
+- `event.which == 2` – 中央ボタン
+- `event.which == 3` – 右ボタン
+
+現時点では、`event.which` は推奨されていないので使用しないでください。
+```
## 修飾子: shift, alt, ctrl と meta
すべてのマウスイベントは押された修飾子のキーに関する情報も含みます。
-プロパティは:
+イベントプロパティ:
+
+- `shiftKey`: `key:Shift`
+- `altKey`: `key:Alt` (or Mac は `key:Opt`)
+- `ctrlKey`: `key:Ctrl`
+- `metaKey`: Mac は `key:Cmd`
-- `shiftKey`
-- `altKey`
-- `ctrlKey`
-- `metaKey` (Mac では `key:Cmd`)
+イベント時に対応するキーが押されていた場合 `true` になります。
例えば、下のボタンは `key:Alt+Shift` + クリック でのみ動作します:
@@ -99,23 +108,26 @@
```
-```warn header="注意: Macでは通常は `Ctrl` キーではなく `Cmd` キーです"
-Windows と Linux では、`key:Alt`, `key:Shift` と `key:Ctrl` の修飾子があります。Mac ではもう一つあります: `key:Cmd`、これはプロパティ `metaKey` に相当します。
+```warn header="注意: Macでは通常は `Ctrl` ではなく `Cmd` です"
+Windows と Linux には、`key:Alt`, `key:Shift` と `key:Ctrl` の修飾子があります。Mac ではもう一つあります: `key:Cmd`、これはプロパティ `metaKey` に相当します。
+
+多くのアプリケーションでは、Windows/Linux が `key:Ctrl` を使う時、Mac では `key:Cmd` を使います。
-殆どの場合、Windows/Linux が `key:Ctrl` を使う時、Mac の人々は `key:Cmd` を使います。そのため、Windows ユーザが `key:Ctrl+Enter` or `key:Ctrl+A` を押すとき、Mac ユーザは `key:Cmd+Enter` or `key:Cmd+A` などを押し、ほとんどのアプリは `key:Ctrl` の代わりに `key:Cmd` を使います。
+つまり: Windows ユーザが `key:Ctrl+Enter` あるいは `key:Ctrl+A` を押すとき、Mac ユーザは `key:Cmd+Enter` あるいは `key:Cmd+A` となります。
-したがって、`key:Ctrl` + クリック のような組み合わせをサポートしたいとき、Mac では `key:Cmd` + クリック を使うのが理にかなっています。それがMacユーザにとってより快適なのです。
+したがって、`key:Ctrl` + クリック のような組み合わせをサポートしたいとき、Mac では `key:Cmd` + クリック とするのが理にかなっています。それがMacユーザにとってより快適です。
-たとえ Mac ユーザに `key:Ctrl` + クリックを強制したいとしても、 -- それは難しいです。問題は -- `key:Ctrl` で左クリックすると、Mac では *右クリック* と解釈され、Windows/Linux のように `click` ではなく `contextmenu` イベントが生成されるからです。
+たとえ Mac ユーザに `key:Ctrl` + クリックを強制したいとしても、それは難しいです。問題は `key:Ctrl` で左クリックすると、Mac では *右クリック* と解釈され、Windows/Linux のように `click` ではなく `contextmenu` イベントが生成されるからです。
なので、すべての OS の人々に快適に感じてもらうためには、`ctrlKey` と一緒に `metaKey` を使うべきです。
JS-codeの場合、`if (event.ctrlKey || event.metaKey)` というチェックを意味します。
-
```
```warn header="モバイルデバイスもあります"
-キーボードの組み合わせは便利です。訪問者がキーボードを持っていれば、それは機能します。 あなたのデバイスがそれを持っていない場合でも、同じことをする別の方法があります。
+キーボードの組み合わせは便利です。利用者がキーボードを使う場合は、それを使えるようにします。
+
+ですが、モバイルデバイスのように、デバイスにキーボードがない場合は、修飾キーがなくても動作するようにする必要があります。
```
## 座標: clientX/Y, pageX/Y
@@ -125,63 +137,37 @@ JS-codeの場合、`if (event.ctrlKey || event.metaKey)` というチェック
1. ウィンドウに相対: `clientX` と `clientY`.
2. ドキュメントに相対: `pageX` と `pageY`.
-例えば、 500x500 サイズのウィンドウを持っていて、マウスが左上端にあるとき、`clientX` と `clientY` は `0` です。そして、マウスが中央にある場合、ドキュメント内のどの場所にあっても、`clientX` と `clientY` は `250` です。それらは `position:fixed` に似ています。
+ の章で、これらの違いについては既に説明しました。
+
+簡単に言うと、ドキュメント相対座標 `pageX/Y` はドキュメントの左上の端から数えた数値で、ページがスクールしても変わりません。一方、`clientX/Y` は現在のウィンドウの左上の端からになります。そのため、ページがスクロールされると値は変わります。
+
+例えば、 500x500 サイズのウィンドウがあり、マウスが左上端にあるとき、`clientX` と `clientY` はページがスクロールされているかに関係なく `0` です。
+
+そして、マウスが中央にある場合、ドキュメント内のどの場所にあっても、`clientX` と `clientY` は `250` です。それらは `position:fixed` に似ています。
````online
-入力フィールドにマウスを移動し `clientX/clientY` を見てみてください (それは `iframe` の中にあるので、座標は `iframe` への相対です)。:
+入力フィールドにマウスを移動し `clientX/clientY` を見てみてください (例は `iframe` の中にあるので、座標は `iframe` への相対です):
```html autorun height=50
```
````
-ドキュメント相対座標は、ドキュメントの左上端から数え得られます。ウィンドウではありません。
-座標 `pageX`, `pageY` はドキュメントレベルでの `position:absolute` に似ています。
-
-チャプター で座標についてより知ることができます。
-
-## マウスダウンで選択をしない
-
-マウスクリックは邪魔になる副作用があります。ダブルクリックするとテキストを選択します。
+## マウスダウンでの選択を防ぐ
-もし独自のクリックイベントを処理したい場合、"余分な" 選択はいまいちに見えます。
+マウスのダブルクリックは、インターフェースによってはじゃまになる副作業があります。
-例えば、下のテキストのダブルクリックは、我々のハンドラに加えてそのテキストを選択します。:
+例えば、下のテキストをダブルクリックすると、ハンドラに加えてそのテキストを選択します:
```html autorun height=50
Double-click me
```
-選択を止めるために、CSS を使う方法があります: [CSS UI Draft](https://www.w3.org/TR/css-ui-4/) にある `user-select` プロパティです。
+左のマウスボタンを押した後、離さずにマウスを動かすとそれも選択範囲になりますが、この動作はしばしば望まれないことがあります。
-ほとんどのブラウザはプレフィックス付きでサポートしています:
+選択を防ぐ方法はいくつかあり、 の章を読んでください。
-```html autorun height=50
-
-
-Before...
-
- Unselectable
-
-...After
-```
-
-これで、"Unselectable" のダブルクリックをしても、選択されていません。動作しているように見えます。
-
-...しかし、潜在的な問題があります! テキストは本当に選択不能になります。たとえユーザが "Before" から選択を開始し、"After" まで選択したとしても、その選択は "Unselectable" の部分はスキップされます。私たちは本当にそのテキストを選択不可にしたいですか?
-
-殆どの場合、そうではありません。ユーザは、コピーまたはその他の必要性のために、テキストを選択する正当な理由がある可能性があります。 もしユーザにそれをさせることを許さなければ、それは邪魔になるかもしれません。 そのためこの解決策はそれほど良いものではありません。
-
-私たちが欲しいものは、ダブルクリックで選択を防ぐ、それだけです。
-
-テキスト選択は `mousedown` イベントにおけるデフォルトブラウザアクションです。したがって、代わりの解決策は `mousedown` を処理し、それを防ぐことです。次のようになります:
+この特定のケースで、最も理にかなった方法はブラウザの `mousedown` のアクションを無効にすることです。これで、これらの選択を防ぐことができます:
```html autorun height=50
Before...
@@ -191,29 +177,12 @@ Before...
...After
```
-今や、太字の要素はダブルクリックでは選択されません。
-
-一方、その中のテキストは依然として選択可能です。選択はテキスト自身ではなく、その前後から始める必要があります。通常それは問題ありません。
+これで太字部分の要素はダブルクリックで選択されません。また左ボタンを押しても選択は開始されません。
-
-````smart header="選択のキャンセル"
-選択を *防ぐ* 代わりに、イベントハンドラの中で、"事後に" キャンセルすることができます。
-
-このようにします:
-
-```html autorun height=50
-Before...
-
- Double-click me
-
-...After
-```
-
-太字の要素をダブルクリックすると、選択を表示され、その後すぐに消えます。良くは見えませんが。
-````
+補足: 内側のテキストは依然として選択可能です。ですが、選択はそのテキスト自身ではなく、その前後から始める必要があります。通常ユーザにとってこれは問題になりません。
````smart header="コピーを防止する"
-コピー・ペーストからコンテンツを保護するために選択を無効にしたい場合、別のイベントを使用することができます: `oncopy`
+ページのコンテンツをコピーペーストから守るために選択を無効にしたい場合は、別のイベントが利用できます: `oncopy`
```html autorun height=80 no-beautify
@@ -222,25 +191,22 @@ Before...
If you know JS or HTML, then you can get everything from the page source though.
```
-`` でテキストの一部をコピーしようとすると動作しません。なぜならデフォルトアクション `oncopy` が防止されているためです。
+` ` のテキストの一部をコピーしようとしても動作しません。なぜならデフォルトアクション `oncopy` が防止されているためです。
-確かに、ユーザーがHTMLソースを開くことを止めることはできませんが、誰もがHTMLソースを開く方法を知っているわけではありません。
+確かに、ユーザーがページのHTMLソースを開き、そこからコンテツを取ることを止めることはできません。が、誰もがHTMLソースを開く方法を知っているわけではありません。
````
## サマリ
-マウスイベントは次のプロパティを持っています:
+マウスイベントには次のプロパティがあります:
-- ボタン: `which`.
+- ボタン: `button`.
- 修飾子 (押された場合 `true`): `altKey`, `ctrlKey`, `shiftKey` と `metaKey` (Mac).
- - `key:Ctrl` を処理したい場合、Mac ユーザを忘れてはいけません、彼らは `key:Cmd` を使うので、`if (e.metaKey || e.ctrlKey)` とチェックするのが良いです。
+ - `key:Ctrl` を扱いたい場合に Mac ユーザを忘れてはいけません、Mac では `key:Cmd` を使うので、`if (e.metaKey || e.ctrlKey)` とチェックするのが良いです。
- ウィンドウ相対座標: `clientX/clientY`.
- ドキュメント相対座標: `pageX/clientX`.
-下記のタスクでは、選択をクリックの不要な副作用として扱うことも重要です。
+`mousedown` のブラウザのデフォルトアクションはテキストの選択ですが、インターフェースにとってそれが良くない場合には選択を止めるべきです。
-それにはいくつかの方法があります、例えば:
-1. CSS プロパティ `user-select:none` (ブラウザプレフィックス付きで)はそれを完全に無効にします。
-2. `getSelection().removeAllRanges()` を使って選択を事後にキャンセルします。
-3. `mousedown` を処理し、デフォルトアクションを防ぎます(通常はこれがベストです)。
+次の章では、ポインタの動きに関するイベントと、ポインタの下の要素の変化を追跡する方法についてより詳しく見ていきます。
diff --git a/2-ui/3-event-details/1-mouse-events-basics/head.html b/2-ui/3-event-details/1-mouse-events-basics/head.html
index 461f0e85bd..815428a2c4 100644
--- a/2-ui/3-event-details/1-mouse-events-basics/head.html
+++ b/2-ui/3-event-details/1-mouse-events-basics/head.html
@@ -1,47 +1,50 @@
diff --git a/2-ui/3-event-details/10-onload-ondomcontentloaded/article.md b/2-ui/3-event-details/10-onload-ondomcontentloaded/article.md
deleted file mode 100644
index e7834b5f19..0000000000
--- a/2-ui/3-event-details/10-onload-ondomcontentloaded/article.md
+++ /dev/null
@@ -1,245 +0,0 @@
-# ページのライフサイクル: DOMContentLoaded, load, beforeunload, unload
-
-HTML ページのライフサイクルは、3つの重要なイベントを持っています:
-
-- `DOMContentLoaded` -- ブラウザが HTML を完全に読み込み、DOM ツリーは構築されましたが、写真 ` ![]() ` のような外部リソースやスタイルシートはまだ読み込まれていない可能性があります。
-- `load` -- ブラウザがすべてのリソース(画像, スタイルなど)を読み込みました。
-- `beforeunload/unload` -- ユーザがページを離れようとしているとき。
-
-それぞれのイベントが役に立つ場合があります:
-
-- `DOMContentLoaded` イベント -- DOMは準備できたので、ハンドラは DOM ノードを調べ、インタフェースを初期化することができます。
-- `load` イベント -- 追加のリソースがロードされ、画像のサイズなどが取得できます(HTML/CSSで指定されていない場合)。
-- `beforeunload/unload` イベント -- ユーザが離れようとしており、ユーザが行ったページ上での変更を保存するかを確認したり、本当に離れたいかを尋ねることができます。
-
-これらのイベントの詳細について見ていきましょう。
-
-[cut]
-
-## DOMContentLoaded
-
-`DOMContentLoaded` イベントは `document` オブジェクトで発生します。
-
-キャッチするためには `addEventListener` を使わなければなりません:
-
-```js
-document.addEventListener("DOMContentLoaded", ready);
-```
-
-例:
-
-```html run height=200 refresh
-
-
- 
-```
-
-例では、`DOMContentLoaded` ハンドラはドキュメントがロードされたときに実行され、ページ読み込みは待ちません。したがって、`alert` で表示されるサイズはゼロです。
-
-一見すると、`DOMContentLoaded` イベントはとてもシンプルです。DOM ツリーが準備できた -- ここのイベントです。しかし、特徴はほとんどありません。
-
-### DOMContentLoaded と scripts
-
-ブラウザが最初にHTMLをロードし、テキスト中の `` に出くわすと、DOM の構築を続けることができません。すぐにスクリプトを実行する必要があります。そのため、このようなスクリプトがすべて実行された後にのみ `DOMContentLoaded` は発生する可能性があります。
-
-外部スクリプト (`src` を持つもの) も、スクリプトがロードされ実行されている間はDOM の構築は一時停止します。したがって、`DOMContentLoaded` は外部スクリプトも待ちます。
-
-唯一の例外は、`async` や `defter` 属性をもつ外部スクリプトです。これらは、ブラウザにそのスクリプトは待たずに処理を続けるよう言います。なので、ユーザはスクリプトのロードが終わる前にページを見ることができ、パフォーマンスに良いです。
-
-```smart header="`async` と `defer` に関する言葉"
-属性 `async` と `defer` は外部スクリプトに対してのみ動作します。`src` がない場合には無視されます。
-
-どちらも、ブラウザにページでの処理をつづけるよう言い、"バックグラウンド" でスクリプトをロードします。その後、ロードできたらスクリプトを実行します。したがって、スクリプトは DOM の構築とページレンダリングをブロックしません。
-
-そららの間に2つの違いがあります。
-
-| | `async` | `defer` |
-|---------|---------|---------|
-| 順番 | `async` を持つスクリプトは *読み込んだもの順* で実行します。ドキュメント順は関係ありません -- 最初にロードされたものが最初に実行されます。 | `defer` を持つスクリプトは常に *ドキュメント順* で実行されます。 |
-| `DOMContentLoaded` | `async` を持つスクリプトは、ドキュメントがまだ完全にダウンロードされていなくても実行されることがあります。これはスクリプトが小さい or キャッシュされており、ドキュメントが十分長い場合に発生します。 | `defer` を持つスクリプトは、ドキュメントがロードされ、パースされた後(必要に応じて待機する)に実行されます。`DOMContentLoaded` の直前です。|
-
-そのため、`async` は完全に独立したスクリプトに対して使われます。
-
-```
-
-### DOMContentLoaded と styles
-
-外部のスタイルシートは DOM には影響しないので、`DOMContentLoaded` はそれらを待ちません。
-
-しかし、落とし穴があります: スタイルの後にスクリプトがある場合、そのスクリプトはスタイルシートが実行されるのを待たなければなりません。:
-
-```html
-
-
-```
-
-この理由は、上の例のように、スクリプトが座標や他のスタイルに依存した要素のプロパティを取得したい場合があるためです。当然、それはスタイルがロードされるのを待たなければいけません。
-
-`DOMContentLoaded` がスクリプトを待つので、その前のスタイルも同様に待つことになります。
-
-### 組み込みのブラウザの自動入力
-
-Firefox, Chrome や Opera の自動入力は `DOMContentLoaded` で起こります。
-
-例えば、ページがログインとパスワードのフォームを持っていて、ブラウザがその値を覚えていた場合、 `DOMContentLoaded` でそれらを自動入力しようとする場合があります(ユーザが許可している場合)。
-
-なので、読み込みに時間のかかるスクリプトによって `DOMContentLoaded` が延びると、自動入力もまた待ちます。恐らくあなたもサイトによっては見たことがあるでしょう(ブラウザの自動入力を利用している場合) -- ログイン/パスワードフィールドの自動入力がすぐにはされず、ページが完全にロードされるまで遅延があります。実際、それは `DOMContentLoaded` イベントまでの遅延です。
-
-外部スクリプトに対して `async` や `defer` を使う小さなメリットの1つは -- `DOMContentLoaded` をブロックせず、ブラウザの自動入力に遅延がないことです。
-
-## window.onload
-
-`window` オブジェクトの `load` イベントはスタイルや画像、その他リソースを含めページ全体が読み込まれたときにトリガされます。
-
-下の例では、`window.onload` がすべての画像を待つため、画像サイズを正しく表示します。:
-
-```html run height=200 refresh
-
-
- 
-```
-
-## window.onunload
-
-訪問者がページを離れるとき、`unload` イベントが `window` でトリガされます。そこでは、関連するポップアップウィンドウを閉じるなど、遅延なく何かをすることができます。しかし、別のページへの遷移をキャンセルすることはできません。
-
-そのためには、別のイベント `onbeforeunload` を使う必要があります。
-
-## window.onbeforeunload
-
-訪問者がページを離れ始めたり、ウィンドウを閉じようとした場合、`beforeunload` ハンドラで追加の確認を尋ねることができます。
-
-質問の文字列を返す必要があります。ブラウザはそれを表示します。
-
-例えば:
-
-```js
-window.onbeforeunload = function() {
- return "There are unsaved changes. Leave now?";
-};
-```
-
-```online
-下の ` |