イベント


## まず最初によく使われるイベントを以下にまとめます。

|イベント名|意味|
|:-----------|:----------------------------|
|onload      |読み込みが終わったとき           |
|onresize    |ウィンドウの幅が変わったとき      |
|onclick     |マウスでクリックしたとき         |
|ondblclick  |マウスでダブルクリックしたとき    |
|onmouseover |マウスカーソルがのったとき       |
|onmouseout  |マウスカーソルが外れたとき        |
|onmousedown  |マウスボタンを押したとき        |
|onmouseup  |マウスボタンを離したとき        |
|onkeydown  |キーボードのキーを押したとき        |
|onkeyup  |キーボードのキーを離したとき        |
|onfocus|フォーカスが当たったとき|
|onblur|フォーカスが外れたとき|
|onchange|フォームの値が変わったとき|
|onsubmit|フォームを送信したとき|

例-1
「ボタンを押したときにアラートを出す」というイベントの場合

```html

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja" dir="ltr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>test</title>
</head>
<body>

<button id='btn'>ボタン</button>

<script type="text/javascript">
window.onload = function() {

	//ボタン要素を取得
	var btn = document.getElementById('btn');

    // btnにクリックイベントを設定
    btn.onclick = function() {
        //クリックしたらアラートを出す
        alert('clicked');
    };
    
};

</script>

</html>

```
![イベント001.png](https://qiita-image-store.s3.amazonaws.com/0/35975/2a2378f2-6e19-e0a7-acbd-73c1307df8d6.png "イベント001.png")

## 要素のプロパティによるイベント設定の欠点

欠点、、、それは１つのイベントで２つの処理を行えない事です。
以下を見てください。

```html

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja" dir="ltr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>test</title>
</head>
<body>

<div id='box'>This is box</div>
<button id='btn'>box</button>



<script type="text/javascript">
window.onload = function() {

    //要素を取得
    var btn = document.getElementById('btn');
    var box = document.getElementById('box');

    
    // 背景色を赤くするイベント
    btn.onclick = function() {
        box.style.backgroundColor = 'red';
    };

    // クリックしたらアラートを出す
    btn.onclick = function() {
        alert('clicked');    
    };
    
};

</script>

</html>

```

![DOM003.png](https://qiita-image-store.s3.amazonaws.com/0/35975/9ec1da32-0324-6dfc-df16-d85e57358914.png "DOM003.png")

↑この様に１つ目のイベント「背景色の変更」は上書きされて無効になる。

そこで次の様な書き方で対処します。↓

## addEventListenerによるイベントの設定

addEventListenerという関数を使うと、１つのイベントで２つの処理を同時に行える様になります。

書き方は以下の様になります↓

```js
対象の要素.addEventListener(何か起きたら, 何かする, false);
```
最後に`false`を必ず入れなければなりません。(理由は残念ながら僕も分かりませんが`false`を入れて初めて完結します)


例は以下の通り↓

```html

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja" dir="ltr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>test</title>
</head>
<body>

<div id='box'>This is box</div>
<button id='btn'>box</button>



<script type="text/javascript">
window.onload = function() {

    //要素を取得
    var btn = document.getElementById('btn');
    var box = document.getElementById('box');

    
    // 背景色を赤くするイベント
    btn.addEventListener('click', function() {
        box.style.backgroundColor = 'red';
    }, false);

    // アラートを出すイベント
    btn.addEventListener('click', function() {
        alert('clicked');
    }, false);
};

</script>

</html>

```

![DOM004.png](https://qiita-image-store.s3.amazonaws.com/0/35975/2a59e9ec-85e6-f03a-3fde-979d499ce589.png "DOM004.png")

↑の様に「ボタンクリック」という１つのイベントで２つの処理が同時に行えた。

## addEventListenerの弱点

IE7やIE6などに対応していないことです。

この様に、onclickのようなオブジェクトのプロパティにイベントを設定する方法と、addEventListenerを使った方法は一長一短です。

対策としては後ほど出てくる、jQueryを使えば、これらの良いところを合わせたイベントの処理が出来るようになります。

## window.onload

これまでDOMの構文で文頭に必ず書いていた`window.onload`についての解説をします。

なぜ`window.onload`を書くか？

①下の様な順番で書くと↓

```html

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja" dir="ltr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>test</title>
</head>
<body>

<script type="text/javascript">

// idがboxの要素を取得
var box = document.getElementById('box');

// 要素が取得出来てるかをチェック
console.log(box); //=> null

</script>

<!--後でにbox要素を書く -->
<div id="box">This is box</div>

</html>

```

コンソールログを見ると「null」と要素が取得出来てない事が分かる。(This is boxの表示はdivタグで括って出てる単なるテキストとして出ているだけ)

![null001.png](https://qiita-image-store.s3.amazonaws.com/0/35975/ffc44a4e-7ae6-94e7-e000-117c07cfd232.png "null001.png")

②それでは先にdivタグを入れてその後に要素取得なら？

↓の様にコンソールに`<div id="box">This is box</div>`と`in=box`の要素が取得できてる事が分かる。

```html

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja" dir="ltr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>test</title>
</head>
<body>

<!--先にbox要素を書く -->
<div id="box">This is box</div>

<script type="text/javascript">

// idがboxの要素を取得
var box = document.getElementById('box');

// 要素が取得出来てるかをチェック
console.log(box); //=> <div id="box">

</script>

</html>

```

![null002.png](https://qiita-image-store.s3.amazonaws.com/0/35975/a3abbff6-73fc-cb53-a396-1f9ef36358dd.png "null002.png")

③window.onload ------ 「HTMLの読み込みが終わったら」を利用する。

`window.onload`使う事によって「HTMLの読み込みが終わったとき」に処理を実行できる様になります。

改めて、使用した場合のコードを書くと以下の様になります。↓

```

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja" dir="ltr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>test</title>
</head>
<body>

<div id="box">This is box</div>

<script type="text/javascript">

window.onload = function() {

// idがboxの要素を取得
var box = document.getElementById('box');

// 要素が取得出来てるかをチェック
console.log(box); // <div id="box">This is box</div>

}
</script>

</html>

```

↓同様にコンソールに`<div id="box">This is box</div>`と表示されてるのが分かる。

![null003.png](https://qiita-image-store.s3.amazonaws.com/0/35975/a5041601-88c0-9fd9-f1b5-39838baf5650.png "null003.png")

* window.onloadイベントの弱点
それは画像等の外部ファイルのダウンロードもすべて終了しないとイベントの処理が実行されない事です。
そこでこれから書くような方法があります。


## DOMContentLoaded --- 「HTMLを取得・操作可能な準備ができたら」というイベント

`DOMContentLoaded `イベントは、画像などのダウンロードは待たず、HTMLをJavaScriptから取得・操作可能な準備ができた時点で実行されるので、`window.onload`より早く処理出来ます。

書き方としては、`DOMContentLoaded `イベントは、要素のプロパティにイベントを設定する方法では設定できないので、

`addEventListener`を最初に入れる必要があります。

具体的には以下の様な書き方になります。↓

```html

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja" dir="ltr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>test</title>
</head>
<body>

<div id="box">This is box</div>

<script type="text/javascript">

document.addEventListener('DOMContentLoaded', function() {

// idがboxの要素を取得
var box = document.getElementById('box');

// 要素が取得出来てるかをチェック
console.log(box); // <div id="box">This is box</div>

}, false);
</script>

</html>

```

![null004.png](https://qiita-image-store.s3.amazonaws.com/0/35975/18644d13-c486-2792-e2b2-84cae6800111.png "null004.png")