diff --git a/README.md b/README.md
index 837278aa..d5288503 100644
--- a/README.md
+++ b/README.md
@@ -1,15 +1,21 @@
-JavaScript Training
-===================
+2日でできる JavaScriptTraining
+==============================
JavaScript 初心者が JS の未来を見据えつつ、
基礎をひととおり身に付けるための資料です。
+この README は `npm run presentation` で
+再生することができます。
+
+
+
セットアップ
------------
+
### 1. 環境をセットアップ
この研修では [Google Chrome](https://www.google.co.jp/chrome/browser/desktop/index.html) を利用します。
@@ -19,6 +25,7 @@ JavaScript 初心者が JS の未来を見据えつつ、
こちらも上のリンクからインストールしてください。
+
### 2. JavaScriptTraining を fork
JavaScriptTraining の学習履歴を残すために、
@@ -26,6 +33,9 @@ JavaScriptTraining リポジトリを fork します。
画面右上にある fork ボタンを押してください。
+[
](http://mixi-inc.github.io/JavaScriptTraining/images/fork-button.png)
+
+
### 3. 必要なものをダウンロード
@@ -36,6 +46,7 @@ JavaScriptTraining リポジトリを fork します。
git clone コピーしたURL
+
### 4. セットアップ
下のコマンドをターミナルで実行してください。
@@ -44,6 +55,7 @@ JavaScriptTraining リポジトリを fork します。
npm run setup
+
### 5. webサーバーを立ち上げる
下のコマンドをターミナルで実行してください。
@@ -54,6 +66,7 @@ JavaScriptTraining リポジトリを fork します。
npm run serve
+
### 6. トップページにアクセスする
ブラウザから [http://localhost:8000](http://localhost:8000) へ
@@ -67,6 +80,7 @@ JavaScriptTraining リポジトリを fork します。
------------------------
+
### JavaScript とは
> JavaScript はウェブの言語です。
@@ -78,6 +92,7 @@ JavaScriptTraining リポジトリを fork します。
> (JavaScript パターン, O'Reilly)
+
### JavaScript のすごいところ
> クラスというものがなく、
@@ -87,6 +102,7 @@ JavaScriptTraining リポジトリを fork します。
> (JavaScript パターン, O'Reilly)
+
> Java や PHP が追加しはじめた
> クロージャーや無名関数といった
> 機能は、JavaScript 開発者が
@@ -96,6 +112,7 @@ JavaScriptTraining リポジトリを fork します。
> (JavaScript パターン, O'Reilly)
+
### 楽しんできた機能???
```javascript
@@ -107,6 +124,7 @@ JavaScriptTraining リポジトリを fork します。
(クロージャーはトレーニングで扱います)
+
### JavaScript はどこで動くのか
- Web ブラウザ
@@ -118,6 +136,7 @@ JavaScript の特色のひとつは、ブラウザ上で
JavaScript がよく使われます。
+
### いつ JavaScript を使うのか
- Web ページに独自の動きをつけたいとき
@@ -131,6 +150,7 @@ JavaScript がよく使われます。
(タスクランナーとかパッケージマネージャ)
+
### JavaScript を使うと…
- アニメーションの例: [Si digital](http://sidigital.co/)
@@ -143,6 +163,7 @@ JavaScript に会いにいこう
-------------------------
+
### 1. 開発ツールを開く
Chrome で [http://localhost:8000](http://localhost:8000) を開きます。
@@ -156,6 +177,7 @@ Web ページの適当な場所で
- Windows の人:Ctrl + Shift + i
+
### 2. Console を開く
開発ツールを選択し、Esc キーを
@@ -165,6 +187,9 @@ Web ページの適当な場所で
この Console から、JavaScript を
実行することができます。
+[
](http://mixi-inc.github.io/JavaScriptTraining/images/console.png)
+
+
### 3. 何か実行してみる
@@ -173,11 +198,13 @@ Web ページの適当な場所で
アラートポップアップが表示されます。
+
### 4. 計算させてみる
`1 + 1` や `'Foo' + 'Bar'` なども実行できますね。
+
### 5. 変数代入・参照してみる
変数代入・参照もできますね。
@@ -188,7 +215,8 @@ foo;
```
-### 6. ブラウザオブジェクトをいじってみる
+
+### 6. ブラウザオブジェクトをいじる
ブラウザオブジェクトもいじってみましょう。
@@ -199,6 +227,7 @@ document.title = 'あなたとjava 今すぐダウンロード';
Chrome のタブ名が書き変わりました。
+
### 7. ページを再読み込みすると戻る
ページを再読み込みしてみてください。
@@ -208,6 +237,7 @@ Chrome のタブ名が書き変わりました。
できないということですね!)
+
### 8. JavaScript とここで会える
- スクリプト読み込みパターン(推奨)
@@ -234,31 +264,40 @@ Chrome のタブ名が書き変わりました。
(あるいはポエム)
+
JavaScript を効率的に書けるようにするために
最低限の開発環境を整えます。
+
JavaScript に精通していない人に
「どんなツールを使ったらいいですか?」と
聞かれることがよくあります。
-私は、「構文ハイライトと lint を使うといいですよ」、
+私は「構文ハイライトと lint を使うといいですよ」、
と答えることにしています。
[
](http://mixi-inc.github.io/JavaScriptTraining/images/syntax-error.png)
+
+ひとつエピソードを紹介します。
+
+
+
JavaScript には静的型検査がないことや、
記号が多い構文や、まずい仕様がいくつもあるので、
ミスを犯しやすい言語の一つです。
+
たとえば、JavaScript には `"use strict"` という
宣言があります。この宣言は JavaScript の
まずい仕様の一部をエラーにすることで修正を
促す効果があり、よく記述を推奨される宣言です。
+
あるプロジェクトで気を利かした
プログラマーが `"use strict"` を
新しいスクリプトで使い始めました。
@@ -273,6 +312,7 @@ JavaScript には静的型検査がないことや、
するよい方法です!
+
しかし、リリース後、新しいスクリプトとは
関係ないはずの JavaScript による
メニューが動作しなくなっていました。
@@ -280,6 +320,7 @@ JavaScript には静的型検査がないことや、
なぜでしょうか?
+
これは、パフォーマンスチューニングの一環で
複数の JavaScript ファイルを結合していたこと、
ファイルに対する `"use strict"` を利用していた
@@ -292,10 +333,12 @@ JavaScript には静的型検査がないことや、
なってしまっていたのでした。
-このミスは、いわゆる**初見殺し**です。
-「何それどうしてそんな仕様なの😱」というのが
-正常なプログラマの反応だと思います。
+このエピソードは、いわゆる**初見殺し**です。
+
+「何それどうしてそんな仕様なの😱」
+と言いたくなりますね。
+
悲しいことに、このような落とし穴は
@@ -306,8 +349,11 @@ JavaScript の仕様・文化に数多く
防げるのでしょうか?
-ESLint や JSHint、 JSLint のような lint を
-使いましょう。たとえば、ESLint を実行すると
+
+[ESLint](http://eslint.org/) や [JSHint](http://jshint.com/)、 [JSLint](http://www.jslint.com/) のような lint を
+使いましょう。
+
+たとえば、ESLint を実行すると
下のような警告が出されます。これによって、
潜在的な不具合をだいぶ減らせるようになるのです。
@@ -315,6 +361,7 @@ ESLint や JSHint、 JSLint のような lint を
(関数形式の "use strict" を使ってね)
+
ミスを防ぐためには、「頑張る」とか
「注意する」のような精神論ではなく、
lint によって防止することが必要です。
@@ -322,6 +369,7 @@ ESLint や JSHint、 JSLint のような lint を
あれば、真っ先にいれるべきは lint なのです。
+
1. lint をかけてみる
ターミナルで下のコマンドを実行してください。
@@ -349,6 +397,7 @@ ESLint や JSHint、 JSLint のような lint を
DOM 要素を取得するトレーニング
+
#### DOM とは
Web ページは HTML のタグによって
@@ -361,6 +410,7 @@ Web ページは HTML のタグによって
Web ページが構成されていることがよくわかります。
+
この HTML タグは下のような木構造をとっています。
[
](http://mixi-inc.github.io/JavaScriptTraining/images/github-elements.png)
@@ -371,6 +421,7 @@ Web ページが構成されていることがよくわかります。
構造を確認してみてください。
+
DOM (Document Object Model) は、この HTML のタグを
JavaScript の世界で操作することができる API です。
@@ -378,6 +429,7 @@ HTML タグは、JavaScript の世界で
DOM 要素というオブジェクトとして扱われます。
+
[
](http://mixi-inc.github.io/JavaScriptTraining/images/github-tree.png)
HTML のタグを JavaScript 側で操作するためには
@@ -388,6 +440,7 @@ JavaScript の世界へと取ってこなければなりません。
取得するという操作について学びます。
+
HTML タグには、目印となるいくつかの情報が
付属しています。たとえば、下の div タグには
ID 属性が付属しています。
@@ -404,18 +457,14 @@ var div = document.getElementById('foo');
```
-他にも CSS クラスやタグ名、
+
+他にも CSS クラスやタグ名、その他の属性から、
+DOM 要素を取得することができます。
```html
](http://mixi-inc.github.io/JavaScriptTraining/images/css-selector-example.png)
-CSS セレクタについては、[MDN のCSS リファレンス](https://developer.mozilla.org/ja/docs/Web/CSS/Reference#Selectors) が
+CSS セレクタについては、[MDN のCSS リファレンス](https://developer.mozilla.org/ja/docs/Web/CSS/Reference#Selectors) が
参考になります。
仕様を見ないと我慢ならぬ!という立派な方は、
[セレクタ Level 3 仕様](http://standards.mitsue.co.jp/resources/w3c/TR/css3-selectors/) を見るとよいでしょう。
+
#### 実習
下のテストが green になるように、
@@ -487,6 +539,7 @@ CSS セレクタについては、[MDN のCSS リファレンス](https://develo
DOM 要素のスタイルを変更するトレーニング
+
#### DOM 要素のスタイル
DOM 要素には、
@@ -501,6 +554,7 @@ DOM 要素には、
参照してください)
+
このうち、スタイル属性を編集すると、DOM 要素の
見た目を変化させることができます。
@@ -510,6 +564,7 @@ style.color 属性を変更してみました。
[
](http://mixi-inc.github.io/JavaScriptTraining/images/octocats.png)
+
このスタイル属性は CSS の仕様と対応するように
定められています。
@@ -524,6 +579,7 @@ JavaScript は見た目の変更のきっかけを
HTML/JavaScript/CSS 分業の基本です。
+
残念なお知らせですが、
今回のトレーニングは CSS を
書けるようになることが目的ではないので、
@@ -531,9 +587,11 @@ HTML/JavaScript/CSS 分業の基本です。
学びます。
+
レガシー… 😱
+
まあ、肩を落とさないでください。
レガシーとはいえ、レガシーブラウザーを
@@ -545,6 +603,7 @@ HTML/JavaScript/CSS 分業の基本です。
大事にしてください。
+
#### 実習
下のテストが green になるように、
@@ -560,6 +619,7 @@ HTML/JavaScript/CSS 分業の基本です。
DOM の構造を変更するトレーニング
+
#### DOM の構造
このステージでは、DOM のスタイルではなく、
@@ -570,6 +630,7 @@ DOM の構造を変更するトレーニング
DOM の構造を変更する必要性を考えてみます。
+
書籍検索サービスの API は、検索結果を
下のように返したとしましょう。
@@ -592,6 +653,7 @@ DOM の構造を変更する必要性を考えてみます。
```
+
このとき、画面に表示するために下のような HTML を
追加することになります。
@@ -614,6 +676,7 @@ DOM の構造を変更する必要性を考えてみます。
```
+
サーバー側で上のような HTML を
生成してもよいのですが、
JavaScript による DOM 構造の操作に
@@ -623,11 +686,13 @@ JavaScript による DOM 構造の操作に
(ページのリロードが必要ないからですね!)
+
このように、Web サービスの使いやすさを
追求するためには、JavaScript による
DOM 構造の操作が重要なのです。
+
#### 実習
下のテストが green になるように、
@@ -643,6 +708,7 @@ DOM 構造の操作が重要なのです。
DOM イベントを利用するトレーニング
+
### DOM イベント解説編
ユーザーがボタンを押したり、
@@ -655,6 +721,7 @@ DOM イベントをうけとることができます。
+
click イベント以外にも多様なイベントがあります:
- dblclick: 要素上でダブルクリックされたとき
@@ -670,14 +737,22 @@ click イベント以外にも多様なイベントがあります:
参照するとよいでしょう。
+
試しに、このページを制御する JavaScript が
監視しているイベントを見てみましょう。
開発ツールを開き、Elements タブの中段にある
Event Listeners タブを開いてみてください。
+
+
[
](http://mixi-inc.github.io/JavaScriptTraining/images/chrome-dev-tool-event-debugging.png)
+たくさんのイベントが登録されていますね。
+
+では、これらのイベントの使い方を解説していきます。
+
+
#### DOM イベント実装編
@@ -709,6 +784,7 @@ DOM のイベントを JavaScript 側で監視するには、
```
+
このうち、 `addEventListener` スタイルが
お行儀のよい方法だといわれ、
推奨されてきました。
@@ -721,7 +797,8 @@ button.addEventListener('click', function(event) {
```
-しかし、AngularJS という最近の
+
+しかし、[AngularJS](https://angularjs.org/) という最近の
フレームワークでイベント属性スタイルを
積極的に採用する動きもあります。
@@ -738,12 +815,14 @@ button.addEventListener('click', function(event) {
従うとよいでしょう。
+
### DOM イベント伝搬の仕組み
次に、DOM のイベント伝搬(propagation)
について解説します。
+
下のようなボタンを例に、伝搬の必要性を
考えていきます。このボタンは、アイコンつきで
表示されることを意図しています。
@@ -752,22 +831,28 @@ button.addEventListener('click', function(event) {
```
-この button 要素の click イベントを
+この button 要素の `click` イベントを
監視することを考えます。
-button 要素に addEventListener すればよいように
+button 要素に `addEventListener` すればよいように
見えますが、アイコン画像をクリックされた場合
どうなるのでしょうか?
+
実は、子要素で発生した DOM イベントは
親要素からも監視することができます。
この仕組みが DOM イベントの伝搬です。
+
+[