LoginSignup
14
12

More than 3 years have passed since last update.

JavaScriptのイベント

Last updated at Posted at 2020-01-12

イベントリスナー

イベントリスナーの追加

js
イベントターゲット.addEventListener(イベント名,リスナー,[オプション])

イベントリスナーの削除

js
removeEventListener(イベント名,リスナー,[オプション])

イベントリスナーを一度だけ呼び出す

addEventListenerのオプション 内容
capture キャプチャーフェーズで取得するかどうか(真偽値)
once リスナーの呼び出しを一回にするか(真偽値)
passive パッシブイベントかどうか(真偽値)

イベントの情報自体を取得する

MouseEventなどイベント自体の情報を取得する

eventは任意の文字列です。

js
button.addEventListener("click",(event)=>{
  console.log(event);
})

イベントが発生した要素を取得する

eventは任意の文字列です。

js
button.addEventListener("click",(event)=>{
  console.log(event.tareget);
})
js
//オプション指定
const option = {
  once: true
}

const clickAlart = () => {
  alert("クリックされた");
}

const button = document.querySelector("button");
button.addEventListener("click", clickAlart, option)

クリックイベント

イベント 内容
click 左ボタンシングルクリック
dblclick 左ボタンダブルクリック
contextmenu 右ボタンクリック
mousedown マウスのボタンを押した時
mouseup マウスのボタンを離した時
html
<button>ボタン</button>
js
const button = document.querySelector("button");
  button.addEventListener("click",()=>{
  console.log("クリックされた");
})

マウスイベント(クリックイベント以外)

イベント 内容
mousemove 対象エリア内でマウスを動かした時
mouseenter 対象エリアにカーソルが入った時
mouseleave 対象エリアからカーソルが出た時
mouseover 対象エリアにカーソルが入った時(バブリングあり)
mouseout 対象エリアからカーソルが出た時(バブリングあり)
mousewheel マウスホイールを回転させた時

バブリング:イベントが親要素や先祖要素に伝わることです。

js
対象エリア.addEventListener("mousemove",()=>{
 message.innerHTML="マウスが動いた";}
)
html
<div class="target""></div>
<p class="message"></p>
css
.target {
  height: 100px;
  background-color: red;
}
js
const message = document.querySelector(".message");

const target = document.querySelector(".target");

target.addEventListener("mousewheel", () => {
  message.innerHTML = "赤い領域内でマウスホイールが動いた";
})

マウスの座標を取得

マウスの座標 内容
event.clientX ブラウザ左上を基準としたX座標
event.clientY ブラウザ左上を基準としたY座標
event.offsetX 要素左上を基準としたX座標
event.offsetY 要素左上を基準としたY座標
event.pageX ページ左上を基準としたX座標
event.pageY ページ左上を基準としたY座標
event.screenX 画面左上を基準としたX座標
event.screenY 画面左上を基準としたY座標
js
対象エリア.addEventListener("mousemove",(event)=>{
  console.log(event.clientX,event.clientY);
});
html
<div class="target"></div>
css
.target {
  height: 100px;
  background-color: red;
}
js
//ターゲットの領域を取得
const target = document.querySelector(".target");

//ターゲットの領域内でマウスカーソルが動くたびに座標を表示
target.addEventListener("mousemove", (event) => {
  console.log(event.clientX, event.clientY);
})

タッチイベント

イベント 内容
touchstart タッチ開始時
touchmove タッチポイント移動時
touchend タッチ終了時
html
<p class="target"></p>
<p class="message"></p>
css
.target {
  height: 100px;
  background-color: red;
}
js
const text = document.querySelector(".target");
const message = document.querySelector(".message");

text.addEventListener("touchstart", () => {
    message.innerHTML = "タッチ開始";
});
text.addEventListener("touchmove", () => {
    message.innerHTML = "タッチムーブ";
});

text.addEventListener("touchend", () => {
    message.innerHTML = "タッチ終了";
});

タッチイベントの情報を取得する

プロパティ 内容
changedTouches タッチ情報の配列
clientX ブラウザ左上基準のX座標
clientY ブラウザ左上を基準としたY座標
offsetX 要素左上を基準としたX座標
offsetY 要素左上を基準としたY座標
pageX ページ左上を基準としたX座標
pageY ページ左上を基準としたY座標
screenX 画面左上を基準としたX座標
screenY 画面左上を基準としたY座標
タッチイベントとマウスイベントの違い 内容
タッチイベント 複数同時に起こる場合がある
マウスイベント 複数同時に起こらない
html
<p class="target"></p>
<p class="message"></p>
css
.target {
  height: 100px;
  background-color: red;
}
js
const target = document.querySelector(".target");
const message = document.querySelector(".message");

target.addEventListener("touchmove", () => {
  const touch = event.changedTouches;

  message.innerHTML = `${touch[0].pageX.toFixed(2)}<br>${touch[0].pageY.toFixed(2)}`;

});

toFixed(2)で小数点第2位までになるように四捨五入しています。

テキスト選択時

イベント 内容
selectstart テキスト選択開始時
html
<p class="text">ああああああああああああああ</p>
js
//ターゲットの取得
const text = document.querySelector(".text");

text.addEventListener("selectstart", () => {

  console.log("文字列の選択が開始された");

});

キーボードイベント

イベント 内容
keydown キーが押された時
keypress キーが押された時(文字キーのみ=修飾キー以外)
keyup キーが離された時

1つのキーを押して離した時、keydown→keypress→keyupの順番に発生します。

html
<textarea></textarea>
html
const textarea = document.querySelector("textarea");

textarea.addEventListener("keypress", () => {

  console.log("キーが押された");

});

入力されたキーを判定する

プロパティ 内容
key ボタンの値
keyCode ボタンのコード
code キーの名前
repeat キーを押しっぱなしにしているかどうか(真偽値)
isComposing 入力が未確定かどうか(真偽値)
html
<textarea></textarea>
js
const textarea = document.querySelector("textarea");


const keytype1 = (event) => {
  console.log(`値:${event.key}`);
  console.log(`コード:${event.keyCode}`);
  console.log(`名前:${event.code}`);
  console.log(`未確定?:${event.isComposing}`);

  console.log(`alt?:${event.altkey}`);
}

textarea.addEventListener("keyup", keytype1)


const keytype2 = (event) => {
  console.log(`押しっぱなし?:${event.repeat}`);
}

textarea.addEventListener("keydown", keytype2)

イベントを発火させる

メソッド 内容
dispatchEvent(イベント) イベントを発生させる
new Event("イベント名",[{detail:値}]) イベントを生成する

クリックしなくても、3秒後にクリックイベントを発火させる

html
<p class="target"></p>
js
const target=document.querySelector(".target");
target.addEventListener("click",()=>{
  target.innerHTML="クリックされた";
});

setTimeout(()=>{
  target.dispatchEvent(new Event("click"));
},3000);

デフォルトのイベントをキャンセルする

メソッド 内容
preventDefault() イベントのデフォルトの挙動をキャンセル

マウスホイールを無効化

js
document.querySelector(".target").addEventListener("wheel",(event)=>{
  event.preventDefault();
})

タッチ開始を無効化

js
document.querySelector(".target").addEventListener("touchstart",(event)=>{
  event.preventDefault();
})

ドラッグ&ドロップ

ドラッグする要素のイベント 内容
dragstart 要素のドラッグ開始時
drag ドラッグしている時
dragend ドラッグ終了時
ドラッグを受ける要素のイベント 内容
dragenter ドラッグしながら要素に入った時
dragover ドラッグしながら要素に存在するとき
dragleave ドラッグしながら要素から出た時
drop 要素をドロップしたとき
ドラッグのイベント情報 内容
event.dataTransfer.files ドロップされたファイル情報
html
<div id="startArea">
  <div id="target" draggable="true">
    <p id="targetword">Drag me!</p>
  </div>
</div>

<div id="goalArea">
</div>
css
body {
  position: relative;
}

#target {
  width: 98px;
  height: 98px;
  background-color: darkcyan;
  border: solid 1px #000;
  box-sizing: border-box;
}

#targetword {
  width: 100px;
  height: 100px;
  display: flex;
  align-items: center;
  justify-content: center;
  color: white;
  font-weight: bold;
  margin: 0;
}

#startArea {
  width: 100px;
  height: 100px;
  margin: 10px 0;
  border: solid 1px black;
  position: fixed;
  top: 10px;
  left: 10px;
  box-sizing: border-box;
}

#startword {
  display: flex;
  align-items: center;
  justify-content: center;
  color: orange;
  font-weight: bold;
  width: 100px;
  height: 100px;
  margin: 0;
}

#goalArea {
  width: 100px;
  height: 100px;
  margin: 10px 0;
  border: solid 1px black;
  position: fixed;
  bottom: 10px;
  right: 10px;
  box-sizing: border-box;
}

.dragging {
  display: none;
}

.dragged {
  background-color: orange;
}
js
//ターゲットの取得
const target = document.querySelector('#target');

//スタートエリアの取得
const startArea = document.querySelector('#startArea');

//ゴールエリアの取得
const goalArea = document.querySelector('#goalArea');

//ターゲットのドラッグが開始された時
target.addEventListener('dragstart', () => {
  console.log("dragstartイベント");
});

//ドラッグ中の時
target.addEventListener('drag', () => {
  console.log("dragイベント");

  //ターゲットを非表示にする
  target.classList.add("dragging");

});

//ドラッグが終了した時
target.addEventListener('dragend', () => {
  console.log("dragendイベント");

  //ターゲットを表示にする
  target.classList.remove("dragging");

});


//スタートエリアに入った時
startArea.addEventListener('dragenter', () => {
  console.log("dragenterイベント");

  //スタートエリアに色を着ける
  startArea.classList.add("dragged");

});

//ゴールエリアに入った時
goalArea.addEventListener('dragenter', () => {
  console.log("dragenterイベント");

  //ゴールエリアに色を着ける
  goalArea.classList.add("dragged");
});


//スタートエリアから離れた時
startArea.addEventListener('dragleave', (event) => {
  console.log("dragleaveイベント");

  //スタートエリアの背景色を戻す
  startArea.classList.remove("dragged");

});

//ゴールエリアから離れた時
goalArea.addEventListener('dragleave', (event) => {
  console.log("dragleaveイベント");

  //ゴールエリアの背景色を戻す
  goalArea.classList.remove("dragged");

});


//スタートエリア上にある時
startArea.addEventListener('dragover', (event) => {
  console.log("dragoverイベント");

  //dropの前処理
  event.preventDefault();
});

//ゴールエリア上にある時
goalArea.addEventListener('dragover', (event) => {
  console.log("dragoverイベント");

  //dropの前処理
  event.preventDefault();


});


//スタートエリアでドロップされた時
startArea.addEventListener('drop', () => {
  console.log("dropイベント");

  //ターゲットをスタートエリアに追加
  startArea.appendChild(target);

});

//ゴールエリアでドロップされた時
goalArea.addEventListener('drop', () => {
  console.log("dropイベント");

  //ターゲットをゴールエリアに追加
  goalArea.appendChild(target);

});

印刷

イベント 内容
afterprint 印刷設定を閉じた時
beforeprint 印刷直前

例:印刷時に印刷用クラスを適用する

html
<p class="normal" id="sample">Lorem, ipsum dolor sit amet consectetur adipisicing elit. Rerum doloribus ex nostrum sunt magni, itaque veniam sapiente provident velit quo vero, quaerat vitae porro cumque. Sunt dolore impedit saepe praesentium!</p>
css
.normal {
  color: red;
}

.print {
  color: blue;
}
js
const sample = document.querySelector("#sample");

window.addEventListener("afterprint", () => {

  //印刷用クラス削除
  sample.classList.remove("print");

});

window.addEventListener("beforeprint", () => {

  //印刷用クラス追加
  sample.classList.add("print");

});

読み込み完了

イベント 内容
load リソース含め全ての読み込み完了時
DOMContentLoaded DOMツリーの構築完了時
js
window.addEventListener("load", () => {
  console.log("ページ読み込み完了");
})

window.addEventListener("DOMContentLoaded", () => {
  console.log("DOMツリーが準備できた");
})

読み込みエラー

イベント 内容
error 読み込み時にエラーが発生した時
html
<img src="xxxxxxxxxxxxxxx.jpg">
js
const img = document.querySelector("img");

img.addEventListener("error", () => {
  console.log("画像表示エラー");
});
14
12
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
12