概要: このチュートリアルでは、JavaScriptにおける基本的なマウスイベントとそのプロパティについて学習します。
JavaScript マウスイベント入門
マウスイベントは、ページ上の要素と対話するためにマウスを使用すると発生します。DOMレベル3イベントは9つのマウスイベントを定義しています。
mousedown、mouseup、およびclickイベント
要素をclick
すると、次の順序で少なくとも3つのマウスイベントが発生します。
mousedown
は、要素上でマウスボタンを押したときに発生します。mouseup
は、要素上でマウスボタンを離したときに発生します。click
は、要素上で1つのmousedown
と1つのmouseup
が検出されたときに発生します。

要素上でマウスボタンを押して、マウスカーソルを要素の外に移動し、その後マウスボタンを離した場合、要素上ではmousedown
イベントのみが発生します。
同様に、マウスボタンを押して、マウスを要素の上に移動し、マウスボタンを離した場合、要素上ではmouseup
イベントのみが発生します。
どちらの場合も、click
イベントは発生しません。
dblclickイベント
実際には、dblclick
イベントを使用することはめったにありません。dblclick
イベントは、要素をダブルクリックしたときに発生します。
dblclick
イベントが発生するには、2つのクリックイベントが必要です。dblclick
イベントは、次の順序で4つの異なるイベントが発生します。
-
mousedown
-
mouseup
-
click
-
mousedown
-
mouseup
-
click
-
dblclick

図は、click
イベントが常にdblclick
イベントの前に発生することを示しています。
同じ要素にclick
とdblclick
の両方のイベントハンドラーを登録した場合、ユーザーが要素をクリックしたのかダブルクリックしたのかを知ることはできません。
mousemove
mousemove
イベントは、要素の周囲でマウスカーソルを移動するたびに繰り返し発生します。このmousemove
イベントは、マウスが1ピクセルでも移動すると、1秒間に何度も発生します。イベントハンドラー関数が複雑な場合、パフォーマンスの問題につながる可能性があります。
パフォーマンスの問題を回避するには、必要な場合にのみmousemove
イベントハンドラーを追加し、不要になったらすぐに削除するのが良い方法です。
element.onmousemove = mouseMoveEventHandler;
// ...
// later, no longer use
element.onmousemove = null;
Code language: JavaScript (javascript)
mouseover / mouseout
mouseover
は、マウスカーソルが要素の外側にあり、要素の境界内に移動したときに発生します。
mouseout
は、マウスカーソルが要素の上にあり、別の要素に移動したときに発生します。
mouseenter / mouseleave
mouseenter
は、マウスカーソルが要素の外側にあり、要素の境界内に移動したときに発生します。
mouseleave
は、マウスカーソルが要素の上にあり、要素の境界の外に移動したときに発生します。
mouseenter
とmouseleave
はどちらもバブリングせず、マウスカーソルが子要素の上に移動しても発生しません。
マウスイベントハンドラーの登録
マウスイベントを登録するには、次の手順を使用します。
- まず、
querySelector()
またはgetElementById()
メソッドを使用して要素を選択します。 - 次に、
addEventListener()
メソッドを使用してマウスイベントを登録します。
たとえば、次のボタンがあるとします。
<button id="btn">Click Me!</button>
Code language: HTML, XML (xml)
マウスクリックイベントハンドラーを登録するには、次のコードを使用します。
let btn = document.querySelector('#btn');
btn.addEventListener('click',(event) => {
console.log('clicked');
});
Code language: JavaScript (javascript)
または、要素のプロパティにマウスイベントハンドラーを割り当てることができます。
let btn = document.querySelector('#btn');
btn.onclick = (event) => {
console.log('clicked');
};
Code language: JavaScript (javascript)
レガシーシステムでは、イベントハンドラーが要素のHTML属性に割り当てられている場合があります。
<button id="btn" onclick="console.log('clicked')">Click Me!</button>
Code language: HTML, XML (xml)
マウスイベントハンドラーを登録するには、addEventListener()
を使用するのが良い方法です。
マウスボタンの検出
マウスイベントハンドラーに渡されるevent
オブジェクトには、イベントをトリガーするためにマウスで押されたマウスボタンを示すbutton
というプロパティがあります。
マウスボタンは数値で表されます。
- 0: メインマウスボタン(通常は左ボタン)が押されています。
- 1: 補助ボタン(通常は中央ボタンまたはホイールボタン)が押されています。
- 2: セカンダリボタン(通常は右ボタン)が押されています。
- 3: 4番目のボタン(通常はブラウザの戻るボタン)が押されています。
- 4: 5番目のボタン(通常はブラウザの進むボタン)が押されています。

次の例を参照してください。
<!DOCTYPE html>
<html>
<head>
<title>JS Mouse Events - Button Demo</title>
</head>
<body>
<button id="btn">Click me with any mouse button: left, right, middle, ...</button>
<p id="message"></p>
<script>
let btn = document.querySelector('#btn');
// disable context menu when right-mouse clicked
btn.addEventListener('contextmenu', (e) => {
e.preventDefault();
});
// show the mouse event message
btn.addEventListener('mouseup', (e) => {
let msg = document.querySelector('#message');
switch (e.button) {
case 0:
msg.textContent = 'Left mouse button clicked.';
break;
case 1:
msg.textContent = 'Middle mouse button clicked.';
break;
case 2:
msg.textContent = 'Right mouse button clicked.';
break;
default:
msg.textContent = `Unknown mouse button code: ${event.button}`;
}
});
</script>
</body>
</html>
Code language: HTML, XML (xml)
この例では、マウスでボタンをクリックすると(左クリック、右クリック、中央クリック)、対応するメッセージが<div>
要素に表示されます。
修飾キー
要素をクリックするとき、Shift、Ctrl、Alt、Metaの1つ以上の修飾キーを押す場合があります。

Metaキーは、WindowsキーボードではWindowsキー、AppleキーボードではCommandキーです。
これらの修飾キーが押されたかどうかを検出するには、マウスイベントハンドラーに渡されるevent
オブジェクトを使用できます。
event
オブジェクトには4つのブール型のプロパティがあり、キーが押されている場合はtrue
、押されていない場合はfalse
に設定されます。
次の例を参照してください。
<!DOCTYPE html>
<html>
<head>
<title>JS Modifier Keys Demo</title>
</head>
<body>
<button id="btnKeys">Click me with Alt, Shift, Ctrl pressed</button>
<p id="messageKeys"></p>
<script>
let btnKeys = document.querySelector('#btnKeys');
btnKeys.addEventListener('click', (e) => {
let keys = [];
if (e.shiftKey) keys.push('shift');
if (e.ctrlKey) keys.push('ctrl');
if (e.altKey) keys.push('alt');
if (e.metaKey) keys.push('meta');
let msg = document.querySelector('#messageKeys');
msg.textContent = `Keys: ${keys.join('+')}`;
});
</script>
</body>
</html>
Code language: HTML, XML (xml)
画面座標の取得
マウスイベントハンドラーに渡されるイベントのscreenX
プロパティとscreenY
プロパティは、画面全体に対するマウスの位置の画面座標を返します。

一方、clientX
プロパティとclientY
プロパティは、マウスイベントが発生したアプリケーションのクライアント領域内の水平座標と垂直座標を提供します。

次のデモを参照してください。
<!DOCTYPE html>
<html>
<head>
<title>JS Mouse Location Demo</title>
<style>
#track {
background-color: goldenrod;
height: 200px;
width: 400px;
}
</style>
</head>
<body>
<p>Move your mouse to see its location.</p>
<div id="track"></div>
<p id="log"></p>
<script>
let track = document.querySelector('#track');
track.addEventListener('mousemove', (e) => {
let log = document.querySelector('#log');
log.innerText = `
Screen X/Y: (${e.screenX}, ${e.screenY})
Client X/Y: (${e.clientX}, ${e.clientY})`
});
</script>
</body>
</html>
Code language: HTML, XML (xml)
まとめ
- DOMレベル3は9つのマウスイベントを定義しています。
- マウスイベントハンドラーを登録するには、
addEventListener()
メソッドを使用します。 event.button
は、マウスイベントをトリガーするために押されたマウスボタンを示します。- 修飾キー:alt、shift、ctrl、meta(Mac)は、マウスイベントハンドラーに渡されるイベントオブジェクトのプロパティを介して取得できます。
screenX
プロパティとscreenY
プロパティは、マウスポインタの画面座標における水平座標と垂直座標を返します。event
オブジェクトのclientX
プロパティとclientY
プロパティは、マウスイベントが発生したアプリケーションのクライアント領域内の水平座標と垂直座標を返します。