jQuery　イベント汎用操作まとめ


jqueryイベント汎用操作まとめです。

#click/dblclick　クリックイベント

##準備

```html
<body>
  <h1>クリックイベントタイトル</h1>
  <p>こちらをクリックしてください</p>
</body>
```

```javascript
$(function() {
	// h1のクリックに処理を設定
	$("h1").click(function() {
		console.log("h1 タイトルをクリック");
	});

	// pのクリック用の処理
	var pClick = function() {
		console.log("p 本文をクリック");
	};
	var pWClick = function() {
		console.log("p 本文をダブルクリック");
	};

	// pのクリック、ダブルクリックに処理を設定
	$("p").click(pClick);
	$("p").dblclick(pWClick);
});
```

##実行結果
[![Image from Gyazo](https://i.gyazo.com/4bbc37be3b4d6cce15dea8a7ca3e7047.gif)](https://gyazo.com/4bbc37be3b4d6cce15dea8a7ca3e7047)

##解説
クリックイベント/ダブルクリックイベントで
それぞれコンソールにテキストを出力しています

#change submit serialize  フォーム/シリアライズ系イベント
##準備

```html
  <body>
    <form id="f">
      名前:<input type="text" name="name"><br>
      性別
      <label><input type="radio" name="sex" value="m">男</label>
      <label><input type="radio" name="sex" value="f">女</label>
      <br>
      <label>
        <input type="checkbox" name="tos" value="ok">
        利用規約の確認
      </label>
      <br>
      <input type="submit">
    </form>
  </body>
```

##実行結果

[![Image from Gyazo](https://i.gyazo.com/dad7cfb1f3cb66ed0457eb243d6fc2d3.png)](https://gyazo.com/dad7cfb1f3cb66ed0457eb243d6fc2d3)

##解説

###.change()　変更を検出する

ラジオボタンを変更した時に情報をコンソールに出力します

```javascript
$(":radio").change(function() {
		let name = $(this).attr("name");
		let val = $(this).val();
		console.log(name, val);
	});
```

.changeメソッドで値の変化を検出する関数を作成します

.attr()メソッドは選択したフォームのname属性を取得します（ここではsex）

.val()メソッドはvalueの値を取得します（ここではm/f）

####結果
[![Image from Gyazo](https://i.gyazo.com/8eda672131b7bfdf98d0d615d7f8f7a8.gif)](https://gyazo.com/8eda672131b7bfdf98d0d615d7f8f7a8)

同様にチェックボックスと入力欄の変更を検出する関数を作る場合は以下です。

```javascript
	// チェックボックスの値変更
	$(":checkbox").change(function() {
		let name = $(this).attr("name");
		let isChecked = $(this).prop("checked");
		console.log(name, isChecked);
	});

	// 入力欄の値変更
	$(":text").change(function() {
		var name = $(this).attr("name");
		var val = $(this).val();
		console.log(name, val);
	});
```

.prop(条件)メソッドは条件を判定してtrue/falseを返します（ここでは"checked"の有無）

###.submit .serialize() .serializeArray()　データを送信する/送信したデータを取得する

```javascript
// submitの処理
$("#f").submit(function() {
  console.log(this);
  // フォームデータのシリアライズ		  
    console.log($(this).serialize());
    console.log($(this).serializeArray());
  // イベントを停止
    return false;
 });
```
####実行結果
[![Image from Gyazo](https://i.gyazo.com/3750d039a868c0253962d5aa3df7ab6f.png)](https://gyazo.com/3750d039a868c0253962d5aa3df7ab6f)

####解説
.submit()メソッドはsubmitボタンではなくフォーム全体を指定します（コンソール１行目）

.serialize()メソッドではデータとして送信する値を取得できます（コンソール２行目）

.serialiezeArray()メソッドではデータとして送信する値を配列にして取得します(コンソール３行目）

最後にreturn falseとしているのはイベントの伝搬を停止するために記述しています

#resize/scroll　ウィンドウ変化系イベント

##準備

```html
<body>
  <h1>サイズ変更タイトル</h1>
  <p>サイズ変更本文です</p>
</body>
```

```javascript
$(function() {
	// ウィンドウサイズ変更
	$(window).resize(function() {
		var w = $(window).width();
		var h = $(window).height();
		console.log(w, h);
	});

	// 行を増やす
	for (var i = 0; i < 5; i ++) {
		var p = $("p").clone();
		$("body").append(p);
	}

	// スクロールの処理
	$(window).scroll(function() {
		var top = $(window).scrollTop();
		console.log(top + "px");
	});
});
```
##実行結果
[![Image from Gyazo](https://i.gyazo.com/238608a5b37fc0bc49214feab70a3c84.gif)](https://gyazo.com/238608a5b37fc0bc49214feab70a3c84)

##解説

.resize()メソッドではwindow(ブラウザ)のサイズ変化を検出し
幅と高さをコンソールへ出力しています

.scroll()メソッドではまずfor文でp要素を.clone()メソッドにて複製し
.append()メソッドでbodyの末尾に挿入しています

スクロールできる状態ができたのでwindowをターゲットに
.scrollTop()メソッドで上からの位置を取得してコンソールへ出力しています

#focus/blur/focusin/focusout　フォーカス系イベント

##準備

```html
  <body>
    <div id="out" style="background: #faa; padding: 2em;">
      <input type="text" id="text1">
    </div>
    <input type="text" id="text2">
  </body>

```

```javascript
$(function() {
	// フォーカス
	$("#out, #text2").focus(function() {
		var id = $(this).attr("id");
		console.log("focus", id);
	});

	// ブラー
	$("#out, #text2").blur(function() {
		var id = $(this).attr("id");
		console.log("blur", id);
	});

	// フォーカス イン（子要素も対象）
	$("#out, #text2").focusin(function(e) {
		var id = $(this).attr("id");
		var idTrgt = $(e.target).attr("id");
		console.log("focusin", id, idTrgt);
	});

	// フォーカス アウト（子要素も対象）
	$("#out, #text2").focusout(function(e) {
		var id = $(this).attr("id");
		var idTrgt = $(e.target).attr("id");
		console.log("focusout", id, idTrgt);
	});
});
```

##実行結果
[![Image from Gyazo](https://i.gyazo.com/3be243472a0a64d8c956343488f0f5a2.gif)](https://gyazo.com/3be243472a0a64d8c956343488f0f5a2)

##解説

上段のテキストボックスはdivで囲まれたid=outに対してfucusイベントを設定しています。

そのため子要素を判定しないfocus/blurメソッドではid＝text1にフォーカスをしてもイベントは検知されません

子要素も検知対象とするfocusin/focusoutメソッドではthisのidとしてoutがイベントターゲット（e）のidとしてtext1が検出されます

直接id=text2に各メソッドを当てた場合はいずれもイベントが検出されます。