マウスの操作について
・ | マウスカーソルの座標を調べる |
・ | マウスカーソルが移動したか調べる |
・ | マウスボタンが押されたか調べる |
・ | マウスボタンの押下状態を調べる |
・ | マウスのホイールが回転されたか調べる |
・ | コンテキストメニューが表示されるか調べる |
・ | マウスカーソルについて |
・ | マウスロックについて(HTML5 世代) |
・ | マウス操作を無効化する |
マウスカーソルの座標を調べる
■マウスカーソルの座標が変化したか監視する
onmousemove イベントを使用します。
登録したコールバック関数の引数から、MouseEvent オブジェクトが得られます。
マウスを移動するたびに実行されるイベント
// ------------------------------------------------------------
// マウスを移動するたびに実行されるイベント
// ------------------------------------------------------------
document.onmousemove = function (e){
if(!e) e = window.event; // レガシー
// 出力テスト
console.log(e);
};
■マウス座標関連のプロパティ
プロパティ | 型 | 解説 |
clientX | Number | ブラウザのクライアント領域を原点とした水平位置( x 座標) |
clientY | Number | ブラウザのクライアント領域を原点とした垂直位置( y 座標) |
screenX | Number | モニタのスクリーン領域を原点とした水平位置( x 座標) |
screenY | Number | モニタのスクリーン領域を原点とした垂直位置( y 座標) |
■クライアント座標系を基点としたマウスカーソルの座標を取得する
■クライアント座標系とは?
ブラウザにて HTML がレンダリング表示される領域の、左上を原点とした座標系です。
■マウスカーソルの座標を取得する(クライアント座標系)
プロパティ | 型 | 解説 |
clientX | Number | ブラウザのクライアント領域を原点とした水平位置( x 座標) |
clientY | Number | ブラウザのクライアント領域を原点とした垂直位置( y 座標) |
■取得例(イベントリスナー)
クライアント座標系を基点としたマウスカーソルの座標を取得する
// ------------------------------------------------------------
// マウスを移動するたびに実行される関数
// ------------------------------------------------------------
function MouseMoveFunc(e){
// クライアント座標系を基点としたマウスカーソルの座標を取得
var mouse_x = e.clientX;
var mouse_y = e.clientY;
// 出力テスト
console.log("x:" + mouse_x);
console.log("y:" + mouse_y);
}
// ------------------------------------------------------------
// イベントのリッスンを開始する
// ------------------------------------------------------------
// イベントリスナーに対応している
if(document.addEventListener){
// マウスを移動するたびに実行されるイベント
document.addEventListener("mousemove" , MouseMoveFunc);
// アタッチイベントに対応している
}else if(document.attachEvent){
// マウスを移動するたびに実行されるイベント
document.attachEvent("onmousemove" , MouseMoveFunc);
}
■取得例(イベントプロパティ)
クライアント座標系を基点としたマウスカーソルの座標を取得する
// ------------------------------------------------------------
// マウスを移動するたびに実行されるイベント
// ------------------------------------------------------------
document.onmousemove = function (e){
if(!e) e = window.event; // レガシー
// クライアント座標系を基点としたマウスカーソルの座標を取得
var mouse_x = e.clientX;
var mouse_y = e.clientY;
// 出力テスト
console.log("x:" + mouse_x);
console.log("y:" + mouse_y);
};
■グローバル座標系を基点としたマウスカーソルの座標を取得する
■グローバル座標系とは?
HTML 全体の、左上を原点とした座標系です。
1.マウスカーソルの座標を取得する(クライアント座標系)
こちらで解説しています。
2.ブラウザのスクロール位置を取得する
こちらで解説しています。
3.グローバル座標系に変換する
「クライアント座標」と「スクロール位置」を加算します。
すると、「グローバル座標」に変換できます。
■取得例(イベントリスナー)
クライアント座標系を基点としたマウスカーソルの座標を取得する
// ------------------------------------------------------------
// スクロール位置を取得する関数
// ------------------------------------------------------------
function DocumentGetScrollPosition(document_obj){
return{
x:document_obj.body.scrollLeft || document_obj.documentElement.scrollLeft,
y:document_obj.body.scrollTop || document_obj.documentElement.scrollTop
};
}
// ------------------------------------------------------------
// マウスを移動するたびに実行される関数
// ------------------------------------------------------------
function MouseMoveFunc(e){
// クライアント座標系を基点としたマウスカーソルの座標を取得
var mouse_x = e.clientX;
var mouse_y = e.clientY;
// スクロール位置を取得
var scroll_pos = DocumentGetScrollPosition(document);
// スクロール位置を加算して、グローバル座標系に変換する
mouse_x += scroll_pos.x;
mouse_y += scroll_pos.y;
// 出力テスト
console.log("x:" + mouse_x);
console.log("y:" + mouse_y);
}
// ------------------------------------------------------------
// イベントのリッスンを開始する
// ------------------------------------------------------------
// イベントリスナーに対応している
if(document.addEventListener){
// マウスを移動するたびに実行されるイベント
document.addEventListener("mousemove" , MouseMoveFunc);
// アタッチイベントに対応している
}else if(document.attachEvent){
// マウスを移動するたびに実行されるイベント
document.attachEvent("onmousemove" , MouseMoveFunc);
}
■取得例(イベントプロパティ)
クライアント座標系を基点としたマウスカーソルの座標を取得する
// ------------------------------------------------------------
// スクロール位置を取得する関数
// ------------------------------------------------------------
function DocumentGetScrollPosition(document_obj){
return{
x:document_obj.body.scrollLeft || document_obj.documentElement.scrollLeft,
y:document_obj.body.scrollTop || document_obj.documentElement.scrollTop
};
}
// ------------------------------------------------------------
// マウスを移動するたびに実行されるイベント
// ------------------------------------------------------------
document.onmousemove = function (e){
if(!e) e = window.event; // レガシー
// クライアント座標系を基点としたマウスカーソルの座標を取得
var mouse_x = e.clientX;
var mouse_y = e.clientY;
// スクロール位置を取得
var scroll_pos = DocumentGetScrollPosition(document);
// スクロール位置を加算して、グローバル座標系に変換する
mouse_x += scroll_pos.x;
mouse_y += scroll_pos.y;
// 出力テスト
console.log("x:" + mouse_x);
console.log("y:" + mouse_y);
};
■スクリーン座標系を基点としたマウスカーソルの座標を取得する
■スクリーン座標系とは?
モニタ(デスクトップ)全体の、左上を原点とした座標系です。
■マウスカーソルの座標を取得する(スクリーン座標系)
プロパティ | 型 | 解説 |
screenX | Number | モニタのスクリーン領域を原点とした水平位置( x 座標) |
screenY | Number | モニタのスクリーン領域を原点とした垂直位置( y 座標) |
■取得例(イベントリスナー)
スクリーン座標系を基点としたマウスカーソルの座標を取得する
// ------------------------------------------------------------
// マウスを移動するたびに実行される関数
// ------------------------------------------------------------
function MouseMoveFunc(e){
// スクリーン座標系を基点としたマウスカーソルの座標を取得
var mouse_x = e.screenX;
var mouse_y = e.screenY;
// 出力テスト
console.log("x:" + mouse_x);
console.log("y:" + mouse_y);
}
// ------------------------------------------------------------
// イベントのリッスンを開始する
// ------------------------------------------------------------
// イベントリスナーに対応している
if(document.addEventListener){
// マウスを移動するたびに実行されるイベント
document.addEventListener("mousemove" , MouseMoveFunc);
// アタッチイベントに対応している
}else if(document.attachEvent){
// マウスを移動するたびに実行されるイベント
document.attachEvent("onmousemove" , MouseMoveFunc);
}
■取得例(イベントプロパティ)
スクリーン座標系を基点としたマウスカーソルの座標を取得する
// ------------------------------------------------------------
// マウスを移動するたびに実行されるイベント
// ------------------------------------------------------------
document.onmousemove = function (e){
if(!e) e = window.event; // レガシー
// スクリーン座標系を基点としたマウスカーソルの座標を取得
var mouse_x = e.screenX;
var mouse_y = e.screenY;
// 出力テスト
console.log("x:" + mouse_x);
console.log("y:" + mouse_y);
};
マウスカーソルが移動したか調べる
■マウスの移動関連のイベントについて
マウスの移動関連のイベントは、以下の種類があります。
イベント名 | 型 | 解説 |
onmousemove | MouseEvent | マウスカーソルが、任意のエレメントの上を移動した |
onmouseover | MouseEvent | マウスカーソルが、任意のエレメントの外から内側へ侵入した |
onmouseout | MouseEvent | マウスカーソルが、任意のエレメントの内側から外へ撤退した |
■マウスカーソルが移動したか監視する
onmousemove イベントを使用します。
登録したコールバック関数の引数から、MouseEvent オブジェクトが得られます。
マウスカーソルが移動するたびに実行されるイベント
// ------------------------------------------------------------
// マウスカーソルが移動するたびに実行されるイベント
// ------------------------------------------------------------
document.onmousemove = function (e){
if(!e) e = window.event; // レガシー
// 出力テスト
console.log(e);
};
■任意のエレメントにリスナーを登録した場合
検出範囲は、任意の要素とその子孫に限定されます。
マウスカーソルと要素が重なっているとき、イベントが発行されます。
任意のエレメントにコールバック関数を登録する
<html>
<body>
<div id="aaa" style="width:300px; height:200px; background:#f44; border:5px #a00 solid;" ></div>
<script type="text/javascript">
<!--
// id 属性が、"aaa" であるエレメントを取得
var element = document.getElementById("aaa");
// ------------------------------------------------------------
// マウスカーソルが移動するたびに実行されるイベント
// ------------------------------------------------------------
element.onmousemove = function (e){
if(!e) e = window.event; // レガシー
alert("マウスカーソルが移動した");
};
//-->
</script>
</body>
</html>
■パフォーマンス低下に注意
onmousemove イベントは、高頻度の時間隔で発行されます。
コールバック関数内では、マウス情報の取得に留めた方がいいでしょう。
重い処理を記述した場合、パフォーマンス低下を引き起こす恐れがあります。
■取得例(イベントリスナー)
マウスカーソルが移動したか調べる
// ------------------------------------------------------------
// マウスカーソルが移動するたびに実行される関数
// ------------------------------------------------------------
function MouseMoveFunc(e){
console.log("マウスカーソルが移動した");
}
// ------------------------------------------------------------
// イベントのリッスンを開始する
// ------------------------------------------------------------
// イベントリスナーに対応している
if(document.addEventListener){
// マウスカーソルが移動するたびに実行されるイベント
document.addEventListener("mousemove" , MouseMoveFunc);
// アタッチイベントに対応している
}else if(document.attachEvent){
// マウスカーソルが移動するたびに実行されるイベント
document.attachEvent("onmousemove" , MouseMoveFunc);
}
■取得例(イベントプロパティ)
マウスカーソルが移動したか調べる
// ------------------------------------------------------------
// マウスカーソルが移動するたびに実行されるイベント
// ------------------------------------------------------------
document.onmousemove = function (e){
if(!e) e = window.event; // レガシー
console.log("マウスカーソルが移動した");
};
■マウスオーバーしたか監視する
■マウスオーバー操作とは?
対象の外側から内側へ、マウスカーソルが侵入移動した瞬間に該当します。
■マウスオーバーしたか監視する
onmouseover イベントを使用します。
登録したコールバック関数の引数から、MouseEvent オブジェクトが得られます。
マウスオーバー時に実行されるイベントイベント
// ------------------------------------------------------------
// マウスオーバー時に実行されるイベント
// ------------------------------------------------------------
document.onmouseover = function (e){
if(!e) e = window.event; // レガシー
// 出力テスト
console.log(e);
};
■任意のエレメントにリスナーを登録した場合
検出範囲は、任意の要素とその子孫に限定されます。
任意のエレメントにコールバック関数を登録する
<html>
<body>
<div id="aaa" style="width:300px; height:200px; background:#f44; border:5px #a00 solid;" ></div>
<script type="text/javascript">
<!--
// id 属性が、"aaa" であるエレメントを取得
var element = document.getElementById("aaa");
// ------------------------------------------------------------
// マウスオーバー時に実行されるイベント
// ------------------------------------------------------------
element.onmouseover = function (e){
if(!e) e = window.event; // レガシー
alert("マウスオーバー");
};
//-->
</script>
</body>
</html>
■取得例(イベントリスナー)
マウスオーバーしたか調べる
// ------------------------------------------------------------
// マウスオーバー時に実行される関数
// ------------------------------------------------------------
function MouseOverFunc(e){
console.log("マウスオーバー");
}
// ------------------------------------------------------------
// イベントのリッスンを開始する
// ------------------------------------------------------------
// イベントリスナーに対応している
if(document.addEventListener){
// マウスオーバー時に実行されるイベント
document.addEventListener("mouseover" , MouseOverFunc);
// アタッチイベントに対応している
}else if(document.attachEvent){
// マウスオーバー時に実行されるイベント
document.attachEvent("onmouseover" , MouseOverFunc);
}
■取得例(イベントプロパティ)
マウスオーバーしたか調べる
// ------------------------------------------------------------
// マウスオーバー時に実行されるイベント
// ------------------------------------------------------------
document.onmouseover = function (e){
if(!e) e = window.event; // レガシー
console.log("マウスオーバー");
};
■マウスアウトしたか監視する
■マウスアウト操作とは?
対象の内側から外側へ、マウスカーソルが撤退移動した瞬間に該当します。
■マウスアウトしたか監視する
onmouseout イベントを使用します。
登録したコールバック関数の引数から、MouseEvent オブジェクトが得られます。
マウスアウト時に実行されるイベントイベント
// ------------------------------------------------------------
// マウスアウト時に実行されるイベント
// ------------------------------------------------------------
document.onmouseout = function (e){
if(!e) e = window.event; // レガシー
// 出力テスト
console.log(e);
};
■任意のエレメントにリスナーを登録した場合
検出範囲は、任意の要素とその子孫に限定されます。
任意のエレメントにコールバック関数を登録する
<html>
<body>
<div id="aaa" style="width:300px; height:200px; background:#f44; border:5px #a00 solid;" ></div>
<script type="text/javascript">
<!--
// id 属性が、"aaa" であるエレメントを取得
var element = document.getElementById("aaa");
// ------------------------------------------------------------
// マウスアウト時に実行されるイベント
// ------------------------------------------------------------
element.onmouseout = function (e){
if(!e) e = window.event; // レガシー
alert("マウスアウト");
};
//-->
</script>
</body>
</html>
■取得例(イベントリスナー)
マウスアウトしたか調べる
// ------------------------------------------------------------
// マウスアウト時に実行される関数
// ------------------------------------------------------------
function MouseOutFunc(e){
console.log("マウスアウト");
}
// ------------------------------------------------------------
// イベントのリッスンを開始する
// ------------------------------------------------------------
// イベントリスナーに対応している
if(document.addEventListener){
// マウスアウト時に実行されるイベント
document.addEventListener("mouseout" , MouseOutFunc);
// アタッチイベントに対応している
}else if(document.attachEvent){
// マウスアウト時に実行されるイベント
document.attachEvent("onmouseout" , MouseOutFunc);
}
■取得例(イベントプロパティ)
マウスアウトしたか調べる
// ------------------------------------------------------------
// マウスアウト時に実行されるイベント
// ------------------------------------------------------------
document.onmouseout = function (e){
if(!e) e = window.event; // レガシー
console.log("マウスアウト");
};
マウスのボタンが押されたか調べる
■マウスのボタン関連のイベントについて
マウスのボタン関連のイベントは、以下の種類があります。
イベント名 | 型 | 解説 |
onmousedown | MouseEvent | マウスボタンを押した |
onmouseup | MouseEvent | マウスボタンを離した |
onclick | MouseEvent | クリックした(キーボードによる選択も検出可能) |
ondblclick | MouseEvent | ダブルクリックした |
■マウスボタンが押されたか監視する
onmousedown イベントを使用します。
登録したコールバック関数の引数から、MouseEvent オブジェクトが得られます。
マウスのボタンを押すと実行されるイベント
// ------------------------------------------------------------
// マウスのボタンを押すと実行されるイベント
// ------------------------------------------------------------
document.onmousedown = function (e){
if(!e) e = window.event; // レガシー
// 出力テスト
console.log(e);
};
■操作したマウスボタンの種類を取得する
こちらで解説しています。
■任意のエレメントにリスナーを登録した場合
検出範囲は、任意の要素とその子孫に限定されます。
任意のエレメントにコールバック関数を登録する
<html>
<body>
<div id="aaa" style="width:300px; height:200px; background:#f44; border:5px #a00 solid;" ></div>
<script type="text/javascript">
<!--
// id 属性が、"aaa" であるエレメントを取得
var element = document.getElementById("aaa");
// ------------------------------------------------------------
// マウスのボタンを押すと実行されるイベント
// ------------------------------------------------------------
element.onmousedown = function (e){
if(!e) e = window.event; // レガシー
alert("マウスのボタンが押された");
};
//-->
</script>
</body>
</html>
■取得例(イベントリスナー)
マウスのボタンが押されたか調べる
// ------------------------------------------------------------
// マウスのボタンを押すと実行される関数
// ------------------------------------------------------------
function MouseDownFunc(e){
console.log("マウスのボタンが押された");
}
// ------------------------------------------------------------
// イベントのリッスンを開始する
// ------------------------------------------------------------
// イベントリスナーに対応している
if(document.addEventListener){
// マウスのボタンを押すと実行されるイベント
document.addEventListener("mousedown" , MouseDownFunc);
// アタッチイベントに対応している
}else if(document.attachEvent){
// マウスのボタンを押すと実行されるイベント
document.attachEvent("onmousedown" , MouseDownFunc);
}
■取得例(イベントプロパティ)
マウスのボタンが押されたか調べる
// ------------------------------------------------------------
// マウスのボタンを押すと実行されるイベント
// ------------------------------------------------------------
document.onmousedown = function (e){
if(!e) e = window.event; // レガシー
console.log("マウスのボタンが押された");
};
■マウスボタンが離されたか監視する
onmouseup イベントを使用します。
登録したコールバック関数の引数から、MouseEvent オブジェクトが得られます。
マウスのボタンを離すと実行されるイベント
// ------------------------------------------------------------
// マウスのボタンを離すと実行されるイベント
// ------------------------------------------------------------
document.onmouseup = function (e){
if(!e) e = window.event; // レガシー
// 出力テスト
console.log(e);
};
■操作したマウスボタンの種類を取得する
こちらで解説しています。
■任意のエレメントにリスナーを登録した場合
検出範囲は、任意の要素とその子孫に限定されます。
任意のエレメントにコールバック関数を登録する
<html>
<body>
<div id="aaa" style="width:300px; height:200px; background:#f44; border:5px #a00 solid;" ></div>
<script type="text/javascript">
<!--
// id 属性が、"aaa" であるエレメントを取得
var element = document.getElementById("aaa");
// ------------------------------------------------------------
// マウスのボタンを離すと実行されるイベント
// ------------------------------------------------------------
element.onmouseup = function (e){
if(!e) e = window.event; // レガシー
alert("マウスのボタンが離された");
};
//-->
</script>
</body>
</html>
■取得例(イベントリスナー)
マウスのボタンが離されたか調べる
// ------------------------------------------------------------
// マウスのボタンを離すと実行される関数
// ------------------------------------------------------------
function MouseUpFunc(e){
console.log("マウスのボタンが離された");
}
// ------------------------------------------------------------
// イベントのリッスンを開始する
// ------------------------------------------------------------
// イベントリスナーに対応している
if(document.addEventListener){
// マウスのボタンを離すと実行されるイベント
document.addEventListener("mouseup" , MouseUpFunc);
// アタッチイベントに対応している
}else if(document.attachEvent){
// マウスのボタンを離すと実行されるイベント
document.attachEvent("onmouseup" , MouseUpFunc);
}
■取得例(イベントプロパティ)
マウスのボタンが離されたか調べる
// ------------------------------------------------------------
// マウスのボタンを離すと実行されるイベント
// ------------------------------------------------------------
document.onmouseup = function (e){
if(!e) e = window.event; // レガシー
console.log("マウスのボタンが離された");
};
■マウスがクリックされたか監視する
onclick イベントを使用します。
登録したコールバック関数の引数から、MouseEvent オブジェクトが得られます。
クリックすると実行されるイベント
// ------------------------------------------------------------
// クリックすると実行されるイベント
// ------------------------------------------------------------
document.onclick = function (e){
if(!e) e = window.event; // レガシー
// 出力テスト
console.log(e);
};
■任意のエレメントにリスナーを登録した場合
検出範囲は、任意の要素とその子孫に限定されます。
任意のエレメントにコールバック関数を登録する
<html>
<body>
<div id="aaa" style="width:300px; height:200px; background:#f44; border:5px #a00 solid;" ></div>
<script type="text/javascript">
<!--
// id 属性が、"aaa" であるエレメントを取得
var element = document.getElementById("aaa");
// ------------------------------------------------------------
// クリックすると実行されるイベント
// ------------------------------------------------------------
element.onclick = function (e){
if(!e) e = window.event; // レガシー
alert("マウスがクリックされた");
};
//-->
</script>
</body>
</html>
■取得例(イベントリスナー)
マウスがクリックされたか調べる
// ------------------------------------------------------------
// クリックすると実行される関数
// ------------------------------------------------------------
function MouseClickFunc(e){
console.log("マウスがクリックされた");
}
// ------------------------------------------------------------
// イベントのリッスンを開始する
// ------------------------------------------------------------
// イベントリスナーに対応している
if(document.addEventListener){
// クリックすると実行されるイベント
document.addEventListener("click" , MouseClickFunc);
// アタッチイベントに対応している
}else if(document.attachEvent){
// クリックすると実行されるイベント
document.attachEvent("onclick" , MouseClickFunc);
}
■取得例(イベントプロパティ)
マウスがクリックされたか調べる
// ------------------------------------------------------------
// クリックすると実行されるイベント
// ------------------------------------------------------------
document.onclick = function (e){
if(!e) e = window.event; // レガシー
console.log("マウスがクリックされた");
};
■ onmouseup と onclick イベントとの違いについて
■ onmouseup イベントの特徴
マウスボタンを離す操作を、取りこぼしなく調べたい場合に最適です。
実際は取りこぼします。
すべてのマウスボタンの操作を検出できます。
ボタンの種類によっては、デフォルトの機能を無効化する必要があります
■ onclick イベントの特徴
メニューなどの UI 選択操作を、検出したい場合に最適です。
キーボード操作による選択も、検出できます。
クリック用のマウスボタン(通常は左ボタン)のみ検出できます。
onclick イベントは、キャンセルに対応しています。
例えば、ハイパーリンクを無効化して、遷移を阻止する事ができます。
■マウスがダブルクリックされたか調べる
ondblclick イベントを使用します。
登録したコールバック関数の引数から、MouseEvent オブジェクトが得られます。
ダブルクリックすると実行されるイベント
// ------------------------------------------------------------
// ダブルクリックすると実行されるイベント
// ------------------------------------------------------------
document.ondblclick = function (e){
if(!e) e = window.event; // レガシー
// 出力テスト
console.log(e);
};
■任意のエレメントにリスナーを登録した場合
検出範囲は、任意の要素とその子孫に限定されます。
任意のエレメントにコールバック関数を登録する
<html>
<body>
<div id="aaa" style="width:300px; height:200px; background:#f44; border:5px #a00 solid;" ></div>
<script type="text/javascript">
<!--
// id 属性が、"aaa" であるエレメントを取得
var element = document.getElementById("aaa");
// ------------------------------------------------------------
// ダブルクリックすると実行されるイベント
// ------------------------------------------------------------
element.ondblclick = function (e){
if(!e) e = window.event; // レガシー
alert("マウスがダブルクリックされた");
};
//-->
</script>
</body>
</html>
■取得例(イベントリスナー)
マウスがダブルクリックされたか調べる
// ------------------------------------------------------------
// ダブルクリックすると実行される関数
// ------------------------------------------------------------
function MouseDoubleClickFunc(e){
console.log("マウスがダブルクリックされた");
}
// ------------------------------------------------------------
// イベントのリッスンを開始する
// ------------------------------------------------------------
// イベントリスナーに対応している
if(document.addEventListener){
// ダブルクリックすると実行されるイベント
document.addEventListener("dblclick" , MouseDoubleClickFunc);
// アタッチイベントに対応している
}else if(document.attachEvent){
// ダブルクリックすると実行されるイベント
document.attachEvent("ondblclick" , MouseDoubleClickFunc);
}
■取得例(イベントプロパティ)
マウスがダブルクリックされたか調べる
// ------------------------------------------------------------
// ダブルクリックすると実行されるイベント
// ------------------------------------------------------------
document.ondblclick = function (e){
if(!e) e = window.event; // レガシー
console.log("マウスがダブルクリックされた");
};
マウスボタンの押下状態を調べる
■マウスボタンの押下状態と種類を調べる
以下のプロパティを使用します。
■ buttons プロパティについて
■サポート状況について
DOM Events Level3 世代の仕様です。
InternetExplorer 8 以前では未対応です。
■得られる数値について
buttons プロパティは、現在のマウスボタンの純粋な押下状態を意味しています。
以下の数値を、論理和した結果が得られます。
複数のマウスボタンの同時押しの判別が可能です。
例えば、3 が得られた場合、マウスの左ボタンと右ボタンが両方押されています。
数値 | 解説 |
1 (00000001) | マウス左ボタンが押されている |
2 (00000010) | マウス右ボタンが押されている |
4 (00000100) | マウス中央ボタンが押されている |
■ onmouseup イベント発生時の注意点
既にボタンは離されており、結果は 0 となります。
■取得例
buttons プロパティを使って、マウスボタンの押下状態を調べる
// ------------------------------------------------------------
// マウス関連のイベントが発生すると実行される関数
// ------------------------------------------------------------
function MouseEventFunc(e){
if(!e) e = window.event; // レガシー
// buttons プロパティが利用可能である
if(e.buttons !== undefined){
var data = e.buttons;
var button_l = ((data & 0x0001) ? true : false);
var button_r = ((data & 0x0002) ? true : false);
var button_c = ((data & 0x0004) ? true : false);
console.log("マウス左ボタンの押下状態:" + button_l);
console.log("マウス右ボタンの押下状態:" + button_r);
console.log("マウス中央ボタンの押下状態:" + button_c);
}
// ------------------------------------------------------------
// デフォルトの動作を無効化する
// ------------------------------------------------------------
if(e.preventDefault){
// デフォルトの動作を無効化する
e.preventDefault();
}else{
// デフォルトの動作を無効化する(非標準)
return false;
}
}
// ------------------------------------------------------------
// イベントのリッスンを開始する
// ------------------------------------------------------------
// イベントリスナーに対応している
if(document.addEventListener){
// マウスボタンを押すと実行されるイベント
document.addEventListener("mousedown" , MouseEventFunc);
// マウスカーソルを移動するたびに実行されるイベント
document.addEventListener("mousemove" , MouseEventFunc);
// マウスボタンを離すと実行されるイベント
document.addEventListener("mouseup" , MouseEventFunc);
// コンテキストメニューが表示される直前に実行されるイベント
document.addEventListener("contextmenu" , MouseEventFunc);
// アタッチイベントに対応している
}else if(document.attachEvent){
// マウスボタンを押すと実行されるイベント
document.attachEvent("onmousedown" , MouseEventFunc);
// マウスカーソルを移動するたびに実行されるイベント
document.attachEvent("onmousemove" , MouseEventFunc);
// マウスボタンを離すと実行されるイベント
document.attachEvent("onmouseup" , MouseEventFunc);
// コンテキストメニューが表示される直前に実行されるイベント
document.attachEvent("oncontextmenu" , MouseEventFunc);
// イベントプロパティを使用する
}else{
// マウスボタンを押すと実行されるイベント
document.onmousedown = MouseEventFunc;
// マウスカーソルを移動するたびに実行されるイベント
document.onmousemove = MouseEventFunc;
// マウスボタンを離すと実行されるイベント
document.onmouseup = MouseEventFunc;
// コンテキストメニューが表示される直前に実行されるイベント
document.oncontextmenu = MouseEventFunc;
}
■ button プロパティについて
■InternetExplorer での動作仕様について
詳細については、こちらで解説しています。
■一般的なブラウザの場合(標準仕様)
以下の数値が得られます。
結果は、論理和ではありません。
数値 | 解説 |
0 | マウス左ボタンに変化があった(マウスボタンに変化がない場合も 0 が得られる) |
1 | マウス中央ボタンに変化があった |
2 | マウス右ボタンに変化があった |
現在操作しているマウスボタンの種類を意味します。
ボタンの純粋な押下状態を意味する訳ではありません。
onmousedown イベント中に、1 が得られた場合、中央ボタンが押されています。
onmouseup イベント中に、1 が得られた場合、中央ボタンが離されています。
複数のボタンを同時操作した場合、イベントは複数回に分けて発行されます。
■InternetExplorer 専用の仕様(旧仕様)
以下の数値を、論理和した結果が得られます。
数値 | 解説 |
1 (00000001) | マウス左ボタンに変化があった |
2 (00000010) | マウス右ボタンに変化があった |
4 (00000100) | マウス中央ボタンに変化があった |
現在操作しているマウスボタンの種類を意味します。
ボタンの純粋な押下状態を意味する訳ではありません。
onmousedown イベント中に、1 が得られた場合、左ボタンが押されています。
onmouseup イベント中に、1 が得られた場合、左ボタンが離されています。
複数同時に操作したマウスボタンの判別が可能です。
例えば、3 が得られた場合、マウスの左ボタンと右ボタンの両方が変化しています。
■取得例
button プロパティを使って、マウスボタンの押下状態を調べる
// ------------------------------------------------------------
// マウスボタンを押すと実行される関数(一般的な仕様)
// ------------------------------------------------------------
function MouseDownFunc(e){
if(e.button == 0) console.log("マウス左ボタンが押された");
if(e.button == 1) console.log("マウス中央ボタンが押された");
if(e.button == 2) console.log("マウス右ボタンが押された");
}
// ------------------------------------------------------------
// マウスボタンを離すと実行される関数(一般的な仕様)
// ------------------------------------------------------------
function MouseUpFunc(e){
if(e.button == 0) console.log("マウス左ボタンが離された");
if(e.button == 1) console.log("マウス中央ボタンが離された");
if(e.button == 2) console.log("マウス右ボタンが離された");
}
// ------------------------------------------------------------
// マウスボタンを押すと実行される関数(InternetExplorer の旧仕様)
// ------------------------------------------------------------
function MouseDownOldFunc(e){
if(e.button & 0x0001) console.log("マウス左ボタンが押された");
if(e.button & 0x0002) console.log("マウス右ボタンが押された");
if(e.button & 0x0004) console.log("マウス中央ボタンが押された");
}
// ------------------------------------------------------------
// マウスボタンを離すと実行される関数(InternetExplorer の旧仕様)
// ------------------------------------------------------------
function MouseUpOldFunc(e){
if(e.button & 0x0001) console.log("マウス左ボタンが離された");
if(e.button & 0x0002) console.log("マウス右ボタンが離された");
if(e.button & 0x0004) console.log("マウス中央ボタンが離された");
}
// ------------------------------------------------------------
// イベントリスナーに対応している(必ず一般的な仕様で動作する)
// ------------------------------------------------------------
if(document.addEventListener){
// マウスボタンを押すと実行されるイベント
document.addEventListener("mousedown" , MouseDownFunc);
// マウスボタンを離すと実行されるイベント
document.addEventListener("mouseup" , MouseUpFunc);
// コンテキストメニューが表示される直前に実行されるイベント
document.addEventListener("contextmenu" , function(e){
// デフォルトの動作を無効化する
e.preventDefault();
});
// ------------------------------------------------------------
// アタッチイベントに対応している(必ず InternetExplorer の旧仕様で動作する)
// ------------------------------------------------------------
}else if(document.attachEvent){
// マウスボタンを押すと実行されるイベント
document.attachEvent("onmousedown" , MouseDownOldFunc);
// マウスボタンを離すと実行されるイベント
document.attachEvent("onmouseup" , MouseUpOldFunc);
// コンテキストメニューが表示される直前に実行されるイベント
document.attachEvent("oncontextmenu" , function(e){
// デフォルトの動作を無効化する
return false;
});
}
イベントプロパティから、マウスボタンの押下状態を調べる
// ------------------------------------------------------------
// マウスイベントで変化したボタンを buttons 形式で取得する関数
// ------------------------------------------------------------
function MouseEventGetChangedButtons(event_obj){
try{
if(event_obj instanceof MouseEvent){
var buttons = 0;
if(event_obj.button == 0) buttons |= 0x01;
if(event_obj.button == 1) buttons |= 0x04;
if(event_obj.button == 2) buttons |= 0x02;
return buttons;
}
}catch(e){
}
return event_obj.button;
}
// ------------------------------------------------------------
// マウスボタンを押すと実行されるイベント
// ------------------------------------------------------------
document.onmousedown = function (e){
if(!e) e = window.event; // レガシー
// 変化したボタンを buttons 形式で取得
var buttons = MouseEventGetChangedButtons(e);
if(buttons & 0x0001) console.log("マウス左ボタンが押された");
if(buttons & 0x0002) console.log("マウス右ボタンが押された");
if(buttons & 0x0004) console.log("マウス中央ボタンが押された");
}
// ------------------------------------------------------------
// マウスボタンを離すと実行されるイベント
// ------------------------------------------------------------
document.onmouseup = function (e){
if(!e) e = window.event; // レガシー
// 変化したボタンを buttons 形式で取得
var buttons = MouseEventGetChangedButtons(e);
if(buttons & 0x0001) console.log("マウス左ボタンが離された");
if(buttons & 0x0002) console.log("マウス右ボタンが離された");
if(buttons & 0x0004) console.log("マウス中央ボタンが離された");
}
■マウスボタンの押下状態を監視する
■ onmouseup イベントの取りこぼしについて
onmouseup イベントは、必ずしも発生するとは限りません。
スクロールバーをクリックした場合や、ドラッグを発生させた場合、キーボードでタスクを切り替えた場合、インラインフレームが混在する場合、マウスジェスチャー操作を行った場合など、onmouseup イベントが発生しない事があります。
■マウス右ボタンの取りこぼしについて
右マウスボタンを押すと、コンテキストメニューが表示されます。
OS によっては、離した瞬間ではなく、押した瞬間に表示されます。
安定して検出するには、コンテキストメニューの表示を無効化します。
もし無効化しない場合、コンテキストメニューが表示される時点で、離されたと判別します。
■マウス中央ボタンの取りこぼしについて
マウス中央ボタンを押すと、オートスクロールが発生します。
安定して検出するには、オートスクロールの発生を無効化します。
もし無効化しない場合、瞬時に離されたと判別します。
■誤判定からの復旧について
onmouseup イベントを取りこぼすと、マウスボタンが押しっぱなしであると誤判定されます。
しかし、マウスボタンが押されていないと判別するのは厄介です。
onblur イベントを使用すると、フォーカスを失った事がわかります。
この時、すべてのマウスボタンが離されたと判別するといいでしょう。
buttons プロパティを使用すると、マウスボタンを押していない事を判別できます。
■ブラウザのマウスジェスチャー機能が有効な場合
マウスの右ボタンや中央ボタンは、まともに検出できません。
Opera などが該当します。
■マウスボタンの入力状態を調べるコンストラクタ
マウスボタンの入力状態を調べるコンストラクタ
// ------------------------------------------------------------
// マウスボタンの入力状態を調べるコンストラクタ
// ------------------------------------------------------------
function InputMouseButton(window_obj){
// ------------------------------------------------------------
// 初期化
// ------------------------------------------------------------
var self = this;
var document_obj = window_obj.document;
var mouse_handler;
var blur_handler;
var button_tbl = [0,2,1,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31];
var event_type_down = { "mousedown":true , "dragstart":true };
var event_type_move = { "mousemove":true , "drag":true };
var event_type_up = { "mouseup":true , "dragend":true };
self.buttons = 0;
// ------------------------------------------------------------
// イベント
// ------------------------------------------------------------
blur_handler = function(e){
self.buttons = 0;
};
if(window_obj.addEventListener){
mouse_handler = function(e){
if(event_type_down[e.type]){
self.buttons |= (0x1 << button_tbl[e.button]);
}else if(event_type_up[e.type]){
self.buttons &= ~(0x1 << button_tbl[e.button]);
}else if(event_type_move[e.type]){
if(e.buttons !== undefined){ self.buttons = e.buttons; }
}
};
window_obj.addEventListener("mousedown",mouse_handler,true);
window_obj.addEventListener("mouseup",mouse_handler,false);
window_obj.addEventListener("mousemove",mouse_handler,true);
window_obj.addEventListener("dragstart",mouse_handler,true);
window_obj.addEventListener("dragend",mouse_handler,false);
window_obj.addEventListener("drag",mouse_handler,true);
window_obj.addEventListener("blur",blur_handler);
}else if(window_obj.attachEvent){
mouse_handler = function(e){
if(event_type_up[e.type]){
self.buttons &= ~(e.button);
}else{
self.buttons = (e.button);
}
};
document_obj.attachEvent("onmousedown",mouse_handler);
document_obj.attachEvent("onmouseup",mouse_handler);
document_obj.attachEvent("onmousemove",mouse_handler);
document_obj.attachEvent("ondragstart",mouse_handler);
document_obj.attachEvent("ondragend",mouse_handler);
document_obj.attachEvent("ondrag",mouse_handler);
window_obj.attachEvent("onblur",blur_handler);
}
// ------------------------------------------------------------
// buttons 形式で取得
// ------------------------------------------------------------
this.getButtons = function (){
return (this.buttons);
};
// ------------------------------------------------------------
// マウス左ボタンの押下状態を調べる
// ------------------------------------------------------------
this.isDownLeft = function (){
return (this.buttons & (0x1)) ? true : false;
};
// ------------------------------------------------------------
// マウス右ボタンの押下状態を調べる
// ------------------------------------------------------------
this.isDownRight = function (){
return (this.buttons & (0x2)) ? true : false;
};
// ------------------------------------------------------------
// マウス中央ボタンの押下状態を調べる
// ------------------------------------------------------------
this.isDownCenter = function (){
return (this.buttons & (0x4)) ? true : false;
};
// ------------------------------------------------------------
// 解放する
// ------------------------------------------------------------
this.release = function (){
if(window_obj.removeEventListener){
window_obj.removeEventListener("mousedown",mouse_handler,true);
window_obj.removeEventListener("mouseup",mouse_handler,false);
window_obj.removeEventListener("mousemove",mouse_handler,true);
window_obj.removeEventListener("dragstart",mouse_handler,true);
window_obj.removeEventListener("dragend",mouse_handler,false);
window_obj.removeEventListener("drag",mouse_handler,true);
window_obj.removeEventListener("blur",blur_handler);
}else if(window_obj.detachEvent){
document_obj.detachEvent("onmousedown",mouse_handler);
document_obj.detachEvent("onmouseup",mouse_handler);
document_obj.detachEvent("onmousemove",mouse_handler);
document_obj.detachEvent("ondragstart",mouse_handler);
document_obj.detachEvent("ondragend",mouse_handler);
document_obj.detachEvent("ondrag",mouse_handler);
window_obj.detachEvent("onblur",blur_handler);
}
};
}
■使用例
InputMouseButton クラスを使って、各マウスボタンの入力状態を取得する
// ------------------------------------------------------------
// InputMouseButton オブジェクトを作成
// ------------------------------------------------------------
var input_mouse_button = new InputMouseButton(window);
// ------------------------------------------------------------
// 一定の時間隔で実行
// ------------------------------------------------------------
// 60 フレームレート間隔で実行
setInterval(function (){
console.log("マウス左ボタンの押下状態:" + input_mouse_button.isDownLeft());
console.log("マウス右ボタンの押下状態:" + input_mouse_button.isDownRight());
console.log("マウス中央ボタンの押下状態:" + input_mouse_button.isDownCenter());
},1000/60);
// ------------------------------------------------------------
// マウスボタン入力監視を終了
// ------------------------------------------------------------
//input_mouse_button.release();
//input_mouse_button = null;
■装飾キーの押下状態について
以下のプロパティを使用します。
プロパティ名 | 型 | 説明 |
ctrlKey | Boolean | Ctrl キーの押下状態を取得する。 |
shiftKey | Boolean | Shift キーの押下状態を取得する。 |
altKey | Boolean | Alt キーの押下状態を取得する。 |
metaKey | Boolean | Meta キーの押下状態を取得する。 |
■取得例
装飾キーの押下状態を調べる
// ------------------------------------------------------------
// マウス関連のイベントが発生すると実行される関数
// ------------------------------------------------------------
function MouseEventFunc(e){
if(!e) e = window.event; // レガシー
if(e.ctrlKey) console.log("Ctrl キー押下中");
if(e.shiftKey) console.log("Shift キー押下中");
if(e.altKey) console.log("Alt キー押下中");
if(e.metaKey) console.log("Meta キー押下中");
}
// ------------------------------------------------------------
// イベントのリッスンを開始する
// ------------------------------------------------------------
// イベントリスナーに対応している
if(document.addEventListener){
// マウスカーソルを移動するたびに実行されるイベント
document.addEventListener("mousemove" , MouseEventFunc);
// アタッチイベントに対応している
}else if(document.attachEvent){
// マウスカーソルを移動するたびに実行されるイベント
document.attachEvent("onmousemove" , MouseEventFunc);
// イベントプロパティを使用する
}else{
// マウスカーソルを移動するたびに実行されるイベント
document.onmousemove = MouseEventFunc;
}
マウスのホイールが回転されたか調べる
■標準化されたホイールイベント(Events Level3 世代)
onwheel イベントを使用します。
サポートしていない場合、非標準時代のイベントを使用します。
■古いマウスホイールイベント(非標準時代)
■ Firefox の場合
MouseScrollEvent イベントを使用します。
■ Firefox 以外の場合
onmousewheel イベントを使用します。
■ WheelEvent について(Events Level3)
■ WheelEvent に対応しているか調べる
window.WheelEvent が真であるか比較します。
この方法は、Safari 6 以前の環境では、正しく動作しません。
■ホイールの操作を監視する
onwheel イベントを使用します。
登録したコールバック関数の引数から、WheelEvent オブジェクトが得られます。
ホイールを回転すると実行されるイベント
// WheelEvent に対応している
if(window.WheelEvent){
// ------------------------------------------------------------
// ホイールを操作すると実行されるイベント
// ------------------------------------------------------------
document.addEventListener("wheel" , function (e){
// 出力テスト
console.log(e);
});
}
■ WheelEvent オブジェクトについて
以下の読み取り専用のプロパティがあります。
プロパティ名 | 型 | 説明 |
deltaX | Number | x 軸方向の測定値を取得する。 |
deltaY | Number | y 軸方向の測定値を取得する。 |
deltaZ | Number | z 軸方向の測定値を取得する。 |
deltaMode | Number | 測定値のモードを取得する。 |
■ DeltaMode について
以下のモードが、定数として定義されています。
定数 | 番号 | 説明 |
WheelEvent. | 0 | 値の単位は、ピクセル値である。 |
WheelEvent. | 1 | 値の単位は、行数である。 |
WheelEvent. | 2 | 値の単位は、ページ数である。 |
■取得例
ホイールを操作を取得する
// WheelEvent に対応している
if(window.WheelEvent){
// ------------------------------------------------------------
// ホイールを操作すると実行されるイベント
// ------------------------------------------------------------
document.addEventListener("wheel" , function (e){
console.log("deltaX:" + e.deltaX);
console.log("deltaY:" + e.deltaY);
console.log("deltaZ:" + e.deltaZ);
console.log("deltaMode:" + e.deltaMode);
console.log(" ----- ");
});
}
■任意のエレメントにリスナーを登録した場合
検出範囲は、任意の要素とその子孫に限定されます。
任意のエレメントにコールバック関数を登録する
<html>
<body>
<div id="aaa" style="width:300px; height:200px; background:#f44; border:5px #a00 solid;" ></div>
<script type="text/javascript">
<!--
// id 属性が、"aaa" であるエレメントを取得
var element = document.getElementById("aaa");
// WheelEvent に対応している
if(window.WheelEvent){
// ------------------------------------------------------------
// ホイールを操作すると実行されるイベント
// ------------------------------------------------------------
element.addEventListener("wheel" , function (e){
alert("ホイールを操作した");
});
}
//-->
</script>
</body>
</html>
■ホイール操作によるスクロールを無効化する
preventDefault() メソッドを実行します。
ホイール操作によるスクロールをキャンセルする
// WheelEvent に対応している
if(window.WheelEvent){
// ------------------------------------------------------------
// ホイールを操作すると実行されるイベント
// ------------------------------------------------------------
document.addEventListener("wheel" , function (e){
// ホイール操作によるスクロールを無効化する
e.preventDefault();
});
}
■ MouseWheelEvent イベントについて(非標準)
■ onmousewheel イベントのサポート状況について
IE6 を含む多くのブラウザで動作します。
非標準であり、環境依存です。
Firefox は、onmousewheel イベントに対応していません。
かわりに、MouseScrollEvent を使用します。
■マウスホイールの回転を監視する
onmousewheel イベントを使用します。
登録したコールバック関数の引数から、MouseWheelEvent オブジェクトが得られます。
マウスホイールを回転すると実行されるイベント
// ------------------------------------------------------------
// マウスホイールを回転すると実行されるイベント
// ------------------------------------------------------------
document.onmousewheel = function (e){
if(!e) e = window.event; // レガシー
// 出力テスト
console.log(e);
};
■ MouseWheelEvent オブジェクトについて
以下のプロパティがあります。
プロパティ | 型 | 解説 |
wheelDelta | Number | マウスホイールの回転量。120 ずつ増減。(環境によって異なる) 正の値で上方向に回転、 負の値で下方向に回転。 |
■取得例(イベントリスナー)
マウスホイールの回転量を調べる
// ------------------------------------------------------------
// マウスホイールを回すと実行される関数
// ------------------------------------------------------------
function MouseWheelFunc(e){
// 回転量
var delta = -e.wheelDelta;
// 出力テスト
console.log("delta:" + delta);
}
// ------------------------------------------------------------
// イベントのリッスンを開始する
// ------------------------------------------------------------
// イベントリスナーに対応している
if(document.addEventListener){
// マウスホイールを回すと実行されるイベント
document.addEventListener("mousewheel" , MouseWheelFunc);
// アタッチイベントに対応している
}else if(document.attachEvent){
// マウスホイールを回すと実行されるイベント
document.attachEvent("onmousewheel" , MouseWheelFunc);
}
■取得例(イベントプロパティ)
マウスホイールの回転量を調べる
// ------------------------------------------------------------
// マウスホイールを回転すると実行されるイベント
// ------------------------------------------------------------
document.onmousewheel = function (e){
if(!e) e = window.event; // レガシー
// 回転量
var delta = -e.wheelDelta;
// 出力テスト
console.log("delta:" + delta);
};
■マウスホイールの回転によるスクロールを無効化する
preventDefault() メソッドを実行します。
マウスホイールの回転によるスクロールをキャンセルする
// ------------------------------------------------------------
// マウスホイールを回転すると実行される関数
// ------------------------------------------------------------
function MouseWheelFunc(e){
if(!e) e = window.event; // レガシー
// ------------------------------------------------------------
// マウスホイールの回転によるスクロールをキャンセルする
// ------------------------------------------------------------
if(e.preventDefault){
// デフォルトの動作を無効化する
e.preventDefault();
}else{
// デフォルトの動作を無効化する(非標準)
return false;
}
}
// ------------------------------------------------------------
// イベントのリッスンを開始する
// ------------------------------------------------------------
// イベントリスナーに対応している
if(document.addEventListener){
// マウスホイールを回すと実行されるイベント
document.addEventListener("mousewheel" , MouseWheelFunc);
// アタッチイベントに対応している
}else if(document.attachEvent){
// マウスホイールを回すと実行されるイベント
document.attachEvent("onmousewheel" , MouseWheelFunc);
// イベントプロパティを使用する
}else{
// マウスホイールを回すと実行されるイベント
document.onmousewheel = MouseWheelFunc;
}
■ MouseScrollEvent について(非標準、Firefox 専用)
■ MouseScrollEvent イベントに対応しているか調べる
window.MouseScrollEvent が真であるか比較します。
Firefox のみサポートしています。
■マウスホイールの回転を監視する
以下の種類があります。
イベント名 | 型 | 解説 |
"DOMMouseScroll" | MouseScrollEvent | マウスホイールの回転を監視する(結果は行数) |
"MozMousePixelScroll" | MouseScrollEvent | マウスホイールの回転を監視する(結果はピクセル値) |
■ MouseScrollEvent オブジェクトについて
以下のプロパティがあります。
プロパティ | 型 | 解説 |
detail | Number | マウスホイールの回転量。単位はイベントごとに異なる。 正の値で下方向に回転、 負の値で上方向に回転。 |
axis | Number | 水平方向なら 1 垂直方向なら 2 |
■取得例
マウスホイールの回転量を調べる(Firefox 専用)
// MouseScrollEvent に対応している
if(window.MouseScrollEvent){
// ------------------------------------------------------------
// マウスホイールを回すと実行されるイベント(結果は行数)
// ------------------------------------------------------------
document.addEventListener( "DOMMouseScroll" , function (e) {
// 回転量
var delta = e.detail;
// 方向
var axis = e.axis;
// 出力テスト
console.log(delta , axis);
});
// ------------------------------------------------------------
// マウスホイールを回すと実行されるイベント(結果はピクセル値)
// ------------------------------------------------------------
document.addEventListener( "MozMousePixelScroll" , function (e) {
// 回転量
var delta = e.detail;
// 方向
var axis = e.axis;
// 出力テスト
console.log(delta , axis);
});
}
■マウスホイールの回転によるスクロールを無効化する
preventDefault() メソッドを実行します。
マウスホイールの回転によるスクロールをキャンセルする
// MouseScrollEvent に対応している
if(window.MouseScrollEvent){
// ------------------------------------------------------------
// マウスホイールを回すと実行されるイベント
// ------------------------------------------------------------
document.addEventListener("DOMMouseScroll" , function (e){
// マウスホイールの回転によるスクロールをキャンセルする
e.preventDefault();
});
}
コンテキストメニューが表示されるか調べる
■コンテキストメニューが表示される直前か監視する
oncontextmenu イベントを使用します。
登録したコールバック関数の引数から、MouseEvent オブジェクトが得られます。
コンテキストメニューが表示される直前に実行されるイベント
// ------------------------------------------------------------
// コンテキストメニューが表示される直前に実行されるイベント
// ------------------------------------------------------------
document.oncontextmenu = function (e){
if(!e) e = window.event; // レガシー
// 出力テスト
console.log(e);
};
■任意のエレメントにリスナーを登録した場合
検出範囲は、任意の要素とその子孫に限定されます。
任意のエレメントにコールバック関数を登録する
<html>
<body>
<div id="aaa" style="width:300px; height:200px; background:#f44; border:5px #a00 solid;" ></div>
<script type="text/javascript">
<!--
// id 属性が、"aaa" であるエレメントを取得
var element = document.getElementById("aaa");
// ------------------------------------------------------------
// コンテキストメニューが表示される直前に実行されるイベント
// ------------------------------------------------------------
element.oncontextmenu = function (e){
if(!e) e = window.event; // レガシー
alert("コンテキストメニューが表示される");
};
//-->
</script>
</body>
</html>
■コンテキストメニューの表示を無効化する
preventDefault() メソッドを実行します。
コンテキストメニューの表示をキャンセルする
// ------------------------------------------------------------
// コンテキストメニューが表示される直前に実行される関数
// ------------------------------------------------------------
function MouseContextMenuFunc(e){
if(!e) e = window.event; // レガシー
// ------------------------------------------------------------
// コンテキストメニューの表示をキャンセルする
// ------------------------------------------------------------
if(e.preventDefault){
// デフォルトの動作を無効化する
e.preventDefault();
}else{
// デフォルトの動作を無効化する(非標準)
return false;
}
}
// ------------------------------------------------------------
// イベントのリッスンを開始する
// ------------------------------------------------------------
// イベントリスナーに対応している
if(document.addEventListener){
// コンテキストメニューが表示される直前に実行されるイベント
document.addEventListener("contextmenu" , MouseContextMenuFunc);
// アタッチイベントに対応している
}else if(document.attachEvent){
// コンテキストメニューが表示される直前に実行されるイベント
document.attachEvent("oncontextmenu" , MouseContextMenuFunc);
}else{
// コンテキストメニューが表示される直前に実行されるイベント
document.oncontextmenu = MouseContextMenuFunc;
}
■取得例(イベントリスナー)
コンテキストメニューが表示されるか調べる
// ------------------------------------------------------------
// コンテキストメニューが表示される直前に実行される関数
// ------------------------------------------------------------
function MouseContextMenuFunc(e){
console.log("コンテキストメニューが表示される");
}
// ------------------------------------------------------------
// イベントのリッスンを開始する
// ------------------------------------------------------------
// イベントリスナーに対応している
if(document.addEventListener){
// コンテキストメニューが表示される直前に実行されるイベント
document.addEventListener("contextmenu" ,MouseContextMenuFunc);
// アタッチイベントに対応している
}else if(document.attachEvent){
// コンテキストメニューが表示される直前に実行されるイベント
document.attachEvent("oncontextmenu" , MouseContextMenuFunc);
}
■取得例(イベントプロパティ)
コンテキストメニューが表示されるか調べる
// ------------------------------------------------------------
// コンテキストメニューが表示される直前に実行されるイベント
// ------------------------------------------------------------
document.oncontextmenu = function (e){
if(!e) e = window.event; // レガシー
console.log("コンテキストメニューが表示される");
};
マウスカーソルについて
■ネイティブのマウスカーソルを変更する
cursor スタイルを使用します。
任意の要素の上でマウスを移動すると、アイコンが変化します。
■汎用カーソルを設定する
cursor プロパティには、以下の値を指定する事ができます。
ブラウザや OS によっては、対応していない場合もあります。
値 | 解説 | L | |
"auto" | 最適なアイコンが自動で表示される(初期値) | 2 | |
"default" | 通常のアイコン(常時表示) | 2 | |
"none" | 何も表示しない | 3 | |
"context-menu" | コンテキストメニューが利用可能 | 3 | |
"help" | ヘルプが利用可能 | 2 | |
"pointer" | 指差し用アイコン | 2 | |
"progress" | 進捗(操作続行は可能) | 2 | |
"wait" | 待機(操作続行は不可能) | 2 | |
"cell" | 選択可能(セルなど) | 3 | |
"crosshair" | 十字カーソル | 2 | |
"text" | Iビームカーソル(横書テキスト用) | 2 | |
"vertical-text" | Iビームカーソル(縦書テキスト用) | 3 | |
"move" | 移動アイコン | 2 | |
"alias" | リンクアイコン | 3 | |
"copy" | コピーアイコン | 3 | |
"no-drop" | ドロップ不可 | 3 | |
"not-allowed" | 許可されていない | 3 | |
"n-resize" | リサイズ可能(北方向) | 2 | |
"ne-resize" | リサイズ可能(北東方向) | 2 | |
"e-resize" | リサイズ可能(東方向) | 2 | |
"se-resize" | リサイズ可能(南東方向) | 2 | |
"s-resize" | リサイズ可能(南方向) | 2 | |
"sw-resize" | リサイズ可能(南西方向) | 2 | |
"w-resize" | リサイズ可能(西方向) | 2 | |
"nw-resize" | リサイズ可能(北西方向) | 2 | |
"ns-resize" | リサイズ可能(垂直方向) | 3 | |
"ew-resize" | リサイズ可能(水平方向) | 3 | |
"nesw-resize" | リサイズ可能(北東方向と南西方向) | 3 | |
"nwse-resize" | リサイズ可能(北西方向と南東方向) | 3 | |
"col-resize" | リサイズ可能(列など) | 3 | |
"row-resize" | リサイズ可能(行など) | 3 | |
"all-scroll" | 全方向スクロール | 3 | |
"zoom-in" | ズームイン用 | 3 | |
"zoom-out" | ズームアウト用 | 3 | |
"grab" | 掴み操作が利用可能 | 3 | |
"grabbing" | 掴み操作中 | 3 |
汎用カーソルを表示する
<html>
<body>
<div id="aaa" style="height:300px; margin:20px; background:#fcc;" ></div>
<script type="text/javascript">
<!--
// ------------------------------------------------------------
// "aaa" という ID 属性のエレメントを取得する
// ------------------------------------------------------------
var element = document.getElementById("aaa");
// ------------------------------------------------------------
// CSSStyleDeclaration オブジェクトを取得
// ------------------------------------------------------------
var style = element.style;
// ------------------------------------------------------------
// 汎用カーソルを指定する
// ------------------------------------------------------------
style.cursor = "move";
//-->
</script>
</body>
</html>
■任意の画像をカーソルに設定する
cursor プロパティに、『 url("URL") 』値を指定します。
カンマで区切って、複数の候補を指定する事もできます。
候補の最後に、汎用カーソル値を、必ず1つ含める必要があります。
CSS3 では、『 url("URL") x y 』値を指定できます。
x y は、表示オフセット値です。
カスタムカーソルを表示する
<html>
<body>
<div id="aaa" style="height:300px; margin:20px; background:#fcc;" ></div>
<script type="text/javascript">
<!--
// ------------------------------------------------------------
// "aaa" という ID 属性のエレメントを取得する
// ------------------------------------------------------------
var element = document.getElementById("aaa");
// ------------------------------------------------------------
// CSSStyleDeclaration オブジェクトを取得
// ------------------------------------------------------------
var style = element.style;
// ------------------------------------------------------------
// カーソルに任意の画像を指定する(表示できない場合、最後に指定した汎用カーソルが表示される)
// ------------------------------------------------------------
style.cursor = 'url("http://example.com/cursor/001.gif") 8 8, crosshair';
// ------------------------------------------------------------
// CSS3 の書式が未対応の場合、CSS2 の書式を指定する
// ------------------------------------------------------------
if(!(style.cursor)){
style.cursor = 'url("http://example.com/cursor/000.gif"), crosshair';
}
//-->
</script>
</body>
</html>
■要素をマウスカーソルのように移動する
画像イメージ要素を、常にマウスカーソルの位置に表示する方法について確認します。
1.イメージ要素を作成する
画像イメージ要素を作成します。
2.画像の読み込みを開始する
src プロパティに、画像の URL を指定します。
3.画像をブラウザに表示する
<BODY> 要素のノードリストに登録します。
4.画像のスタイルを設定する
position スタイルに、"fixed" を指定します。
5.画像の位置を変更する
マウスカーソルの位置を取得します。
要素の移動については、こちらで解説しています。
■実装例
マウスカーソルの座標をエレメントの位置に反映する
// ------------------------------------------------------------
// HTMLImageElement オブジェクトを作成する
// ------------------------------------------------------------
var image = new Image();
// ------------------------------------------------------------
// URL を指定して、画像の読み込みを開始する
// ------------------------------------------------------------
image.src = "http://example.com/graphics/cursor.png";
// ------------------------------------------------------------
// BODY のノードリストに登録
// ------------------------------------------------------------
document.body.appendChild(image);
// ------------------------------------------------------------
// position スタイルを "fixed" に設定
// ------------------------------------------------------------
image.style.position = "fixed";
// ------------------------------------------------------------
// マウスカーソルが移動したときに呼び出されるイベント
// ------------------------------------------------------------
document.onmousemove = function (e){
if(!e) e = window.event; // レガシー
// ------------------------------------------------------------
// 画像要素の位置を更新する
// ------------------------------------------------------------
image.style.left = (e.clientX) + "px";
image.style.top = (e.clientY) + "px";
};
マウス操作を無効化する
■キャンセルに対応しているイベント
以下のイベントは、キャンセルに対応しています。(一部抜粋)
イベント名 | 型 | 解説 |
onmousedown | MouseEvent | マウスボタンを押すと実行されるイベント |
onmouseup | MouseEvent | マウスボタンを離すと実行されるイベント |
onclick | MouseEvent | クリック時に実行されるイベント |
ondblclick | MouseEvent | ダブルクリック時に実行されるイベント |
oncontextmenu | MouseEvent | コンテキストメニューが表示される直前に実行されるイベント |
onmouseover | MouseEvent | マウスカーソルが、外から内側へ侵入した時に実行されるイベント |
onmouseout | MouseEvent | マウスカーソルが、内側から外へ撤退した時に実行されるイベント |
onwheel | MouseEvent | ホイールを回転した時に実行されるイベント |
■ onmousedown イベントのキャンセルについて
■中止可能な機能
ドラッグの発生を、阻止する事ができます。
ドラッグやダブルクリック操作による、文字列の選択を阻止する事ができます。
マウス中央ボタンクリックによる、オートスクロールの発生を阻止する事ができます。
■オートスクロール機能を無効化する
Opera(Presto 版) では、対応していません。
Internet Explorer 8 以前では、対応していません。
オートスクロール機能のみを無効化する
<html>
<body>
<div id="aaa" style="width:auto; height:5000px; margin:0px 100px; background:#fcc;" ></div>
<script type="text/javascript">
<!--
// ------------------------------------------------------------
// "aaa" という ID 属性のエレメントを取得する
// ------------------------------------------------------------
var element = document.getElementById("aaa");
// ------------------------------------------------------------
// マウスボタンを押すと実行されるイベント
// ------------------------------------------------------------
element.addEventListener("mousedown" , function (e){
// 中央ボタンに変化がある
if(e.button == 1){
// オートスクロールを無効化
e.preventDefault();
}
});
//-->
</script>
</body>
</html>
■ onclick イベントのキャンセルについて
■中止可能な機能
クリック操作による、決定を阻止する事ができます。
onclick イベントは、マウス操作だけでなく、エンターキー操作も含まれます。
■ハイパーリンクを無効化する
こちらで解説しています。