Copyright © 2026 World Wide Web Consortium. W3C® liability, trademark and permissive document license rules apply.
Pointer Events仕様は、マウス、タッチスクリーン、ペン/スタイラスなど様々なデバイスからの入力を扱う、ハードウェア非依存の統一されたフレームワークを定義します。単一のイベントセット(例:pointerdown、pointermove、pointerup)を提供することで、開発者は各デバイス固有のロジックを書くことなく、多様な入力手法をサポートできます。
この仕様はまた、MouseおよびWheelイベント、さらに他のポインタデバイスタイプに対してMouseイベントを発火させるマッピングも定義しています。
このセクションは、この 文書が公開された時点でのステータスを説明します。最新のW3C 公開文書およびこの技術レポートの最新版は、 W3C 規格・ドラフト一覧 で確認できます。
本仕様は [PointerEvents3] 仕様の更新版です。また以前は [UIEVENTS] 仕様にあった Mouse および Wheel イベントも含みます。
この改訂には新機能が含まれています:
persistentDeviceId ― 複数回の操作にわたり入力デバイスの安定した識別子を提供touch-action値:pan-left、
pan-right、pan-up、pan-down
この文書は、Pointer Events ワーキンググループによって 勧告トラックに沿って作業草案(Working Draft)として公開されました。
作業草案としての公開は、W3Cおよびその会員による承認を意味するものではありません。
本文書はドラフトであり、いつでも更新、置き換え、または他の文書によって廃止されることがあります。他のものとして引用するのは適切ではなく、「作業中の文書」としてのみ扱ってください。
この文書は、 W3C 特許 ポリシー の下で活動するグループによって作成された。 W3C は、 グループの成果物に関連して行われたあらゆる特許開示の 公開リスト を維持している。そのページには、特許を開示するための手順も含まれる。特許についての実際の知識を有し、かつその特許が エッセンシャル・クレーム(Essential Claim(s)) を含むと当人が信じる場合、その個人は W3C 特許ポリシーの第 6 節 に従って当該情報を開示しなければならない。
本文書は 2025年8月18日 W3Cプロセス文書に従って運用されています。
このセクションは規範的ではありません。
今日のほとんどの[HTML]コンテンツはマウス入力で使用・設計されています。カスタムな方法で入力を処理するものは、たいてい[UIEVENTS]マウスイベント用にコーディングされています。しかし、近年のコンピュータデバイスは、タッチスクリーンやペン入力を含む他の入力形式も取り入れています。これら個別の入力形式を扱うためのイベントタイプも提案されてきましたが、その手法では新たな入力タイプのサポート追加時にロジックやイベントハンドリングが重複しがちで、不要なオーバーヘッドが発生します。コンテンツが1つのデバイスタイプのみを想定して書かれた場合、これが互換性問題となることも多いです。さらに既存のマウスベースのコンテンツとの互換のため、ほとんどのユーザーエージェントは全ての入力タイプに対してマウスイベントを発火します。これにより、マウスイベントが実際のマウスデバイスによるものか、互換性のため他の入力タイプから生成されたものか曖昧になり、両方のデバイスタイプに対応したコードを書くのが困難になります。
複数の入力タイプへの対応コスト低減や、マウスイベントが持つ上記の曖昧さ解決のため、本仕様はポインターと呼ばれる、より抽象的な入力モデルを定義します。ポインターは、マウスカーソル、ペン、タッチ(マルチタッチ含む)、その他の指す入力デバイスによるスクリーン上の任意の接触点を示します。このモデルにより、ユーザーがどんなハードウェアを持っていても正常に動作するサイトやアプリケーションが作成しやすくなります。デバイス固有の処理が必要なシナリオ向けに、どのデバイスタイプからイベントが生成されたかを調べるプロパティも定義されています。主な目的は、クロスデバイスポインタ入力対応のための、より簡単な記述を可能にする単一のイベント・インターフェース群を提供しつつ、拡張的な体験のために必要に応じてデバイス固有処理も許容することです。
さらに重要な目的として、ユーザーエージェントがマルチスレッドでダイレクト操作(例えば、指やスタイラスによるパンやズーム)をスクリプト実行でブロックすることなく処理できるようにする点も挙げられます。
本仕様はさまざまなポインター入力に対する統一イベントモデルを定義しますが、このモデルはキーボードやキーボードライクなインターフェース(たとえば、スクリーンリーダーや、タッチスクリーンのみのデバイス上で動作する類似支援技術で、ユーザーがフォーカス可能なコントロールや要素を順次移動する場合)などには対応しません。ユーザーエージェントがこれらインターフェースへの応答としてポインターイベントも生成する選択肢はありますが、この仕様ではそのケースを対象としていません。
まずはfocusやblur、clickといった高レベルイベントに対応することで、あらゆる入力形式で等価な機能を提供することが推奨されます。ただし、Pointer
Eventsなど低レベルイベントを使う場合は、全ての入力タイプがサポートされていることを確認してください。キーボードやその類似インターフェースの場合、明示的にキーボードイベント処理を追加する必要があるかもしれません。詳しくはキーボード対応
[WCAG22]を参照してください。
汎用的なポインター入力を扱うイベントはマウスのものと非常によく似ています:pointerdown、pointermove、pointerup、pointerover、pointeroutなどです。これにより、マウスイベントからポインターイベントへのコンテンツ移行が容易になります。
Pointer
Eventsは、クライアント座標・ターゲット要素・ボタン状態などマウスイベントが持つ従来プロパティに加え、圧力・接触幾何・傾きなど他の入力形式向けの新しいプロパティも提供します。著者は入力タイプ間でロジックを共有しつつ、必要な場合のみ特定の入力種に特化した処理を記述できます。
Pointer Eventsは様々な入力デバイスから発生しますが、他のデバイス固有イベントから生成されるものとは定義されません。互換性確保のため、他イベントからの変換も可能かつ推奨ですが、この仕様は他デバイス固有イベント(マウス・タッチイベント等)のサポートを必須とはしません。ユーザーエージェントが他のデバイスイベントを一切サポートせずpointer eventsのみ持つことも可能です。マウス固有イベント向けのコンテンツ互換のため、本仕様はオプションで、マウス以外のデバイス入力より 互換マウスイベントを生成する方法も記述します。
本仕様は、[TOUCH-EVENTS]で定義されたTouch EventsとPointer Eventsの両方をサポートするユーザーエージェントにおける、期待される挙動については助言しません。これら2つの仕様の関係の詳細はTouch Events Community Groupを参照してください。
非規範的と明記されたセクションと同様に、本仕様に含まれるすべてのオーサリングガイドライン、図、例、注記は非規範的である。それ以外の本仕様の内容は規範的である。
本文書中のキーワード MAY、MUST、MUST NOT、OPTIONAL、および SHOULD は、 ここに示すようにすべて大文字で現れる場合に限り、 BCP 14 [RFC2119] [RFC8174] に記述されているとおりに解釈される。
このセクションは規範的ではありません。
以下は、本仕様の一部のAPIが著者によってどのように使用されうるかを示す基本的な例である。さらに具体的な例は、本書の関連セクションで示される。
/* Bind to either Pointer Events or traditional touch/mouse */
if (window.PointerEvent) {
// if Pointer Events are supported, only listen to pointer events
target.addEventListener("pointerdown", function(e) {
// if necessary, apply separate logic based on e.pointerType
// for different touch/pen/mouse behavior
...
});
...
} else {
// traditional touch/mouse event handlers
target.addEventListener('touchstart', function(e) {
// prevent compatibility mouse events and click
e.preventDefault();
...
});
...
target.addEventListener('mousedown', ...);
...
}
// additional event listeners for keyboard handling
...
window.addEventListener("pointerdown", detectInputType);
function detectInputType(event) {
switch(event.pointerType) {
case "mouse":
/* mouse input detected */
break;
case "pen":
/* pen/stylus input detected */
break;
case "touch":
/* touch input detected */
break;
default:
/* pointerType is empty (could not be detected)
or UA-specific custom type */
}
}
<div style="position:absolute; top:0px; left:0px; width:100px;height:100px;"></div>
<script>
window.addEventListener("pointerdown", checkPointerSize);
function checkPointerSize(event) {
event.target.style.width = event.width + "px";
event.target.style.height = event.height + "px";
}
</script>
const event1 = new PointerEvent("pointerover",
{ bubbles: true,
cancelable: true,
composed: true,
pointerId: 42,
pointerType: "pen",
clientX: 300,
clientY: 500
});
eventTarget.dispatchEvent(event1);
let pointerEventInitDict =
{
bubbles: true,
cancelable: true,
composed: true,
pointerId: 42,
pointerType: "pen",
clientX: 300,
clientY: 500,
};
const p1 = new PointerEvent("pointermove", pointerEventInitDict);
pointerEventInitDict.clientX += 10;
const p2 = new PointerEvent("pointermove", pointerEventInitDict);
pointerEventInitDict.coalescedEvents = [p1, p2];
const event2 = new PointerEvent("pointermove", pointerEventInitDict);
eventTarget.dispatchEvent(event2);
<div style="position:absolute; top:0px; left:0px; width:100px;height:100px;"></div>
<script>
window.addEventListener("pointerdown", assignPenColor);
window.addEventListener("pointermove", assignPenColor);
const colorMap = new Map();
function assignPenColor(event) {
const uniqueId = event.persistentDeviceId;
// Check if a unique Id exists.
if (uniqueId == 0) {
return;
}
// Check if a color has been assigned to the device.
if (map.has(uniqueId)) {
return;
}
// Assign a color to the device.
let newColor = getNewColor();
map.set(uniqueId, newColor);
return newColor;
}
function getNewColor() {
/* return some color value */
}
</script>
マウスイベントモジュールは、[HTML401] の onclick、
ondblclick、onmousedown、onmouseup、onmouseover、
onmousemove、および onmouseout
属性に由来する。このイベントモジュールは、マウスやトラックボールなどのポインティング入力デバイスでの利用のために特別に設計されている。
DOM Level 2 で導入され、本仕様で修正された。
MouseEvent インターフェースは、Mouseイベントに関連する特定の文脈情報を提供する。
ネストされた要素の場合、mouseイベントは常に最も深くネストされた要素をターゲットとする。
ターゲットとなった要素の祖先は、イベントバブリングを用いることで、子孫要素内で発生するmouseイベントの通知を取得できる。
MouseEvent インターフェースのインスタンスを作成するには、
MouseEvent コンストラクターを使用し、任意の MouseEventInit ディクショナリを渡す。
initMouseEvent を使用して MouseEvent オブジェクトを初期化する際、実装はクライアント座標 clientX および clientY を、他の座標(DOM Level 0
実装で公開されるターゲット座標や、他の独自属性、例:pageX)の計算に利用できる。
WebIDL[Exposed=Window]
interface MouseEvent : UIEvent {
constructor(DOMString type, optional MouseEventInit eventInitDict = {});
readonly attribute long screenX;
readonly attribute long screenY;
readonly attribute long clientX;
readonly attribute long clientY;
readonly attribute long layerX;
readonly attribute long layerY;
readonly attribute boolean ctrlKey;
readonly attribute boolean shiftKey;
readonly attribute boolean altKey;
readonly attribute boolean metaKey;
readonly attribute short button;
readonly attribute unsigned short buttons;
boolean getModifierState(DOMString keyArg);
};
screenXイベントが発生した水平座標(スクリーン座標系の原点に対する相対位置)。
この属性の 未初期化値 は MUST 0 でなければならない。
screenYイベントが発生した垂直座標(スクリーン座標系の原点に対する相対位置)。
この属性の 未初期化値 は MUST 0 でなければならない。
clientXイベントに関連付けられたビューポートの原点に対する、イベントが発生した水平座標。
この属性の 未初期化値 は MUST 0 でなければならない。
clientYイベントに関連付けられたビューポートの原点に対する、イベントが発生した垂直座標。
この属性の 未初期化値 は MUST 0 でなければならない。
layerX最も近い 祖先 要素(それがスタッキングコンテキストである、positionedである、または スタッキングコンテキストを描画する際に positioned フェーズで描画される)からの水平オフセット。
この属性の 未初期化値 は MUST 0 でなければならない。
layerY最も近い 祖先 要素(それがスタッキングコンテキストである、positionedである、または スタッキングコンテキストを描画する際に positioned フェーズで描画される)からの垂直オフセット。
この属性の 未初期化値 は MUST 0 でなければならない。
ctrlKey
KeyboardEvent の ctrlKey
属性を参照。
この属性の 未初期化値 は MUST false でなければならない。
shiftKey
KeyboardEvent の shiftKey
属性を参照。
この属性の 未初期化値 は MUST false でなければならない。
altKey
KeyboardEvent の altKey
属性を参照。
この属性の 未初期化値 は MUST false でなければならない。
metaKey
KeyboardEvent の metaKey
属性を参照。
この属性の 未初期化値 は MUST false でなければならない。
button
マウスボタンの押下または解放によって引き起こされるmouseイベントの間、button
は、どのポインタデバイスのボタンが状態を変更したかを示すために MUST 使用されなければならない。
button 属性の値は、次のとおりで MUST である:
0
はデバイスの主ボタン(一般に左ボタン、または単一ボタンデバイスの唯一のボタンで、UIコントロールのアクティベートやテキスト選択に使用される)または未初期化値を示すものとして
MUST である。
1 は補助ボタン(一般に中央ボタンで、しばしばマウスホイールと組み合わされる)を示すものとして MUST である。
2 は副ボタン(一般に右ボタンで、しばしばコンテキストメニューの表示に用いられる)を示すものとして MUST である。
3 は X1(戻る)ボタンを示すものとして MUST である。
4 は X2(進む)ボタンを示すものとして MUST である。
一部のポインティングデバイスは、より多くのボタン状態を提供またはシミュレートするため、そのようなボタンを表すために 2 より大きい値または
0 より小さい値を MAY 用いてよい。
button
の値は、マウスボタンの押下/解放によって引き起こされないイベントでは更新されない。これらのシナリオでは、値 0
を左ボタンとして解釈せず、デフォルト値として扱うよう注意すること。
この属性の 未初期化値 は MUST 0 でなければならない。
buttons
いかなるmouseイベントの間も、buttons
は、現在押下されているマウスボタンの組み合わせを、ビットマスクとして表現して示すために MUST 使用されなければならない。
名前は似ているが、buttons 属性と button 属性の値は大きく異なる。button の値は mousedown / mouseup イベントハンドラーの間に有効であると仮定される一方、buttons 属性は、任意の信頼された MouseEvent
オブジェクト(ディスパッチ中)のボタン状態を反映する。これは、「現在アクティブなボタンがない」状態(0)を表現できるためである。
buttons 属性の値は、次のとおりで MUST である:
0 は、現在アクティブなボタンがないことを示すものとして MUST である。
1
はデバイスの主ボタン(一般に左ボタン、または単一ボタンデバイスの唯一のボタンで、UIコントロールのアクティベートやテキスト選択に使用される)を示すものとして MUST である。
2 は(存在する場合)副ボタン(一般に右ボタンで、しばしばコンテキストメニューの表示に用いられる)を示すものとして MUST である。
4 は補助ボタン(一般に中央ボタンで、しばしばマウスホイールと組み合わされる)を示すものとして MUST である。
一部のポインティングデバイスは、より多くのボタンを提供またはシミュレートする。そのようなボタンを表すため、値はボタンが増えるごとに倍増されるものとして MUST である(2進系列 8、16、32、...)。
任意のボタン値集合の合計は一意の数になるため、コンテンツ著者はビット演算を用いて、デバイス上の任意個数のマウスボタンについて、現在押下されているボタン数とどのボタンが押下されているかを判定できる。例えば、値
3 は左ボタンと右ボタンが同時に押下されていることを示し、値 5 は左ボタンと中央ボタンが同時に押下されていることを示す。
この属性の 未初期化値 は MUST 0 でなければならない。
relatedTarget
イベントの種類に応じて、UIイベントに関連する二次的な EventTarget
を識別するために使用される。
この属性の 未初期化値 は MUST null でなければならない。
キー値を用いて修飾キーの状態を問い合わせる。
それが修飾キーであり、かつ修飾が有効なら true を返し、それ以外は false を返す。
DOMString
keyArgKeyboardEvent
の
getModifierState()
メソッドを参照。
WebIDLdictionary MouseEventInit : EventModifierInit {
long screenX = 0;
long screenY = 0;
long clientX = 0;
long clientY = 0;
short button = 0;
unsigned short buttons = 0;
};
screenX
screenX
属性を、ユーザーのスクリーン上におけるマウスポインタの望ましい水平相対位置に、MouseEvent オブジェクト内で初期化する。
与えられたマウス位置でイベントオブジェクトを初期化しても、ユーザーのマウスポインタを初期化位置へ移動させてはならない。
screenY
screenY
属性を、ユーザーのスクリーン上におけるマウスポインタの望ましい垂直相対位置に、MouseEvent オブジェクト内で初期化する。
与えられたマウス位置でイベントオブジェクトを初期化しても、ユーザーのマウスポインタを初期化位置へ移動させてはならない。
clientX
clientX
属性を、ユーザーのブラウザーのクライアントウィンドウに対するマウスポインタの望ましい水平位置に、MouseEvent オブジェクト内で初期化する。
与えられたマウス位置でイベントオブジェクトを初期化しても、ユーザーのマウスポインタを初期化位置へ移動させてはならない。
clientY
clientY
属性を、ユーザーのブラウザーのクライアントウィンドウに対するマウスポインタの望ましい垂直位置に、MouseEvent オブジェクト内で初期化する。
与えられたマウス位置でイベントオブジェクトを初期化しても、ユーザーのマウスポインタを初期化位置へ移動させてはならない。
button
button
属性を、マウスのボタンの望ましい状態を表す数値として、MouseEvent オブジェクト内で初期化する。
値 0 は主マウスボタンを表すために使用され、1 は補助/中央マウスボタンを表すために使用され、2 は右マウスボタンを表すために使用される。2 より大きい数値も可能だが、本書では規定しない。
buttons
buttons
属性を、アクティブとみなされるマウスのボタンのうちの 1つ以上 を表す数値として、MouseEvent オブジェクト内で初期化する。
buttons
属性はビットフィールドである。ビットフィールド値にマスク値 1 を適用したときに真であれば、主マウスボタンが押下されている。マスク値 2
を適用したときに真であれば、右マウスボタンが押下されている。マスク値 4 を適用したときに真であれば、補助/中央ボタンが押下されている。
JavaScriptでは、右(2)および中央ボタン(4)が同時に押下されているかのように buttons
属性を初期化するには、buttons 値を次のいずれかとして代入できる:
{ buttons: 2 | 4 }
または:
{ buttons: 6 }
relatedTarget
relatedTarget
は、マウスポインタがちょうど離れた境界を持つ要素(mouseover または mouseenter
イベントの場合)または、マウスポインタが侵入しつつある境界を持つ要素(mouseout または mouseleave または focusout
イベントの場合)として初期化されるべきである。その他のイベントでは、この値は代入する必要はない(既定値は null となる)。
実装は、mouseイベント生成時に 現在のクリック数 を維持しなければならない(MUST)。これは、特定時間内にポインティングデバイスのボタンが連続クリックされた回数を示す非負整数でなければならない(MUST)。カウントがリセットされるまでの遅延は、環境設定に固有である。
このセクションのアルゴリズムは、ネイティブプラットフォーム OS が次のものを提供することを前提とする:
これらのイベントについて、OS は次の情報を提供できる:
このセクションは改訂が必要である。
一般に、Event インターフェース、または Event
インターフェースを継承するインターフェースのコンストラクターが呼び出された場合、[DOM] に記述された手順に従うべきである。しかし MouseEvent インターフェースは、Event
オブジェクトのキー修飾子に関する内部状態を初期化するための追加ディクショナリメンバーを提供する。具体的には、getModifierState()
メソッドで問い合わせられる内部状態である。このセクションは、これら任意の修飾子状態を用いて新しい MouseEvent オブジェクトを初期化するための、[DOM]
の手順を補足する。
MouseEvent(または、以下のアルゴリズムを用いてそれらから派生したオブジェクト)を構築する目的において、すべての
MouseEvent および派生オブジェクトは、internal key modifier state を持つ。これは、[UIEvents-Key] の Modifier Keys table で記述される key modifier names を用いて、設定および取得できる。
次の手順は、[DOM] で定義されたイベント構築アルゴリズムを補足する:
Event が MouseEvent
オブジェクト、またはそれから派生したオブジェクトであり、かつコンストラクターに EventModifierInit
引数が提供された場合、次のサブステップを実行する:
EventModifierInit
引数について、ディクショナリメンバーが文字列 "modifier" で始まるなら、key modifier name を、接頭辞
"modifier" を除いたディクショナリメンバー名とし、Event オブジェクトの internal key
modifier state のうち、その key modifier name に一致するものを、対応する値に設定する。
このセクションは改訂が必要である。
UA は、ユーザーエージェント全体で共有される次の値を維持しなければならない。
マウスボタンの現在状態を追跡する mouse button bitmask。
UA は、ウィンドウで共有される次の値を維持しなければならない。
last
mouse element 値(初期状態は未定義)。これは、MouseEvent を送信した最後の Element
を追跡する。
last
mouse DOM path 値(初期状態は空)。これは、直近のmouseイベントが送信された時点における last mouse element の祖先 Element 群のスナップショットを含む。
このセクションは改訂が必要である。
MouseEvent は、各種修飾キーの状態を追跡するために用いられる次の内部フラグを持つ:
shift flag、
control
flag、
alt flag、
altgraph
flag、
および meta flag。
これらのフラグは、mouseイベント発生時点で対応する修飾キーが押下されていた場合に設定される。
このセクションは改訂が必要である。
elementFromPoint()
を pos で呼び出した結果(pos における最前面の DOM 要素)を返す
inert または disabled
要素を考慮するため、これは elementsFromPoint()
を呼び出し、無効な要素を除外すべきである。
MouseEvent を初期化するこのセクションは改訂が必要である。
event、eventType、eventTarget、bubbles、および cancelable を用いて initialize a MouseEvent を行うには、次の手順を実行する:
screenX
を、デスクトップの原点に対する相対位置として、イベントが発生した位置の x 座標に設定する
screenY
を、デスクトップの原点に対する相対位置として、イベントが発生した位置の y 座標に設定する
clientX を、viewport の原点に対する相対位置として、イベントが発生した位置の x
座標に設定する
clientY を、viewport の原点に対する相対位置として、イベントが発生した位置の y
座標に設定する
button を 0 に設定する
buttons を mouse button bitmask に設定する
ここにハードコードするのではなく、PointerLock のためのフックを提供すべきである。
このセクションは改訂が必要である。
MouseEvent を event とする
shiftKey を、イベントの shift flag が設定されている場合は true、そうでない場合は false に設定するctrlKey を、イベントの control flag が設定されている場合は true、そうでない場合は false に設定するaltKey を、イベントの alt flag または altgraph flag が設定されている場合は true、そうでない場合は false に設定する
metaKey を、イベントの meta flag が設定されている場合は true、そうでない場合は false に設定するこのセクションは改訂が必要である。
MouseEvent 型を含む
DOMString とするEventTarget とする
MouseEvent により作成した結果を
event とする
このセクションは改訂が必要である。
MouseEvent 型を含む
DOMString とするEventTarget とする
MouseEvent により作成した結果を
event とする
このセクションは改訂が必要である。
MouseEvent を event とする
TODO。
type が [
mousedown, mouseup ] のいずれかなら、
button を、
mbutton に対して calculate MouseEvent button
attribute を行った結果に設定する
このセクションは改訂が必要である。
他のボタンは 0x08 から追加できる。
このセクションは改訂が必要である。
mousedown と mouseup の間に、他のmouseイベントが発生することがある。
このセクションは改訂が必要である。
プラットフォームは、クリックを生成する mouseup に対して、handle native mouse up の直後にこれを呼び出すべきである。
このセクションは改訂が必要である。
EventTarget とする
screenX
が整数値でないなら、丸める。screenY
が整数値でないなら、丸める。PointerEvents を使用するブラウザーと丸められた座標についての情報は pointerevents/100 を参照。
いかなる「default action」も、ターゲットに対する activation behavior アルゴリズムをトリガーすることで、ディスパッチ中に処理される。したがって、ここでそれを扱う必要はない。 ただし、既存の仕様が disabled/css-pointer-events/inert/... を処理することを検証する必要がある。
HTMLelement.click() を扱うには、このアルゴリズムを native =
null、target = HTMLelement で呼び出す。
キーボード起点のクリックを扱うには、このアルゴリズムを native = null および target = 現在フォーカスされている要素 で呼び出す。
このセクションは改訂が必要である。
これは、ダブルクリックを生成する mouse click に対して、handle native mouse click の直後に呼び出されるべきである。
screenX が整数値でないなら、丸める。screenY が整数値でないなら、丸める。このセクションは改訂が必要である。
このアルゴリズムは PointerEvents のディスパッチに関して、現時点で明示的に規定されていない前提を置いている。pointerevents/285 が 解決されたら、更新が必要になるかもしれない。
TODO: mouseout 属性を native から設定する。+CSSOM 属性。
キャンセルされた場合の挙動を検証する(影響はないように見える)。
element が削除された場合を扱う。 移動された場合も扱う:DOM 変更によって mouseleave イベントがトリガーされるべきだったか?今送るべきか?破棄すべきか? 現在のブラウザーの挙動を検証する必要がある。
Event.composed
= false に設定する
互換性を確認:event.composed の値。仕様では false。Chrome/Linux = true。Firefox/Linux = false。
TODO: mouseout 属性を native から設定する。+CSSOM 属性。
キャンセルされた場合の挙動を検証する必要がある(影響はないように見える)。
element が削除または移動された場合を扱う。
Event.composed
= false に設定する
互換性を確認:event.composed の値。仕様では false。 Chrome/Linux = true。 Firefox/Linux = false。
shadow DOM 要素に関する互換性を確認する。Chrome/Linux はこのイベントを要素とシャドウルートで発火する。
本仕様で定義される特定のmouseイベントは、互いに相対して定められた順序で発生しなければならない(MUST)。以下は、ポインティングデバイスのカーソルが要素上へ移動したときに発生しなければならない(MUST)イベント列を示す:
| # | イベント種別 | 要素 | 注記 |
|---|---|---|---|
| 1 | mousemove
|
||
| ポインティングデバイスが要素Aの中へ移動する... | |||
| 2 | mouseover
|
A | |
| 3 | mouseenter
|
A | |
| 4 | mousemove
|
A | 複数の mousemove イベント
|
| ポインティングデバイスが要素Aの外へ移動する... | |||
| 5 | mouseout
|
A | |
| 6 | mouseleave
|
A |
ポインティングデバイスが要素 A の中へ移動し、次にネストされた要素 B の中へ移動し、その後再び外へ移動した場合、次のイベント列が発生しなければならない(MUST):
| イベント種別 | 要素 | 注記 | |
|---|---|---|---|
| 1 | mousemove
|
||
| ポインティングデバイスが要素Aの中へ移動する... | |||
| 2 | mouseover
|
A | |
| 3 | mouseenter
|
A | |
| 4 | mousemove
|
A | 複数の mousemove イベント
|
| ポインティングデバイスがネストされた要素Bの中へ移動する... | |||
| 5 | mouseout
|
A | |
| 6 | mouseover
|
B | |
| 7 | mouseenter
|
B | |
| 8 | mousemove
|
B | 複数の mousemove イベント
|
| ポインティングデバイスが要素BからAへ移動する... | |||
| 9 | mouseout
|
B | |
| 10 | mouseleave
|
B | |
| 11 | mouseover
|
A | |
| 12 | mousemove
|
A | 複数の mousemove イベント
|
| ポインティングデバイスが要素Aの外へ移動する... | |||
| 13 | mouseout
|
A | |
| 14 | mouseleave
|
A |
CSS を用いると、要素は視覚的に重なり合うことがある。次の例では、A、B、C とラベル付けされた3つの要素が、いずれも同一の寸法と、ウェブページ上での同一の絶対位置を持つ。要素 C は B の子であり、B は DOM 上で A の子である:
ポインティングデバイスが要素スタックの外側から、C とラベル付けされた要素へ移動し、その後再び外へ移動したとき、次の一連のイベントが発生しなければならない(MUST):
| イベント種別 | 要素 | 注記 | |
|---|---|---|---|
| 1 | mousemove
|
||
| ポインティングデバイスが、スタック中で最前面の要素である要素Cの中へ移動する | |||
| 2 | mouseover
|
C | |
| 3 | mouseenter
|
A | |
| 4 | mouseenter
|
B | |
| 5 | mouseenter
|
C | |
| 6 | mousemove
|
C | 複数の mousemove イベント
|
| ポインティングデバイスが要素Cの外へ移動する... | |||
| 7 | mouseout
|
C | |
| 8 | mouseleave
|
C | |
| 9 | mouseleave
|
B | |
| 10 | mouseleave
|
A |
mouseover/mouseout イベントは1回だけ発火される一方、mouseenter/mouseleave イベントは3回(各要素に1回ずつ)発火される。
次は、ポインティングデバイス(例:マウスボタンまたはトラックパッド)に関連付けられたボタンが、要素上で押下されて解放されたときの典型的なイベント列である:
| イベント種別 | 注記 | |
|---|---|---|
| 1 | mousedown
|
|
| 2 | mousemove
|
OPTIONAL、複数イベント、一定の制限あり |
| 3 | mouseup
|
|
| 4 | click
|
|
| 5 | mousemove
|
OPTIONAL、複数イベント、一定の制限あり |
| 6 | mousedown
|
|
| 7 | mousemove
|
OPTIONAL、複数イベント、一定の制限あり |
| 8 | mouseup
|
|
| 9 | click
|
|
| 10 | dblclick
|
mousedown と mouseup の間に許容される mousemove イベントの遅延時間、程度、距離、および個数(それでも click または dblclick
イベントを発火するかどうか)は、実装、デバイス、およびプラットフォームに固有である。この許容度は、手が震えるなどの身体的障害を持つユーザーがポインティングデバイスと対話する際に役立ちうる。
各実装は適切な hysteresis
の許容度を決定するが、一般に、関連する mousedown
および
mouseup イベントのイベントターゲットが、間に mouseout または
mouseleave イベントを挟まずに同一要素である場合、click および dblclick
イベントを発火すべきである(SHOULD)。また、関連する mousedown
および mouseup のイベントターゲットが異なる場合、最も近い共通の inclusive ancestor に対して
click および
dblclick イベントを発火すべきである(SHOULD)。
もし mousedown イベントが HTML 文書の body
element をターゲットとしており、対応する mouseup イベントが
document element
をターゲットとしていたなら、click イベントは、最も近い共通の inclusive
ancestor であるため、document
element にディスパッチされる。
mouseイベント列の途中で target(例:ターゲット要素)が DOM から削除された場合、その列の残りのイベントは、その要素に対して発火してはならない(MUST NOT)。
もし mousedown イベントの結果としてターゲット要素が DOM から削除された場合、その要素に対して
mouseup、click、または dblclick
のいずれのイベントもディスパッチされず、デフォルトのアクティベーションイベントもディスパッチされない。ただし、mouseup
イベントは、初期ターゲット要素の削除後にマウスに露出する要素へ引き続きディスパッチされる。同様に、mouseup
イベントのディスパッチ中にターゲット要素が DOM から削除された場合、click およびその後続イベントはディスパッチされない。
| Type | auxclick
|
|---|---|
| Interface | PointerEvent
|
| Sync / Async | Sync |
| Bubbles | Yes |
| Trusted Targets | Element |
| Cancelable | Yes |
| Composed | Yes |
| Default action | Varies |
| Context (trusted events) |
|
auxclick
イベント種別は、ユーザーが非主ポインタボタンを押下して解放したとき、またはそれをシミュレートする方法でポインタをアクティベートしたとき、ポインタが示す 最上位の
イベントターゲットへディスパッチされなければならない(MUST)。マウスボタンの作動方法はポインタデバイスと環境設定に依存し、例えば、画面位置またはポインティングデバイスボタンの押下と解放の間の遅延に依存してもよい(MAY)。
auxclick イベントは、非主ポインタ
ボタンに対してのみ発火されるべきである(すなわち、button 値が 0 ではなく、
buttons 値が
1 より大きい場合)。主ボタン
(標準的なマウスの左ボタンなど)は、auxclick イベントを発火してはならない(MUST NOT)。主ボタンに関連付けられた対応イベントについては、click を参照。
auxclick イベントに先行して、同一要素上での mousedown および
mouseup イベントが発生してもよい(MAY)。ここでは、他のノード種別(例:テキストノード)間での変化は無視する。環境設定に応じて、押下と解放の間に
mouseover、
mousemove、および mouseout のうち1つ以上のイベント種別が発生した場合でも、
auxclick イベントがディスパッチされてもよい(MAY)。
auxclick イベント種別の デフォルト動作 は、イベントの target および
button または buttons 属性の値に応じて変化する。auxclick イベント種別の典型的な
デフォルト動作 は次のとおりである:
myLink.addEventListener("auxclick", function(e) {
if (e.button === 1) {
// This would prevent the default behavior which is for example
// opening a new tab when middle clicking on a link.
e.preventDefault();
// Do something else to handle middle button click like taking
// care of opening link or non-link buttons in new tabs in a way
// that fits the app. Other actions like closing a tab in a tab-strip
// which should be done on the click action can be done here too.
}
});
右ボタンの場合、auxclick イベントは、任意の contextmenu
イベントの後にディスパッチされる。コンテキストメニューが表示されている間、すべての入力イベントを飲み込むユーザーエージェントもあるため、そのようなシナリオでは auxclick
がアプリケーションで利用できない場合があることに留意すること。
さらなる説明は Example 7 を参照。
myDiv.addEventListener("contextmenu", function(e) {
// This call makes sure no context menu is shown
// to interfere with page receiving the events.
e.preventDefault();
});
myDiv.addEventListener("auxclick", function(e) {
if (e.button === 2) {
// Do something else to handle right button click like opening a
// customized context menu inside the app.
}
});
| Type | click
|
|---|---|
| Interface | PointerEvent
|
| Sync / Async | Sync |
| Bubbles | Yes |
| Trusted Targets | Element |
| Cancelable | Yes |
| Composed | Yes |
| Default action | Varies |
| Context (trusted events) |
|
click
イベント種別は、ユーザーが主ポインタボタンを押下して解放したとき、またはそれをシミュレートする方法でポインタをアクティベートしたとき、ポインタが示す 最上位の
イベントターゲットへディスパッチされなければならない(MUST)。マウスボタンの作動方法はポインタデバイスと環境設定に依存し、例えば、画面位置またはポインティングデバイスボタンの押下と解放の間の遅延に依存してもよい(MAY)。
click イベントは、主ポインタ
ボタンに対してのみ発火されるべきである(すなわち、button 値が 0 であり、
buttons 値が 1 の場合)。
副ボタン
(標準的なマウスの中央ボタンや右ボタンなど)は、click イベントを発火してはならない(MUST NOT)。非主ボタンに関連付けられた対応イベントについては、auxclick を参照。
click イベントに先行して、同一要素上での mousedown および
mouseup イベントが発生してもよい(MAY)。ここでは、他のノード種別(例:テキストノード)間での変化は無視する。環境設定に応じて、押下と解放の間に
mouseover、
mousemove、および mouseout のうち1つ以上のイベント種別が発生した場合でも、
click イベントがディスパッチされてもよい(MAY)。
click イベントの後に、dblclick イベントが続いてもよい(MAY)。
もしユーザーが、大きな line-height でスタイルされた <p> 要素のテキストノード子に対して mousedown
し、マウスをわずかに移動して、もはやテキストを含む領域の上ではないが、その <p>
要素の包含ブロック内には依然としてある(すなわち、ポインタは同一テキストブロックの行間にあるが、テキストノード自体の上ではない)ようにし、その後 mouseup
した場合、ユーザーが同一要素の範囲内に留まっているため、(click に対する通常の時間的 hysteresis の範囲内であれば)click
イベントを依然としてトリガーする可能性が高い。ユーザーエージェントが生成するmouseイベントはテキストノードに対してはディスパッチされないことに留意すること。
ポインタデバイスとの関連付けに加えて、click イベント種別は、要素アクティベーションの一部としてディスパッチされなければならない(MUST)。
アクセシビリティを最大化するため、コンテンツ著者は、よりデバイス固有である mousedown や mouseup といった他のポインティングデバイスイベント種別ではなく、カスタムコントロールの
activation behavior を定義する際に click イベント種別を使用することが推奨される。click
イベント種別はポインタデバイス(例:マウス)に由来するが、その後の実装上の拡張により、その関連付けを超えて拡張され、要素アクティベーションのためのデバイス非依存なイベント種別と見なすことができる。
click イベント種別の デフォルト動作 は、イベントの target および
button または buttons 属性の値に応じて変化する。click イベント種別の典型的な
デフォルト動作 は次のとおりである:
| Type | dblclick |
|---|---|
| Interface | MouseEvent |
| Sync / Async | Sync |
| Bubbles | Yes |
| Trusted Targets | Element |
| Cancelable | Yes |
| Composed | Yes |
| Default action | None |
| Context (trusted events) |
|
user agent
は、ポインティングデバイスの主ボタンが要素上で2回クリックされたとき、このイベントをディスパッチしなければならない(MUST)。ダブルクリックの定義は環境設定に依存するが、mousedown、mouseup、および dblclick の間でイベントターゲットは同一でなければならない(MUST)。クリックとダブルクリックが同時に発生する場合、このイベント種別はイベント種別 click の後にディスパッチされなければならず(MUST)、それ以外の場合はイベント種別
mouseup の後にディスパッチされなければならない(MUST)。
click イベントと同様に、dblclick イベントは
主ポインタボタンに対してのみ発火されるべきである。副ボタンは dblclick イベントを発火してはならない(MUST NOT)。
click イベント種別と同様に、デフォルト動作は
dblclick イベント種別においても、イベントの target および
button
または buttons 属性の値に応じて変化する。dblclick イベント種別の典型的な
デフォルト動作は、click イベント種別のものと一致する。
| Type | mousedown
|
|---|---|
| Interface | MouseEvent |
| Sync / Async | Sync |
| Bubbles | Yes |
| Trusted Targets | Element |
| Cancelable | Yes |
| Composed | Yes |
| Default action | Varies: ドラッグ&ドロップ操作を開始する;テキスト選択を開始する;スクロール/パン操作を開始する(サポートされている場合、中ボタンとの組み合わせ) |
| Context (trusted events) |
|
| Type | mouseenter
|
|---|---|
| Interface | MouseEvent |
| Sync / Async | Sync |
| Bubbles | No |
| Trusted Targets | Element |
| Cancelable | No |
| Composed | No |
| Default action | None |
| Context (trusted events) |
|
mouseover
に類似するが、
バブリングしない点、およびポインタデバイスがある要素からその子孫要素の境界上へ移動したときにディスパッチされてはならない(MUST NOT)点が異なる。
このイベント種別と CSS の
:hover 擬似クラス [CSS2]
には類似点がある。mouseleave イベント種別も参照。
| Type | mouseleave
|
|---|---|
| Interface | MouseEvent |
| Sync / Async | Sync |
| Bubbles | No |
| Trusted Targets | Element |
| Cancelable | No |
| Composed | No |
| Default action | None |
| Context (trusted events) |
|
mouseout に類似するが、
バブリングしない点、およびポインティングデバイスが要素の境界およびその全子要素の境界を離れるまでディスパッチされてはならない(MUST NOT)点が異なる。
このイベント種別と CSS の
:hover 擬似クラス [CSS2]
には類似点がある。mouseenter イベント種別も参照。
| Type | mousemove
|
|---|---|
| Interface | MouseEvent |
| Sync / Async | Sync |
| Bubbles | Yes |
| Trusted Targets | Element |
| Cancelable | Yes |
| Composed | Yes |
| Default action | None |
| Context (trusted events) |
|
mousemove
イベントを発火すべきである(SHOULD)。実装には、応答性と性能の均衡を取るために最適な頻度を決定することが推奨される。
ブラウザーなど一部の実装環境では、ユーザーがドラッグ操作(例:マウスボタンが押下されている)を開始し、かつポインティングデバイスがユーザーエージェントの境界を離れた場合でも、mousemove イベントが発火し続けることがある。
このイベントは、DOM Level 2 Events では以前はキャンセル不可として規定されていたが、ユーザーエージェント間の既存の相互運用性を反映するために変更された。
| Type | mouseout
|
|---|---|
| Interface | MouseEvent |
| Sync / Async | Sync |
| Bubbles | Yes |
| Trusted Targets | Element |
| Cancelable | Yes |
| Composed | Yes |
| Default action | None |
| Context (trusted events) |
|
mouseleave
に類似するが、バブリングする点、およびポインタデバイスがある要素からその子孫要素の境界上へ移動したときにディスパッチされなければならない(MUST)点が異なる。
mouseover イベント種別も参照。
| Type | mouseover
|
|---|---|
| Interface | MouseEvent |
| Sync / Async | Sync |
| Bubbles | Yes |
| Trusted Targets | Element |
| Cancelable | Yes |
| Composed | Yes |
| Default action | None |
| Context (trusted events) |
|
mouseenter に類似するが、バブリングする点、およびポインタデバイスが同一 event listener
インスタンスに対する同一 target
の祖先要素である要素の境界上へ移動した場合にディスパッチされなければならない(MUST)点が異なる。
mouseout イベント種別も参照。
| Type | mouseup
|
|---|---|
| Interface | MouseEvent |
| Sync / Async | Sync |
| Bubbles | Yes |
| Trusted Targets | Element |
| Cancelable | Yes |
| Composed | Yes |
| Default action | None |
| Context (trusted events) |
|
ブラウザーなど一部の実装環境では、ポインティングデバイスがユーザーエージェントの境界を離れていても、mouseup
イベントがディスパッチされうる。例えば、ユーザーがマウスボタン押下によりドラッグ操作を開始した場合などである。
WebIDLdictionary PointerEventInit : MouseEventInit {
long pointerId = 0;
double width = 1;
double height = 1;
float pressure = 0;
float tangentialPressure = 0;
long tiltX;
long tiltY;
long twist = 0;
double altitudeAngle;
double azimuthAngle;
DOMString pointerType = "";
boolean isPrimary = false;
long persistentDeviceId = 0;
sequence<PointerEvent> coalescedEvents = [];
sequence<PointerEvent> predictedEvents = [];
};
[Exposed=Window]
interface PointerEvent : MouseEvent {
constructor(DOMString type, optional PointerEventInit eventInitDict = {});
readonly attribute long pointerId;
readonly attribute double width;
readonly attribute double height;
readonly attribute float pressure;
readonly attribute float tangentialPressure;
readonly attribute long tiltX;
readonly attribute long tiltY;
readonly attribute long twist;
readonly attribute double altitudeAngle;
readonly attribute double azimuthAngle;
readonly attribute DOMString pointerType;
readonly attribute boolean isPrimary;
readonly attribute long persistentDeviceId;
[SecureContext] sequence<PointerEvent> getCoalescedEvents();
sequence<PointerEvent> getPredictedEvents();
};
pointerIdイベントを発生させたポインタの一意な識別子。user agents は、primary mouse pointer
のために、汎用の pointerId
値として 0 または 1 を予約してもよい(MAY)。pointerId
値 -1 は、ポインティングデバイス以外によって生成されたイベントを示すために、予約され使用されなければならない(MUST)。他の任意のポインタについては、user
agents は pointerId
値をどのように割り当てるかに関して、異なる戦略やアプローチを自由に実装できる。しかし、[HTML] で定義される top-level
browsing context 内のすべての active pointers
は一意でなければならず、その識別子は他の top-level browsing
context によって影響されてはならない(MUST NOT)(すなわち、ある top-level browsing context
は、ポインタが当該 browsing context の外へ移動して別の top-level browsing context に入ったとき、そのポインタの pointerId
が同じであると仮定できない)。
user agent は、以前の
active pointer のために退役した
pointerId
の値を再利用してもよい(MAY)。または、特定のポインティングデバイスに対して常に同じ
pointerId
を再利用してもよい(MAY)(たとえば、複数ユーザーが協調するアプリケーションにおいて、特定ユーザーの特定のペン/スタイラス入力を一意に識別するため)。
ただし後者の場合、ページやドメインをまたぐフィンガープリンティングや追跡の可能性を最小化するため、pointerId
はページ/セッションの存続期間に限り、その特定のポインティングデバイスに明示的に関連付けられなければならず(MUST)、その特定のポインティングデバイスが新しいセッションで再び使用される次回には、新しいランダム化された
pointerId
が選択されなければならない(MUST)。
pointerId
の選択アルゴリズムは実装依存である。作者は、値が「他のすべての active pointer
から一意であるポインタの識別子」以外の特定の意味を伝えると仮定できない。例として、user agent は active pointer
になった順に、0
から始まる番号を単純に割り当ててもよいが、これらの値が単調増加であることは保証されない。特定のポインティングデバイスに対して同じ
pointerId
を再利用するかどうかは各実装に委ねられているため、作者がそれに依存することは強く推奨されず、代わりに
persistentDeviceId
を参照すること。
widthポインタの contact geometry の幅(X 軸方向の大きさ)。CSS
ピクセル単位([CSS21]
参照)。
この値は、あるポインタについてイベントごとに更新されてもよい(MAY)。通常 contact geometry
を欠く入力(伝統的なマウスなど)や、入力の実際のジオメトリがハードウェアで検出されない場合、user agent は既定値 1
を返さなければならない(MUST)。
heightポインタの contact geometry の高さ(Y 軸方向の大きさ)。CSS
ピクセル単位([CSS21]
参照)。
この値は、あるポインタについてイベントごとに更新されてもよい(MAY)。通常 contact geometry
を欠く入力(伝統的なマウスなど)や、入力の実際のジオメトリがハードウェアで検出されない場合、user agent は既定値 1
を返さなければならない(MUST)。
pressureポインタ入力の正規化された圧力。範囲は [0,1] で、0 と 1
はそれぞれ、ハードウェアが検出できる最小圧力と最大圧力を表す。圧力をサポートしないハードウェアおよびプラットフォームでは、active buttons state のとき値は 0.5
でなければならず(MUST)、それ以外は 0 でなければならない。
tangentialPressure正規化された接線方向の圧力(barrel pressure とも呼ばれる)。通常は追加のコントロール(例:エアブラシ用スタイラスのフィンガーホイール)で設定される。範囲は
[-1,1] で、0 はコントロールの中立位置である。なお、一部のハードウェアは [0,1]
の正の値のみをサポートする場合がある。接線圧力をサポートしないハードウェアおよびプラットフォームでは、値は 0 でなければならない(MUST)。
tiltXY-Z 平面と、トランスデューサ(例:ペン/スタイラス)の軸および Y 軸の両方を含む平面との間の平面角(度)。範囲は [-90,90]。
正の tiltX は右方向(X 値が増加する方向)である。
tiltX は tiltY
と併せて、デジタイザを備えたトランスデューサが法線からどの程度傾いているかを表すために使用できる。傾きまたは角度を報告しないハードウェアおよびプラットフォームでは、値は
0 でなければならない(MUST)。
tiltX。
tiltYX-Z 平面と、トランスデューサ(例:ペン/スタイラス)の軸および X 軸の両方を含む平面との間の平面角(度)。範囲は [-90,90]。
正の tiltY はユーザー方向(Y 値が増加する方向)である。
tiltY は tiltX
と併せて、デジタイザを備えたトランスデューサが法線からどの程度傾いているかを表すために使用できる。傾きまたは角度を報告しないハードウェアおよびプラットフォームでは、値は
0 でなければならない(MUST)。
tiltY。
twistトランスデューサ(例:ペン/スタイラス)の主軸まわりの時計回りの回転(度)。範囲は [0,359]。twist
を報告しないハードウェアおよびプラットフォームでは、値は 0 でなければならない(MUST)。
altitudeAngleトランスデューサ(例:ペン/スタイラス)の高度(ラジアン)。範囲は [0,π/2]。
0 は表面(X-Y 平面)に平行、π/2 は表面に垂直を表す。傾きまたは角度を報告しないハードウェアおよびプラットフォームでは、値は
π/2 でなければならない(MUST)。
altitudeAngle の既定値は π/2
であり、トランスデューサが表面に対して垂直となるように配置する。
これは Touch Events - Level
2 仕様における altitudeAngle プロパティの定義(既定値が 0)とは異なる。
altitudeAngle が
π/4(X-Y 平面から 45 度)。azimuthAngleトランスデューサ(例:ペン/スタイラス)の方位角(ラジアン)。範囲は [0, 2π]。
0 は、X-Y 平面上でキャップが X 値増加方向を指すトランスデューサ(真上から見て「3 時」方向)を表し、値は時計回りに増加する(「6 時」で
π/2、「9 時」で π、「12 時」で 3π/2)。
トランスデューサが表面に完全に垂直(altitudeAngle が π/2)の場合、値は 0
でなければならない(MUST)。
傾きまたは角度を報告しないハードウェアおよびプラットフォームでは、値は 0 でなければならない(MUST)。
azimuthAngle が
π/6(「4 時」)。pointerTypeイベントを引き起こしたデバイス種別(例:mouse, pen, touch)を示す。user agent がマウス、ペン/スタイラス、またはタッチ入力デバイスに対して pointer event
を発火する場合、pointerType の値は次の表に従わなければならない(MUST):
| ポインタデバイス種別 | pointerType の値 |
|---|---|
| Mouse | mouse |
| Pen / stylus | pen |
| Touch contact | touch |
user agent がデバイス種別を検出できない場合、値は空文字列でなければならない(MUST)。user agent
が上記以外のポインタデバイス種別をサポートする場合、異なるデバイス種別間で名前が衝突しないように、pointerType
の値はベンダープレフィックス付きであるべきである(SHOULD)。将来の仕様が、他のデバイス種別に対して追加の規範値を提供してもよい(MAY)。
pointerType 値を実装している可能性のある user agent をカバーするため、および
pointerType が単に空文字列である状況のために、何らかの既定のハンドリングを含めるべきである点にも留意すること。
isPrimaryポインタがこのポインタ種別における primary pointer を表すかどうかを示す。
persistentDeviceIdポインティングデバイスの一意な識別子。ハードウェアが複数ポインタをサポートする場合、ポインティングデバイスから生成される pointer event
は、それらのポインタがセッション全体で一意に識別可能であるときに限り persistentDeviceId を得なければならない(MUST)。
ポインタが一意に識別可能である場合、そのポインティングデバイスに割り当てられた persistentDeviceId
はセッションの残りの期間で一定のままである。
persistentDeviceId 値 0
は予約され、生成デバイスを識別できなかったイベントを示すために使用されなければならない(MUST)。
pointerId
と同様、ページやドメインをまたぐフィンガープリンティングや追跡の可能性を最小化するため、persistentDeviceId
はページ/セッションの存続期間に限りその特定のポインティングデバイスに明示的に関連付けられなければならず(MUST)、その特定のポインティングデバイスが新しいセッションで再び使用される次回には、新しいランダム化された
persistentDeviceId が選択されなければならない(MUST)。
persistentDeviceId が利用可能であるとは限らない。例えば、デバイスがハードウェア ID
をデジタイザへ報告するタイミングが間に合わず、pointerdown に persistentDeviceId
が付与できない場合がある。この場合、persistentDeviceId は最初は 0
で、後から有効な値に変化することがある。
getCoalescedEvents()coalesced events のリストを返すメソッド。
getPredictedEvents()predicted events のリストを返すメソッド。
PointerEventInit ディクショナリは、PointerEvent
インターフェイスのコンストラクタにより、信頼されない(合成の)pointer event を構築するための仕組みを提供するために使用される。これは [UIEVENTS] で定義される
MouseEventInit ディクショナリを継承する。信頼されない pointer
event を発火する方法を示すサンプルコードについては examples を参照。
PointerEvent に対する event
constructing steps は、PointerEventInit の coalescedEvents を coalesced events list に複製し、PointerEventInit の predictedEvents を predicted events list に複製する。
PointerEvent インターフェイスは UI
Events で定義される MouseEvent を継承する。
また、CSSOM View Module
の提案された拡張では、さまざまな座標プロパティを long から double に変更し、小数座標を許容する。
すでにこの提案拡張を PointerEvent
には実装しているが、通常の MouseEvent には実装していない
user agent には、
click,
auxclick, および contextmenu イベントに関して追加要件がある。
マルチポインタ(例:マルチタッチ)シナリオでは、isPrimary プロパティは、各ポインタ種別ごとに active pointers
の集合の中からマスターとなるポインタを識別するために使用される。
pointerType ごとに1つ)が primary
とみなされる。例えば、タッチ接触とマウスカーソルを同時に動かすと、両方が primary とみなされるポインタを生成する。
isPrimary の値が false の pointer event
を発火してもよい(MAY)。e という名前の pointer event を発火するとは、event を発火することにより、e
という名前のイベントを PointerEvent を用いて発火し、その属性を PointerEvent インターフェイスおよび
属性と既定動作で定義されるとおりに設定することを意味する。
イベントが gotpointercapture、lostpointercapture、click、
auxclick、または contextmenu イベントでない場合、この PointerEvent について 保留中の pointer capture を処理する手順を実行する。
イベントが発火されるターゲットを次のとおり 決定する:
targetDocument を、ターゲットの node document とする [DOM]。
イベントが pointerdown、pointermove、または pointerup の場合、イベントの active document
を、このイベントの pointerId に対して
targetDocument に設定する。
イベントが pointerdown であり、関連付けられたデバイスが direct manipulation
device で、かつターゲットが Element
の場合、暗黙の pointer capture で記述されるとおり、当該 pointerId に対してターゲット要素へ pointer capture を設定する。
このイベントを発火する前に、user agent
は、イベント順序を保証する目的で、ターゲットを previousTarget
からポインティングデバイスが移動して上に来たものとして扱うべきである(SHOULD) [UIEVENTS]。needsOverEvent
フラグが設定されている場合、ターゲット要素が同一であっても pointerover イベントが必要である。
決定されたターゲットへイベントを発火する。
決定されたターゲットを、そのポインタに対する previousTarget として保存し、needsOverEvent フラグを
false にリセットする。
ある時点で previousTarget が connected [DOM]
ではなくなる場合、previousTarget を、previousTarget にイベントをディスパッチすることに対応するイベントパスに従い、最も近い
still connected [DOM]
な親へ更新し、needsOverEvent フラグを true に設定する。
この仕様で定義されるイベント種別の bubbles および cancelable
プロパティと既定動作は、次の表に示される。各イベント種別の詳細は Pointer Event 種別に示される。
| イベント種別 | Bubbles | Cancelable | 既定動作 |
|---|---|---|---|
pointerover
|
Yes | Yes | None |
pointerenter |
No | No | None |
pointerdown
|
Yes | Yes | Varies: ポインタが primary のとき、mousedown イベントのすべての既定動作
このイベントをキャンセルすると、後続の compatibility mouse events の発火も防止する。 |
pointermove
|
Yes | Yes | Varies: ポインタが primary のとき、mousemove のすべての既定動作
|
pointerrawupdate |
Yes | No | None |
pointerup |
Yes | Yes | Varies: ポインタが primary のとき、mouseup のすべての既定動作
|
pointercancel |
Yes | No | None |
pointerout
|
Yes | Yes | None |
pointerleave |
No | No | None |
gotpointercapture |
Yes | No | None |
lostpointercapture |
Yes | No | None |
ビューポート操作(パンおよびズーム)— 一般に direct manipulation
インタラクションの結果として — は、意図的に pointer event
の既定動作ではない。つまり、これらの挙動(例:タッチスクリーン上で指を動かした結果としてページをパンする)は、pointer event をキャンセルしても抑止できない。作者は代わりに
touch-action を用い、文書の領域について direct manipulation
の挙動を宣言しなければならない。イベントのキャンセルに対するこの依存を除去することにより、user agent による性能最適化が容易になる。
pointerenter および pointerleave イベントについては、composed
[DOM] 属性は false であるべきである(SHOULD)。上表の他のすべての pointer event では、この属性は true であるべきである(SHOULD)。
上表のすべての pointer event について、detail [UIEVENTS] 属性は 0 であるべきである(SHOULD)。
fromElement
および
toElement を公開している。これらの user agent には、作者を標準化された代替(target および
relatedTarget)へ移行させるため、PointerEvent における(継承された)これら属性の値を null
に設定することを推奨する。
MouseEvent の relatedTarget
と同様に、relatedTarget は、ポインタがちょうど離れた要素の境界(pointerover または
pointerenter の場合)またはポインタが侵入しつつある要素の境界(pointerout または pointerleave の場合)に初期化されるべきである。その他の pointer
event では、この値は既定で null になる。要素が pointer capture を受け取った場合、そのポインタに対する後続のすべてのイベントは capturing
要素の境界内にあるものとみなされる点に留意すること。
gotpointercapture
および lostpointercapture
イベントでは、上表で定義されるものを除くすべての属性は、user agent が 保留中の pointer capture を処理する手順を実行し、gotpointercapture
および lostpointercapture イベントを発火させた原因となる
Pointer Event と同一であるべきである。
user agent は、暗黙に pointer capture
を解放する場合、および gotpointercapture または lostpointercapture ではない Pointer Event
を発火する場合、次の手順を実行しなければならない(MUST)。
lostpointercapture という名前の pointer
event を、pointer capture
target override
ノードに対して発火する。
gotpointercapture という名前の pointer
event を、pending
pointer capture target override に対して発火する。
click,
auxclick, および contextmenu イベント節で定義されるとおり、lostpointercapture
イベントがディスパッチされた後であっても、対応する click、auxclick または
contextmenu イベント(存在する場合)は、依然として capturing target にディスパッチされる。
user agent
は、ウェブページが特定の pointerId を持つ pointer event
を今後受信し続ける可能性が低いことを検出したとき、pointer event ストリームを抑止しなければならない(MUST)。次のいずれかのシナリオがこの条件を満たす(追加のシナリオがあってもよい(MAY)):
touch-action CSS プロパティ節を参照。
user agent が pointer event ストリームを抑止してもよい(MAY)他のシナリオには次が含まれる:
これらのシナリオを検出する方法は、この仕様のスコープ外である。
user agent は、pointer event ストリームを抑止するために、次の手順を実行しなければならない(MUST):
pointercancel
イベントを発火する。pointerout イベントを発火する。
pointerleave イベントを発火する。
画面表面に対して相対的に移動した、またはそのプロパティのいずれかに何らかの変化が生じたポインティングデバイスは、Pointer Event
種別で定義されるさまざまなイベントを発火する。静止したポインティングデバイス(画面表面に対する相対移動も、いずれかのプロパティ変化もない)については、user agent は、ポインタに対する
hit
test ターゲットに影響を与えたレイアウト変更の後に、特定の境界イベントを発火しなければならない(MUST)。詳細は pointerover、pointerenter、pointerout および pointerleave を参照。user agent
は性能上の理由により、これらの境界イベントの発火を遅延してもよい(MAY)(例:境界イベントリスナーにより多すぎる hit-test
やレイアウト変更が起こることを避けるため)。
pointermove イベントを決して発火しない。Pointer Events には、X-Y 平面に対するトランスデューサの向きを表すための相補的な2組の属性が含まれる:
tiltX / tiltY(元の Pointer Events 仕様で導入)と、
azimuthAngle / altitudeAngle(Touch Events - Level 2
仕様から採用)。
特定のハードウェアおよびプラットフォームに応じて、user agent は画面平面に対するトランスデューサの向きとして、片方の組の値のみを受け取る可能性が高い — すなわち
tiltX / tiltY か、altitudeAngle / azimuthAngle
のいずれかである。user agent は、これらの値を変換するために次のアルゴリズムを使用しなければならない(MUST)。
user agent が azimuthAngle / altitudeAngle から tiltX /
tiltY を計算する場合、最終的な整数値を Math.round [ECMASCRIPT] の規則に従って丸めるべきである(SHOULD)。
/* Converting between tiltX/tiltY and altitudeAngle/azimuthAngle */
function spherical2tilt(altitudeAngle, azimuthAngle) {
const radToDeg = 180/Math.PI;
let tiltXrad = 0;
let tiltYrad = 0;
if (altitudeAngle == 0) {
// the pen is in the X-Y plane
if (azimuthAngle == 0 || azimuthAngle == 2*Math.PI) {
// pen is on positive X axis
tiltXrad = Math.PI/2;
}
if (azimuthAngle == Math.PI/2) {
// pen is on positive Y axis
tiltYrad = Math.PI/2;
}
if (azimuthAngle == Math.PI) {
// pen is on negative X axis
tiltXrad = -Math.PI/2;
}
if (azimuthAngle == 3*Math.PI/2) {
// pen is on negative Y axis
tiltYrad = -Math.PI/2;
}
if (azimuthAngle>0 && azimuthAngle<Math.PI/2) {
tiltXrad = Math.PI/2;
tiltYrad = Math.PI/2;
}
if (azimuthAngle>Math.PI/2 && azimuthAngle<Math.PI) {
tiltXrad = -Math.PI/2;
tiltYrad = Math.PI/2;
}
if (azimuthAngle>Math.PI && azimuthAngle<3*Math.PI/2) {
tiltXrad = -Math.PI/2;
tiltYrad = -Math.PI/2;
}
if (azimuthAngle>3*Math.PI/2 && azimuthAngle<2*Math.PI) {
tiltXrad = Math.PI/2;
tiltYrad = -Math.PI/2;
}
}
if (altitudeAngle != 0) {
const tanAlt = Math.tan(altitudeAngle);
tiltXrad = Math.atan(Math.cos(azimuthAngle) / tanAlt);
tiltYrad = Math.atan(Math.sin(azimuthAngle) / tanAlt);
}
return {"tiltX":tiltXrad*radToDeg, "tiltY":tiltYrad*radToDeg};
}
function tilt2spherical(tiltX, tiltY) {
const tiltXrad = tiltX * Math.PI/180;
const tiltYrad = tiltY * Math.PI/180;
// calculate azimuth angle
let azimuthAngle = 0;
if (tiltX == 0) {
if (tiltY > 0) {
azimuthAngle = Math.PI/2;
}
else if (tiltY < 0) {
azimuthAngle = 3*Math.PI/2;
}
} else if (tiltY == 0) {
if (tiltX < 0) {
azimuthAngle = Math.PI;
}
} else if (Math.abs(tiltX) == 90 || Math.abs(tiltY) == 90) {
// not enough information to calculate azimuth
azimuthAngle = 0;
} else {
// Non-boundary case: neither tiltX nor tiltY is equal to 0 or +-90
const tanX = Math.tan(tiltXrad);
const tanY = Math.tan(tiltYrad);
azimuthAngle = Math.atan2(tanY, tanX);
if (azimuthAngle < 0) {
azimuthAngle += 2*Math.PI;
}
}
// calculate altitude angle
let altitudeAngle = 0;
if (Math.abs(tiltX) == 90 || Math.abs(tiltY) == 90) {
altitudeAngle = 0
} else if (tiltX == 0) {
altitudeAngle = Math.PI/2 - Math.abs(tiltYrad);
} else if (tiltY == 0) {
altitudeAngle = Math.PI/2 - Math.abs(tiltXrad);
} else {
// Non-boundary case: neither tiltX nor tiltY is equal to 0 or +-90
altitudeAngle = Math.atan(1.0/Math.sqrt(Math.pow(Math.tan(tiltXrad),2) + Math.pow(Math.tan(tiltYrad),2)));
}
return {"altitudeAngle":altitudeAngle, "azimuthAngle":azimuthAngle};
}
PointerEvent を初期化するevent、eventType、eventTarget、bubbles、および cancelable を用いて PointerEvent を初期化するには、次の手順を実行する:
PointerEvent 値に初期化する。
PointerEvent を作成する
eventType と eventTarget、bubbles、および cancelable を用いて
PointerEvent を作成するには、次の手順を実行する:
PointerEvent を用いて行った結果とする。
DOMString とするMouseEvent とするPointerEvent を用いて行った結果とする
target とするMouseEvent 属性を mouseevent から
event にコピーする
MouseEvent とするMouseEvent から
PointerEvent を作成する を "pointerout" と mouseout で実行した結果とするTODO.
target とするMouseEvent とするMouseEvent から
PointerEvent を作成する を "pointerout" と mouseout で実行した結果とするTODO.
target とするMouseEvent とするMouseEvent から
PointerEvent を作成する を "pointerout" と mouseout で実行した結果とするTODO.
target とするMouseEvent とするMouseEvent から
PointerEvent を作成する を "pointerout" と mouseout で実行した結果とするTODO.
target とするMouseEvent とする
Can this send pointermove and pointerrawupdate? Or do we need 2 methods?
What is needed to properly define how pointermove events are coalesced?
MouseEvent から
PointerEvent を作成する を "pointerout" と mouseout で実行した結果とするTODO.
target とするMouseEvent とする
mousedown イベントとは異なり、pointerdown
イベントは、複数ボタンが押下されたときにネストされない。
フィールドを PointerEvent にコピーできるよう、この MouseEvent が渡される。
MouseEvent から
PointerEvent を作成する を "pointerout" と mouseout で実行した結果とする
TODO.
target とするMouseEvent とする
target とするMouseEvent とする
mouseup イベントとは異なり、pointerup
イベントは、複数ボタンが押下されたときにネストされない。フィールドを PointerEvent にコピーできるよう、この MouseEvent が渡される。
MouseEvent から
PointerEvent を作成する を "pointerout" と mouseout で実行した結果とする
TODO.
target とする以下に、この仕様で定義されるイベント種別を示す。
primary pointer の場合、これらのイベント(gotpointercapture および lostpointercapture を除く)は、compatibility mouse events も発火しうる。
user agent
は、次のいずれかが起こったとき、pointer event を発火して pointerover という名前のイベントを発火しなければならない(MUST):
pointerdown イベントを発火する前(pointerdown 参照)。user agent
は、次のいずれかが起こったとき、pointer event を発火して pointerenter という名前のイベントを発火しなければならない(MUST):
pointerdown イベントを発火する前(pointerdown 参照)。mouseenter イベント、および [CSS21]
に記述される CSS :hover 擬似クラスと類似点がある。pointerleave イベントも参照。
user agent は、ポインタが active buttons state に入ったとき、pointer event を発火して pointerdown という名前のイベントを発火しなければならない(MUST)。マウスでは、デバイスがボタン未押下の状態から少なくとも1つのボタンが押下された状態へ移行したときである。タッチでは、digitizer
に物理的接触が行われたときである。ペンでは、ボタン未押下のままデジタイザに物理的接触する場合、またはホバー中にボタン未押下の状態から少なくとも1つのボタンが押下された状態へ移行する場合である。
pointerdown と pointerup が、mousedown と
mouseup と同一の状況すべてで発火するわけではないことを意味する。詳しくは chorded
buttons を参照。
入力 ホバーをサポートしないデバイスについては、user
agent は、pointerdown
イベントをディスパッチする前に、pointer event を発火して pointerover という名前のイベントを発火し、その後に pointerenter という名前の pointer event
を発火しなければならない(MUST)。
isPrimary プロパティが true の場合に)pointerdown イベントをキャンセルすることで、特定の compatibility mouse events
の発火を防止できる。これにより、ポインタに対して PREVENT MOUSE EVENT
フラグが設定される。ただし、mouseover、mouseenter、mouseout、または
mouseleave イベントの発火は防止されない点に留意すること。
user agent は、ポインタが pointerdown または pointerup イベントを発火しない任意のプロパティを変更したとき、pointer event を発火して pointermove という名前のイベントを発火しなければならない(MUST)。これには、座標、圧力、接線圧(tangential pressure)、
tilt、twist、接触ジオメトリ(width および height)、または chorded buttons
の変更が含まれる。
user agent は、(例えば性能上の理由から)pointermove
イベントのディスパッチを遅延してもよい(MAY)。
coalesced events 情報は、ディスパッチされた単一の pointermove イベントに対するgetCoalescedEvents
メソッドを通じて公開される。
イベントのターゲットを見つけるには、この種のイベントの最終座標を使用すべきである。
user agent は、ポインタが
pointerdown または pointerup イベントを発火しない任意のプロパティを変更したとき、pointer event を発火して pointerrawupdate
という名前のイベントを発火しなければならない(MUST)。また、これは secure context
内でのみ行わなければならない。該当するプロパティの一覧は pointermove イベントを参照。
pointermove とは対照的に、user agent は
pointerrawupdate イベントを、可能な限り速やかに、かつ
JavaScript がイベントを処理できる頻度でディスパッチすべきである(SHOULD)。
pointerrawupdate イベントの target
は、pointermove イベントと異なる場合がある。これは、pointermove イベントが遅延または coalesce
される可能性があり、ターゲット検出に用いられるイベントの最終位置が、その coalesced events と異なりうるためである。
すでに同一の pointerId を持ち、かつ event loop
内で未ディスパッチの別の pointerrawupdate
がすでに存在する場合、user agent
は、新しい pointerrawupdate を新しい
task
を作成する代わりに、そのイベントと coalesce してもよい(MAY)。
これにより、pointerrawupdate が
coalesced events を持ちうるようになり、
それらはイベントが event loop
で処理され次第、単一の pointerrawupdate イベントの
coalesced events としてすべて配信される。
詳しくはgetCoalescedEvents を参照。
pointerrawupdate と pointermove の順序について、プラットフォームからの更新により pointerrawupdate と pointermove の両方のイベントが発生する場合、user agent は、対応する pointermove の前に pointerrawupdate イベントをディスパッチしなければならない(MUST)。
target を除けば、直前の pointermove
イベント以降にディスパッチされたすべての pointerrawupdate イベントの
coalesced events リストを連結したものは、次の pointermove イベントの coalesced events
と、その他のイベント属性の点で同一である。
pointerrawupdate の属性は、例外として
cancelable があり、これは pointerrawupdate では false
でなければならない(MUST)。それ以外は、概ね pointermove と同じである。
user agent は、compatibility mouse events を pointerrawupdate に対して発火しないべきである(SHOULD)。
pointerrawupdate
イベントにリスナーを追加すると、user
agent の実装によってはウェブページの性能に悪影響を及ぼす可能性がある。
多くのユースケースでは、他の pointerevent 種別で十分である。
pointerrawupdate
リスナーは、JavaScript が高頻度のイベントを必要とし、かつ同じ速さで処理できる場合にのみ追加すべきである。
その場合、他の種別の pointer event をリッスンする必要はおそらくない。
user agent は、ポインタが active buttons state から離れたとき、pointer event を発火して pointerup という名前のイベントを発火しなければならない(MUST)。マウスでは、デバイスが少なくとも1つのボタンが押下された状態からボタン未押下の状態へ移行したときである。タッチでは、digitizer
から物理的接触が取り除かれたときである。ペンでは、ボタン未押下のままデジタイザへの物理的接触が取り除かれたとき、またはホバー中に少なくとも1つのボタンが押下された状態からボタン未押下の状態へ移行したときである。
入力 ホバーをサポートしないデバイスについては、user
agent は、pointerup イベントをディスパッチした後に、pointer event を発火して pointerout という名前のイベントを発火し、その後に pointerleave という名前の pointer event
を発火しなければならない(MUST)。
すべての pointerup イベントは、pressure の値が
0 である。
user agent は、ポインタが現在 capture されている場合、暗黙に pointer capture を解放もしなければならない(MUST)。
pointerdown と pointerup が、mousedown と
mouseup と同一の状況すべてで発火するわけではないことを意味する。詳しくは chorded
buttons を参照。
user agent は、pointer event ストリームを抑止するシナリオを検出したとき、pointer event を発火して pointercancel という名前のイベントを発火しなければならない(MUST)。
pointercancel イベントの次のプロパティの値は、同一の pointerId を持つ最後にディスパッチされた pointer
event の値と一致しなければならない(MUST):width、
height、pressure、tangentialPressure、tiltX、
tiltY、twist、altitudeAngle、azimuthAngle、
pointerType、isPrimary、および [UIEVENTS] から継承された座標。pointercancel イベントにおける
coalescedEvents および
predictedEvents リストは空でなければならず(MUST)、イベントの cancelable 属性は
false でなければならない(MUST)。
user agent
は、次のいずれかが起こったとき、pointer event を発火して pointerout という名前のイベントを発火しなければならない(MUST):
pointerup イベントを、ホバーをサポートしない
デバイスに対して発火した後(pointerup を参照)。user agent
は、次のいずれかが起こったとき、pointer event を発火して pointerleave という名前のイベントを発火しなければならない(MUST)。
pointerup イベントを、ホバーをサポートしない
デバイスに対して発火した後(pointerup を参照)。mouseleave イベント、および [CSS21]
に記述される CSS :hover 擬似クラスの間には類似点がある。pointerenter イベントも参照。
user agent は、要素が pointer
capture を受け取ったとき、pointer event を発火して gotpointercapture
という名前のイベントを発火しなければならない(MUST)。このイベントは pointer capture
を受け取る要素に対して発火される。そのポインタに対する後続のイベントは、この要素で発火される。pointer capture
を設定する節および 保留中の pointer capture
を処理する節を参照。
user agent は、ポインタについて
pointer capture が解放された後に、pointer event を発火して lostpointercapture
という名前のイベントを発火しなければならない(MUST)。このイベントは、capture
が解放された後のポインタに対する後続イベントのいずれよりも先に発火されなければならない(MUST)。このイベントは、pointer capture
が取り除かれた要素に対して発火される。click,
auxclick, および contextmenu イベント
を除く、そのポインタに対する後続のすべてのイベントは、イベントターゲットを決定するために通常の hit testing 機構(この仕様のスコープ外)に従う。pointer capture を解放する節、pointer capture の暗黙の解放節、および 保留中の pointer
capture を処理する節を参照。
ユーザーの環境は、垂直スクロールを y 軸方向の回転に、 水平スクロールを x 軸方向の回転に、 ズームを z 軸方向の回転に関連付けるよう設定されているかもしれない。
WheelEvent オブジェクトの deltaX、deltaY、deltaZ 属性は、
それぞれの軸に沿った測定値を、ピクセル、行、または
ページの単位で示す。報告される測定値は、環境固有の
アルゴリズムがホイールデバイスの実際の回転/移動を
適切な値と単位へ変換した後に提供される。
ユーザーの環境設定は、ホイールデバイスの実際の回転/移動を
さまざまな方法で解釈するようにカスタマイズできる。
一般的な 刻み
付きマウスホイールの1回の動きで、162ピクセルの測定値が生成されうる
(162 は単なる例であり、実際の値は user-agent の現在の画面
寸法に依存しうる)。
しかし、ユーザーは既定の環境設定を変更してマウスホイールを高速化でき、
この数値を増加させられる。
さらに、いくつかのマウスホイールソフトウェアは加速(ホイールの回転/移動が速いほど、
各測定値の delta
が大きくなる)や、サブピクセルの 回転
測定値さえサポートできる。
このため、作者は、ある user agent における所与の 回転 量が、
すべての user agent で同じ delta 値を生むとは仮定できない。
wheel イベント間で一貫していなければならない(MUST)。
もし user agent が
wheel イベントの既定動作としてスクロールするなら、
delta の符号は、正の X、Y、Z
軸がそれぞれ文書の右端、下端、最も遠い
奥行き(ユーザーから遠ざかる方向)へ向く右手座標系によって与えられるべきである(SHOULD)。
個々の user agent は(環境およびハードウェア構成に依存して) 同一の物理的ユーザー操作をホイール上で異なるように解釈しうる。 例えば、トラックパッドの端で上から下への垂直スワイプは、 ページを下へスクロールする意図のホイール操作として解釈されることも、 ページを上へパンする意図として解釈されることもある (すなわち、それぞれ deltaY が正または負の値になる)。
スクロール可能な要素内で、ホイールイベントの系列が子要素の上から始まった場合、 同じユーザージェスチャーに対する後続イベントは子要素の上で発生しうる。
WheelEvent インターフェイスは、
wheel イベントに関連付けられた特定の文脈情報を提供する。
WheelEvent インターフェイスのインスタンスを作成するには、WheelEvent コンストラクタを使用し、
オプションの WheelEventInit ディクショナリを渡す。
WebIDL[Exposed=Window]
interface WheelEvent : MouseEvent {
constructor(DOMString type, optional WheelEventInit eventInitDict = {});
// DeltaModeCode
const unsigned long DOM_DELTA_PIXEL = 0x00;
const unsigned long DOM_DELTA_LINE = 0x01;
const unsigned long DOM_DELTA_PAGE = 0x02;
readonly attribute double deltaX;
readonly attribute double deltaY;
readonly attribute double deltaZ;
readonly attribute unsigned long deltaMode;
};
DOM_DELTA_PIXELDOM_DELTA_LINEDOM_DELTA_PAGEdeltaXwheel
イベントの既定動作がスクロールである user agent では、このイベントがキャンセルされない場合にスクロールされるべき
x 軸方向の測定値(ピクセル、行、またはページ)が値でなければならない(MUST)。
それ以外の場合、これは x 軸まわりのホイールデバイスの動きを表す、実装固有の測定値
(ピクセル、行、またはページ)である。
この属性の un-initialized value は
0.0 でなければならない(MUST)。
deltaYwheel
イベントの既定動作がスクロールである user agent では、このイベントがキャンセルされない場合にスクロールされるべき
y 軸方向の測定値(ピクセル、行、またはページ)が値でなければならない(MUST)。
それ以外の場合、これは y 軸まわりのホイールデバイスの動きを表す、実装固有の測定値
(ピクセル、行、またはページ)である。
この属性の un-initialized value は
0.0 でなければならない(MUST)。
deltaZwheel
イベントの既定動作がスクロールである user agent では、このイベントがキャンセルされない場合にスクロールされるべき
z 軸方向の測定値(ピクセル、行、またはページ)が値でなければならない(MUST)。
それ以外の場合、これは z 軸まわりのホイールデバイスの動きを表す、実装固有の測定値
(ピクセル、行、またはページ)である。
この属性の un-initialized value は
0.0 でなければならない(MUST)。
deltaModedeltaMode 属性は、
delta
値に対する測定単位の指示を含む。既定値は
DOM_DELTA_PIXEL(ピクセル)である。
この属性は、delta 値の測定単位を示すために、
DOM_DELTA 定数のいずれかに設定されなければならない(MUST)。
正確な測定値は、デバイス、オペレーティングシステム、
およびアプリケーション構成に固有である。
この属性の un-initialized value は
0 でなければならない(MUST)。
WebIDLdictionary WheelEventInit : MouseEventInit {
double deltaX = 0.0;
double deltaY = 0.0;
double deltaZ = 0.0;
unsigned long deltaMode = 0;
};
deltaXdeltaZ 属性を参照。deltaYdeltaZ 属性を参照。deltaZdeltaZ 属性を
WheelEvent
オブジェクト上で初期化する。
この属性(および
deltaX と deltaY 属性)に対する相対的な正の値は、
X、Y、Z 軸がそれぞれ文書の右端、下端、
最も遠い奥行き(ユーザーから遠ざかる方向)へ向く
右手座標系によって与えられる。相対的な負の値は、それぞれ
反対方向である。
deltaMode
deltaMode 属性を、
WheelEvent オブジェクト上で、列挙値 0、1、2
に初期化する。これらは、ホイールの
回転 がスクロールを引き起こしたであろう場合に、スクロールされたピクセル量
(DOM_DELTA_PIXEL)、スクロールされた行数
(DOM_DELTA_LINE)、またはスクロールされたページ数
(DOM_DELTA_PAGE)を表す。
| Type | wheel |
|---|---|
| Interface | WheelEvent |
| Sync / Async | 非同期 |
| Bubbles | Yes |
| Trusted Targets | Element |
| Cancelable | 可変 |
| Composed | Yes |
| Default action | 文書をスクロール(またはズーム)する |
| Context (trusted events) |
|
wheel イベントとして配信されることも、
非ゼロの各軸ごとに別々の
wheel イベントとして配信されることもある(MAY)。
wheel イベント種別の典型的な default
action は、
示された量だけ文書をスクロール(または場合によってはズーム)することである。このイベントがキャンセルされた場合、実装は(当該イベント種別に関連付けられたその他の実装固有の既定動作があるならそれも含めて)文書をスクロールまたはズームしてはならない(MUST NOT)。
一部の user agents、またはいくつかの入力デバイスでは、ホイールが回された速度が delta 値に影響しうる。 速度が速いほど、delta 値がより大きくなる。
ホイールイベントに対して preventDefault を呼び出すと、スクロールを防止したり、
あるいは中断したりできる。最大のスクロール性能を得るため、user agent は、スクロールに関連付けられた各ホイールイベントがキャンセルされるかどうかを見るために、
それらが処理されるのを待たない場合がある。そのような場合、user
agent は cancelable プロパティが false の wheel イベントを生成すべきである(SHOULD)。これは、
preventDefault を用いてスクロールを防止または中断できないことを示す。そうでなければ cancelable は
true になる。
特に、user agent は、このイベントに対して non-passive
リスナーが存在しないことを観測したとき、
キャンセル不可能な wheel イベントのみを生成すべきである(SHOULD)。
以下の節では、pointer capture の設定および解放を容易にするために、既存の Element インターフェイスへの拡張について述べる。
WebIDLpartial interface Element {
undefined setPointerCapture (long pointerId);
undefined releasePointerCapture (long pointerId);
boolean hasPointerCapture (long pointerId);
};
setPointerCapture()引数 pointerId によって識別されるポインタについて、pointer capture を設定し、このメソッドが呼び出された要素に対して capture
する。以後、そのポインタの後続イベントについては、capture 対象(capturing target)が、ポインタが常に capture 対象の上にあるかのように、通常の hit
testing の結果を置き換え、capture が解放されるまで常にこの要素をターゲットにしなければならない(MUST)。このメソッドが有効になるには、ポインタが active
buttons state にある必要があり(MUST)、そうでなければ黙って失敗する。与えられたメソッドの引数が、いずれの
active pointers にも一致しない場合、"NotFoundError" の DOMException を throw する。
releasePointerCapture()引数 pointerId
によって識別されるポインタについて、pointer capture
を解放し、このメソッドが呼び出された要素から capture を解除する。以後そのポインタに対する後続イベントは、イベントターゲットを決定するために通常の hit
testing 機構(この仕様のスコープ外)に従う。与えられたメソッドの引数が、いずれの active pointers にも一致しない場合、"NotFoundError" の DOMException を throw する。
hasPointerCaptureこのメソッドが呼び出された要素が、引数 pointerId
によって識別されるポインタに対して pointer
capture を持つかどうかを示す。具体的には、pending pointer capture target
override が pointerId
について、このメソッドが呼び出された要素に設定されている場合は true を返し、それ以外は false を返す。
setPointerCapture()
の呼び出し直後に true を返す。たとえその要素がまだ gotpointercapture
イベントを受け取っていなくても同様である。その結果、このメソッドは、pointerdown イベントリスナー内から implicit pointer capture を検出するのに有用になりうる。
以下の節では、イベントハンドラの登録を容易にするために、既存の GlobalEventHandlers
ミックスインへの拡張について述べる。
WebIDLpartial interface mixin GlobalEventHandlers {
attribute EventHandler onpointerover;
attribute EventHandler onpointerenter;
attribute EventHandler onpointerdown;
attribute EventHandler onpointermove;
[SecureContext] attribute EventHandler onpointerrawupdate;
attribute EventHandler onpointerup;
attribute EventHandler onpointercancel;
attribute EventHandler onpointerout;
attribute EventHandler onpointerleave;
attribute EventHandler ongotpointercapture;
attribute EventHandler onlostpointercapture;
};
onpointeroverpointerover イベント種別に対する event
handler IDL attribute。
onpointerenterpointerenter イベント種別に対する event
handler IDL attribute。
onpointerdownpointerdown イベント種別に対する event
handler IDL attribute。
onpointermovepointermove イベント種別に対する event
handler IDL attribute。
onpointerrawupdatepointerrawupdate イベント種別に対する event
handler IDL attribute。
onpointeruppointerup イベント種別に対する event
handler IDL attribute。
onpointercancelpointercancel イベント種別に対する event
handler IDL attribute。
onpointeroutpointerout イベント種別に対する event
handler IDL attribute。
onpointerleavepointerleave イベント種別に対する event
handler IDL attribute。
ongotpointercapturegotpointercapture
イベント種別に対する event
handler IDL attribute。
onlostpointercapturelostpointercapture
イベント種別に対する event
handler IDL attribute。
Attributes and Default Actions
で述べたとおり、ビューポートの操作(パンおよびズーム)は、pointer event
をキャンセルしても抑止できない。代わりに、作者は、許可したい挙動と抑止したい挙動を、touch-action CSS プロパティを用いて宣言的に定義しなければならない。
touch-action CSS プロパティはタッチ入力のみを参照しているように見えるが、実際にはパンおよびズームに対する direct manipulation を許容するあらゆる形態のポインタ入力に適用される。
| Name: | touch-action |
|---|---|
| Value: | auto | none | [ [ pan-x | pan-left |
pan-right ] || [ pan-y | pan-up |
pan-down ] ] | manipulation
|
| Initial: | auto |
| Applies to: | 置換されないインライン要素、表の行、行グループ、表の列、列グループを除くすべての要素 |
| Inherited: | no |
| Percentages: | N/A |
| Media: | visual |
| Computed value: | 指定値と同じ |
| Canonical order: | 文法による |
| Animation type: | アニメーション不可 |
touch-action CSS プロパティは、(プロパティ名に反してタッチに限定されない)direct
manipulation の相互作用が、user agent のパン/ズーム挙動をトリガーしてよいかどうか(MAY)を決定する。touch-action 値に関する節を参照。
パンまたはズームを開始する直前に、user agent は、次の条件がすべて真である場合、pointer event ストリームを抑止しなければならない(MUST):
pointerdown イベントが送信済みである、かつpointerup または pointercancel イベント(上記の pointerdown に続くもの)がまだ送信されていない。touch-action は埋め込みブラウジングコンテキストへは適用/カスケードしない。例えば、<iframe> に
touch-action を適用しても、<iframe> 自体の内部におけるパンおよびズームの direct manipulation
相互作用の挙動には影響しない。
ユーザーが direct manipulation
ポインタ(タッチスクリーン上のタッチやスタイラスなど)を用いて要素と相互作用するとき、その入力の効果は、touch-action
プロパティの値、および要素とその祖先の既定の直接操作挙動により、次のとおり決定される:
touch-action に 適合する。CSS
変形が適用されている場合、要素の座標空間は画面座標と異なり、そのことがここでの適合に影響しうる点に注意。例えば、画面に対して 90 度回転した要素の X 軸は、画面座標の Y 軸と平行になる。
touch-action プロパティに 適合する場合にサポートされる。
document 要素までの間にある各要素の
touch-action プロパティに 適合する場合にサポートされる。
touch-action 値の変更は、その動作の間は無視される。例えば、pointerdown イベントハンドラの一部として、要素の
touch-action 値を auto から none
にプログラム的に変更しても、そのポインタがアクティブである限り、user agent がその入力に対するパンまたはズーム挙動を中止/抑止する結果にはならない。
pan-* の各種 touch-action 値の場合、user agent
がジェスチャー開始時にそれを直接扱うかどうかを決定した後は、同一ジェスチャーの方向が後から変化しても、ポインタがアクティブである限り user agent はそれを無視すべきである(SHOULD)。例えば、ある要素が touch-action: pan-y に設定されている(つまり垂直パンのみが user
agent により処理される)状態で、タッチジェスチャーが水平に開始された場合、指がまだ画面に触れている間にユーザーがジェスチャーの方向を垂直に変えても、垂直パンは発生しないべきである。touch-action 値の処理または関連付け方法は、この仕様のスコープ外である。
touch-action
プロパティは、ビューポートのパンおよびズームに関連する直接操作の挙動を対象とする。テキスト選択/ハイライト、またはリンクやフォームコントロールの有効化のような追加の user agent 挙動は、この CSS
プロパティによって影響されてはならない(MUST NOT)。
auto や none の値に対する挙動をトリガーする相互作用やジェスチャーを定義することは、この仕様のスコープ外である。
pan-x または pan-y)、パン中に軸を変更することはできない。
touch-action 値は、[COMPAT] で定義されている。touch-action プロパティは、CSS の width と height
の両方のプロパティをサポートする要素にのみ適用される([CSS21]
を参照)。
この制約は、低レイテンシの direct manipulation のパンおよびズームに対する user agent
の最適化を促進するために設計されている。既定ではサポートされない要素(置換されないインライン要素である <span> など)については、作者は
display CSS プロパティを block のような width と height
をサポートする値に設定できる。将来の仕様は、この API をすべての要素へ拡張する可能性がある。
方向指定の pan 値は、いくつかのオーバースクロール挙動をカスタマイズするのに有用である。
例えば、簡単な pull-to-refresh 効果を実装するには、文書の
touch-action を、スクロール位置が 0 のときは pan-x pan-down に、そうでない場合は
pan-x pan-y に設定できる。
これにより、ポインタイベントハンドラは、文書の先頭から開始される上方向へのパン/スクロールに対する挙動を定義できる。
方向指定の pan 値は、要素がネイティブにスクロールする(またはその逆)中で、要素内の pointer event
処理によってカスタムパンを実装するコンポーネントを構成するためにも利用できる。
例えば画像カルーセルは、文書の垂直パンを妨げることなく、水平 pan 操作に対する pointer event を受け取ることを保証するために pan-y
を用いることができる。
カルーセルが最も右端に達したとき、touch-action を pan-y pan-right
に変更し、範囲を超える後続のスクロール操作が可能であればビューポート内で文書をスクロールできるようにすることができる。
パン/スクロール操作が進行中の間に、その挙動を変更することはできない。
auto の場合、user
agents は通常、ダブルタップジェスチャーを処理できるように click の前に 300ms
の遅延を追加する。これらの場合、touch-action: none または
touch-action: manipulation
を明示的に設定すると、この遅延は取り除かれる。タップまたはダブルタップジェスチャーを決定する方法は、この仕様のスコープ外である点に注意。
<div style="touch-action: none;">
この要素は、そうでなければパンまたはズームにつながるすべての direct manipulation 相互作用に対して pointer event を受け取る。
</div>
<div style="touch-action: pan-x;">
この要素は、水平方向にパンしていないときに pointer event を受け取る。
</div>
<div style="overflow: auto;">
<div style="touch-action: none;">
この要素は、そうでなければパンまたはズームにつながるすべての direct manipulation 相互作用に対して pointer event を受け取る。
</div>
<div>
この要素上の direct manipulation 相互作用は、親を操作するために消費されてもよい(MAY)。
</div>
</div>
<div style="overflow: auto;">
<div style="touch-action: pan-y;">
<div style="touch-action: pan-x;">
この要素は、次の理由により、すべての direct manipulation 相互作用に対して pointer event を受け取る。
それは、この要素が水平方向のパンのみを許可する一方で、中間の祖先(この要素とスクロール可能要素の間)が垂直方向のパンのみを許可するためである。
したがって、パン/ズームに対するいかなる直接操作の挙動も user agent によって処理されない。
</div>
</div>
</div>
<div style="overflow: auto;">
<div style="touch-action: pan-y pan-left;">
<div style="touch-action: pan-x;">
この要素は、左方向にパンしていないときに pointer event を受け取る。
</div>
</div>
</div>
この節は非規範である。
ポインタキャプチャは、特定のポインタに対するイベント(任意の 互換マウスイベントを含む)を、ポインタ位置の通常の hit
test 結果以外の特定要素へリターゲットできるようにする。これは、カスタムのスライダーコントロール(例: [HTML]
<input type="range">
コントロールのようなもの)といったシナリオで有用である。ポインタキャプチャをスライダーのつまみ要素に設定すると、ポインタがつまみから外れて滑っても、ユーザーはコントロールを前後にスライドできる。
pointerdown
した後、ポインタがそこから逸れてもつまみをスライドできるようにするために、ポインタキャプチャを利用できる。
ポインタキャプチャは、element.setPointerCapture(pointerId) メソッドを呼び出すことで、型 Element の
element に設定される。
このメソッドが呼び出されたとき、user agent
は次の手順を実行しなければならない(MUST):
pointerId が、いずれの active pointers にも一致しない場合、"NotFoundError" の DOMException を throw する。pointerId
によって指定される active pointer とする。
InvalidStateError" の
DOMException を throw する。
pointerLockElement)を持つ場合、"InvalidStateError" の
DOMException を throw する。
pointerId について、pending pointer capture target override を、このメソッドが呼び出された Element に設定する。pointerdown リスナーで解放しようとして失敗した場合にも当てはまる。ポインタキャプチャは、element.releasePointerCapture(pointerId)
メソッドを呼び出すことで、要素上で明示的に解放される。このメソッドが呼び出されたとき、user agent は次の手順を実行しなければならない(MUST):
pointerId が、いずれの active pointers にも一致せず、かつこれらの手順が pointer capture
の暗黙的解放の結果として呼び出されていない場合、"NotFoundError" の DOMException を throw する。pointerId を持つ Element に対して hasPointerCapture が false
の場合、これらの手順を終了する。
pointerId について、pending pointer capture target
override が設定されていればそれをクリアする。パンおよびズームに対する direct manipulation
相互作用(タッチスクリーン上のタッチやスタイラスなど)を実装する入力は、任意の pointerdown リスナーの呼び出し直前に、ターゲット要素に対して setPointerCapture
が呼び出されたかのように、まったく同じ挙動をするべきである(SHOULD)。hasPointerCapture API は(例えば pointerdown リスナー内で)これが起こったかどうかを判断するために使用できる。次の
pointer event が発火される前に、そのポインタに対して releasePointerCapture
が呼び出されなかった場合、キャプチャがアクティブであることを示す gotpointercapture
イベントが(通常どおり)ターゲットへディスパッチされる。
pointerup または pointercancel イベントを発火した直後に、
user agent は、たった今ディスパッチされた
pointerup または pointercancel イベントの pointerId について、pending pointer capture target
override をクリアしなければならない(MUST)。その後、必要であれば lostpointercapture を発火するために process pending pointer capture の手順を実行する。
process pending pointer capture
の手順を実行した後、ポインタがホバーをサポートする場合、user agent
は、キャプチャのないポインタの現在位置を反映するために必要な対応する境界イベントも送信しなければならない(MUST)。
pointer capture target override がもはや connected [DOM] でない場合、pointer capture target override は文書に設定されるべきである(SHOULD)。
pending pointer capture target override がもはや connected [DOM] でない場合、pending pointer capture target override ノードはクリアされるべきである(SHOULD)。
lostpointercapture
イベントが文書に対して発火される結果になる。
要素に対して pointer lock [PointerLock]
が成功裏に適用されたとき、いずれかの要素がキャプチャ中またはキャプチャ保留中に設定されているなら、user agent は、releasePointerCapture
メソッドが呼び出されたかのように手順を実行しなければならない(MUST)。
性能上の理由から、user agent は、ポインタの measurable property
(座標、圧力、接線圧、tilt、twist、または接触ジオメトリなど)
が更新されるたびに pointermove
イベントを送らないことを選んでもよい。代わりに、それらは複数の変化を coalesce(結合/マージ)して、
単一の pointermove または pointerrawupdate イベントにしてもよい。これは、user agent
が行わなければならないイベント処理量(MUST)を減らすのに役立つ一方で、とりわけ高速かつ大きな動きにおいて、ポインタ位置の追跡における粒度と忠実度を自然に低下させる。getCoalescedEvents
メソッドを用いると、アプリケーションは生の、coalesce されていない位置変化へアクセスできる。これにより、ポインタ移動データをより精密に処理できる。例えば描画アプリケーションでは、coalesce
されていないイベントを用いて、ポインタの実際の動きにより近い、より滑らかな曲線を描画できる。
pointermove イベントからの coalesced
座標(灰色の点)だけを用いると、曲線は目に見えて角張ってギザギザになる。getCoalescedEvents()
が提供する、より粒度の細かい点(赤い円)を用いて同じ線を描くと、ポインタ移動に対するより滑らかな近似になる。PointerEvent には、関連付けられた coalesced
events list(0 個以上の PointerEvent のリスト)がある。信頼された pointermove および
pointerrawupdate イベントについて、このリストは、このイベントに
coalesce されたすべての PointerEvent の列である。「親」の信頼された pointermove および
pointerrawupdate イベントは、これらの coalesced
イベントの蓄積を表すが、追加の処理(例えば表示のリフレッシュレートに合わせるなど)を持ちうる。その結果、これらのイベントに対する coalesced events list には常に少なくとも 1
つのイベントが含まれる。他のすべての信頼されたイベント種別については空リストである。信頼されないイベントは、その coalesced events
list が、コンストラクタに渡された値で初期化される。
isTrusted ビットを
false に設定するが、coalesced
events list 内の同じビットは、元の true の値から変更されない。
信頼されたイベントの coalesced events list 内のイベントは、次を持つ:
timeStamp 値は単調増加する
[DOM] — すべての coalesced イベントは、getPredictedEvents
メソッドが呼び出されたディスパッチ済み pointer event の timeStamp 以下の timeStamp を持つ。coalesced
events list は、timeStamp
によって時系列順にソートされていなければならない(MUST)。したがって、最初のイベントは最小の timeStamp を持つ。
pointerId、pointerType、および
isPrimary。
<style>
/* canvas 要素上のすべてのイベントがアプリケーションへ渡されるように、
user agent 固有の直接操作の既定挙動(パンまたはズームなど)を無効にする。 */
canvas { touch-action: none; }
</style>
<canvas id="drawSurface" width="500px" height="500px" style="border:1px solid black;"></canvas>
<script>
const canvas = document.getElementById("drawSurface"),
context = canvas.getContext("2d");
canvas.addEventListener("pointermove", (e)=> {
if (e.getCoalescedEvents) {
for (let coalesced_event of e.getCoalescedEvents()) {
paint(coalesced_event); // 生の(coalesce されていない)点をすべて描画する
}
} else {
paint(e); // 最終的な coalesced 点を描画する
}
});
function paint(event) {
if (event.buttons>0) {
context.fillRect(event.clientX, event.clientY, 5, 5);
}
}
</script>
これらディスパッチされたすべてのイベントの順序は、元のイベントの実際の順序と一致しなければならない(MUST)。
例えば、pointerdown イベントが、coalesced pointermove イベントのディスパッチを引き起こす場合、user agent はまず、同一の pointerId を持つそれら coalesced イベントすべてを含む 1
つの pointermove
イベントをディスパッチし、その後に pointerdown
イベントをディスパッチしなければならない(MUST)。
以下は、timeStamp
値が増加する実際のイベント、および user agent がディスパッチするイベントの例である:
| 実際のイベント | ディスパッチされるイベント |
|---|---|
pointer (pointerId=2)
座標変化 |
pointerrawupdate (pointerId=2) 1 つの
coalesced イベントを伴う |
pointer (pointerId=1)
座標変化 |
pointerrawupdate (pointerId=1) 1 つの
coalesced イベントを伴う |
pointer (pointerId=2)
座標変化 |
pointerrawupdate (pointerId=2) 1 つの
coalesced イベントを伴う |
pointer (pointerId=2)
座標変化 |
pointerrawupdate (pointerId=2) 1 つの
coalesced イベントを伴う |
pointer (pointerId=1)
座標変化 |
pointerrawupdate (pointerId=1) 1 つの
coalesced イベントを伴う |
pointer (pointerId=2)
座標変化 |
pointerrawupdate (pointerId=2) 1 つの
coalesced イベントを伴う |
pointer (pointerId=1) ボタン押下
|
pointermove
(pointerId=1) 2 つの
coalesced イベントを伴うpointermove
(pointerId=2) 4 つの
coalesced イベントを伴うpointerdown
(pointerId=1) 0 個の
coalesced イベントを伴う |
pointer (pointerId=2)
座標変化 |
pointerrawupdate (pointerId=2) 1 つの
coalesced イベントを伴う |
pointer (pointerId=2)
座標変化 |
pointerrawupdate (pointerId=2) 1 つの
coalesced イベントを伴う |
pointer (pointerId=1) ボタン解放
|
pointermove
(pointerId=2) 2 つの
coalesced イベントを伴うpointerup (pointerId=1) 0 個の
coalesced イベントを伴う |
いくつかの user agent
には、確認済みの一連のポインタ移動の後で、(現在のジェスチャーに対する先行イベント、および移動の速度/軌跡に基づいて)将来のポインタ移動位置がどこになりそうかを予測できる組み込みアルゴリズムがある。アプリケーションは、この情報を
getPredictedEvents
メソッドで利用し、知覚レイテンシを減らすために予測位置へ先回りして「描画」し、その後、実際の点が受信されたらこれらの予測点を破棄できる。
pointermove イベントからの coalesced 座標を使用し、user
agent によって予測された将来点(灰色の円)を示す。PointerEvent には、関連付けられた predicted
events list(0 個以上の PointerEvent のリスト)がある。信頼された pointermove イベントについて、これは user agent
が将来そのイベントに続くと予測する PointerEvent の列である。他のすべての信頼されたイベント種別については空リストである。信頼されないイベントは、その predicted events list がコンストラクタに渡された値で初期化される。
pointerrawupdate イベントは空でない coalesced events list
を持ちうるが、性能上の理由から、その predicted events list は通常は空リストになる。
isTrusted ビットを
false に設定するが、predicted
events list 内の同じビットは、元の true の値から変更されない。
リスト内のイベント数、およびそれらが現在のタイムスタンプからどれほど先かは、user agent と、その予測アルゴリズムにより決定される。
信頼されたイベントの predicted events list 内のイベントは、次を持つ:
timeStamp 値
[DOM] — すべての predicted イベントは、getPredictedEvents
メソッドが呼び出されたディスパッチ済み pointer event の timeStamp 以上の timeStamp を持つ。predicted
events list は、timeStamp
によって時系列順にソートされていなければならない(MUST)。したがって、最初のイベントは最小の timeStamp を持つ。
pointerId、pointerType、および
isPrimary。
作者は、予測イベントを、次の pointer event がディスパッチされるまでの間のみ有効な予測として考慮すべきである。user agent がどれほど将来まで予測するかによっては、通常の pointer event が、1 つ以上の予測イベントのタイムスタンプよりも早くディスパッチされることがあり得る。
let predicted_points = [];
window.addEventListener("pointermove", function(event) {
// 以前に描画した predicted 点をクリアする。
for (let e of predicted_points.reverse()) {
clearPoint(e.pageX, e.pageY);
}
// 最後に受信したイベント以降に起きた実際の動きを描画する。
for (let e of event.getCoalescedEvents()) {
drawPoint(e.pageX, e.pageY);
}
// 遅延の知覚を減らすために、現在の predicted 点を描画する。
predicted_points = event.getPredictedEvents();
for (let e of predicted_points) {
drawPoint(e.pageX, e.pageY);
}
});
信頼された PointerEvent が作成されるとき、user agent は、coalesced events list および predicted events list 内の各イベントについて、次の手順を実行すべきである(SHOULD):
pointerId、
pointerType、
isPrimary および isTrusted
を、「親」ポインタイベントの各プロパティと一致するよう設定する。
cancelable および bubbles を false
に設定する(これらのイベントは単独では決してディスパッチされないため)。PointerEvent 値へ初期化する。信頼された PointerEvent の target が変更されたとき、user agent
は、coalesced events list および predicted events list 内の各イベントについて、次のとおり行うべきである(SHOULD):
今日存在する Web コンテンツの大多数は、Mouse Events に対してのみコード化されている。以下では、このコンテンツとの互換性のために、user agent が汎用ポインタ入力をマウスイベントへマップしてよい(MAY)方法のアルゴリズムを述べる。
マウスイベントとの互換マッピングは、この仕様の OPTIONAL な機能である。既存のレガシーコンテンツとの最良の互換性のため、user agent はこの機能をサポートすることが推奨される。
高レベルでは、互換マウスイベントは、それぞれ対応する pointer event と「インタリーブ」されることが意図されている。しかし、この特定の順序は必須ではなく、互換マウスイベントを実装する user agent は、それらの相対順序が一貫している限り、マウスイベントのディスパッチを遅延させたりグループ化したりすることを選んでもよい(MAY)。
特にタッチスクリーン入力の場合、user agent は、(作者が
により明示的に抑止しない限り)ジェスチャー認識のための追加のヒューリスティクスを適用してよい(MAY)。touch-actionpointerdown イベントと pointerup
イベントの間の一連のイベントの間、ジェスチャー認識は、ジェスチャーを検出または無視するために pointerup イベントまで待つ必要がある場合がある。その結果、user agent
が相互作用が特定のジェスチャーを意図したものではないと判断した場合、シーケンス全体の互換マウスイベントは最後の pointerup イベントの後にまとめてディスパッチされうる。user agent
のジェスチャー認識に関するこれらの詳細は、この仕様では定義されず、実装間で異なりうる。
互換マウスイベントのサポートの有無にかかわらず、user agent は常に click、auxclick、および contextmenu
イベントをサポートしなければならない(MUST)。なぜなら、これらのイベントは PointerEvent 型であり、したがって 互換マウスイベントではないためである。pointer event 中に
preventDefault を呼び出しても、click、auxclick、または contextmenu
が発火されるかどうかに影響してはならない(MUST NOT)。
これら高レベルイベントのいくつか(contextmenu、focus、blur など)と pointer
event の相対順序は未定義であり、user agent 間で異なる。例えば、ある user agent では contextmenu は pointerup の後に続くことが多い一方、別の user agent では pointerup や pointercancel に先行することが多く、また状況によっては対応する
pointer event なしに発火することもある(例えばキーボード操作の結果として)。
加えて、user agent は、click、auxclick、または contextmenu
イベントを発火すべきかどうかを決定するために独自のヒューリスティクスを適用しうる。同一種別の他の(非 primary)ポインタが存在する場合、または異なる種別の他の primary
ポインタが存在する場合に、これらのイベントを発火しないことを選ぶ user agent もある。user agent
は、特定の動作が「クリーン」なタップ、クリック、またはロングプレスではない(例えば、タッチスクリーン上の指の相互作用が、指が画面に接触している間に動きすぎる場合)と判断し、click、auxclick、または
contextmenu イベントを発火しない決定をしうる。user agent の挙動のこれらの側面は、この仕様では定義されず、実装間で異なりうる。
特に記載がない限り、マップされた任意のマウスイベントのターゲットは、ターゲットがそれぞれの pointer event のターゲットとして、もはや ownerDocument
のツリーに参加していない場合を除き、対応する pointer event と同じターゲットであるべきである(SHOULD)。この場合、マウスイベントは、元のターゲットがツリーから削除された時点における最も近い祖先ノードで、かつ
ownerDocument のツリーに参加しているものに対して発火されるべきである。つまり、マウスイベントのために(新しいターゲットノードに基づく)新たなイベントパスが構築される。
作者は、pointerdown イベントをキャンセルすることで、特定の互換マウスイベントの生成を防止できる。
マウスイベントは、ポインタが down のときにのみ防止できる。ホバーするポインタ(例:ボタンが押されていないマウス)は、マウスイベントを防止できない。
mouseover、mouseout、mouseenter、mouseleave
イベントは、(ポインタが down であっても)決して防止されない。
互換マウスイベントは、pointer event の EventListener が passive
[DOM]
に設定されている場合は防止できない。
primary pointers だけが互換マウスイベントを生成できる一方で、複数の primary pointers
が同時にアクティブになりえ、それぞれが自身の互換マウスイベントを生成できる。MouseEvents
に依存するスクリプトとの互換性のため、マウス遷移イベント(mouseover、mouseout、mouseenter および
mouseleave)は、単一のレガシーマウス入力の移動をシミュレートすべきである(SHOULD)。これは、[UIEVENTS] に従い、すべてのイベントターゲットの entry/exit
状態が有効であることを意味する。user agent は、文書内で レガシーマウスポインタの実効位置 を以下のとおり維持することで、これを保証するべきである(SHOULD)。
pointerdown、pointerup、または pointermove イベント、あるいは window における pointerleave イベントを発火する直前に、user agent
は次の手順を実行すべきである(SHOULD):
pointerdown、pointerup、または pointermove イベントのターゲットを T とする。pointerleave イベントについては、T を未設定にする。
mouseover、mouseout、mouseenter および
mouseleave イベントをディスパッチする。現在の レガシーマウスポインタの実効位置 または T
のいずれかが未設定である値は、ウィンドウ外のマウス位置として扱う。
レガシーマウスポインタの実効位置は、ポインタ遷移イベント(pointerover、pointerout、
pointerenter および
pointerleave)から対応するレガシーマウス遷移イベント(mouseover、
mouseout、mouseenter および
mouseleave)への直接マッピングを常に持てるわけではないという事実をモデル化する。以下のアニメーションは、2 つの primary pointer
を単一のレガシーマウス入力で整合させるために、user agent がポインタ遷移イベントよりも多くのレガシーマウス遷移イベントをディスパッチする必要があるケースを示す。
このアニメーションでは、マウスクリックとタッチタップの間の時間に注意。ボタン 1 はこの期間に pointerout
イベントを受け取らない(「実際の」マウスポインタがこの期間にボタン矩形から出なかったため)が、タッチタップで レガシーマウスポインタの実効位置 がボタン 2
へ移動するとき、ボタン 1 は mouseout イベントを受け取る。同様に、タッチタップと、マウスがボタン 1
を離れる直前の時点までの期間では、同じ理由によりボタン 1 は pointerover イベントを受け取らないが、レガシーマウスポインタの実効位置 がボタン 1
の内側へ戻るとき、ボタン 1 は mouseover イベントを受け取る。
user agent がホバーをサポートするデバイスに対して pointer event をディスパッチする場合は常に、次の手順を実行すべきである(SHOULD):
isPrimary プロパティが false の場合、pointer event
をディスパッチし、これらの手順を終了する。pointerdown、pointerup または pointermove イベント、あるいは window における
pointerleave イベントである場合、レガシーマウスポインタの実効位置の追跡で述べたとおり、互換マウス遷移イベントをディスパッチする。
pointerdown で、かつイベントの canceled flag
が設定されている場合、この pointerType について PREVENT MOUSE EVENT フラグを設定する。
pointerType について PREVENT MOUSE EVENT
フラグが設定されていない、かつディスパッチされた pointer event が次のいずれかである場合:
pointerdown の場合、mousedown
イベントを発火する。
pointermove の場合、mousemove
イベントを発火する。
pointerup の場合、mouseup
イベントを発火する。
pointercancel
の場合、window で mouseup イベントを発火する。pointerup または pointercancel の場合、この pointerType
について PREVENT MOUSE EVENT フラグをクリアする。
多くのタッチスクリーンなどのいくつかのデバイスは、アクティブ状態にない間に座標(または座標集合)をホバーできない。マウスイベントにコード化された既存コンテンツの多くは、マウスがイベントを生成すると仮定しており、したがって一般に次の性質が真である:
mousemove イベントを生成する可能性が高い。
このため user agent は、これら種別の入力デバイスに対して異なるマッピングを提供する必要がある。user agent が ホバーをサポートしないデバイスに対して pointer event をディスパッチする場合は常に、次の手順を実行すべきである(SHOULD):
isPrimary プロパティが false の場合、pointer event
をディスパッチし、これらの手順を終了する。pointerover で、かつこのポインタについて
pointerdown
イベントがまだディスパッチされていない場合、(レガシーなマウス特有コードとの互換性のため)mousemove イベントを発火する。
pointerdown、pointerup または pointermove イベント、あるいは window における
pointerleave イベントである場合、レガシーマウスポインタの実効位置の追跡で述べたとおり、互換マウス遷移イベントをディスパッチする。
pointerdown で、かつイベントの canceled flag
が設定されている場合、この pointerType について PREVENT MOUSE EVENT フラグを設定する。
pointerType について PREVENT MOUSE EVENT
フラグが設定されていない、かつディスパッチされた pointer event が次のいずれかである場合:
pointerdown の場合、mousedown
イベントを発火する。
pointermove の場合、mousemove
イベントを発火する。
pointerup の場合、mouseup
イベントを発火する。
pointercancel
の場合、window で mouseup イベントを発火する。pointerup または pointercancel の場合、この pointerType
について PREVENT MOUSE EVENT フラグをクリアする。
user agent が Touch Events([TOUCH-EVENTS] で定義)と Pointer Events の両方をサポートする場合、user agent は、この節で述べた互換マウスイベントと、[TOUCH-EVENTS] に概説されている fallback mouse events の両方を生成してはならない(MUST NOT)。
ホバーをサポートしない primary
pointer(例:タッチスクリーン上の単一の指)による要素のアクティベーション(click)は、通常は次のイベントシーケンスを生成する:
mousemovepointeroverpointerentermouseovermouseenterpointerdownmousedownpointermove および
mousemove イベント
pointerupmouseuppointeroutpointerleavemouseoutmouseleaveclickしかし、これらの相互作用の間に pointerdown イベントの canceled flag
が設定された場合、イベントシーケンスは次のとおりになる:
mousemovepointeroverpointerentermouseovermouseenterpointerdownpointermove イベント
pointeruppointeroutpointerleavemouseoutmouseleaveclickこの付録では、Pointer Events 実装におけるセキュリティおよびプライバシーの考慮事項について議論する。議論は、この仕様で定義されるイベントモデル、API、およびイベントの実装から直接生じるセキュリティ/プライバシー問題に限定される。
この仕様で定義される多くのイベント種別は、ユーザーの操作に応答してディスパッチされる。これは悪意あるイベントリスナーが、ユーザーが通常は機密とみなす情報(例:ページと相互作用している間のユーザーのマウス/スタイラス/指の正確な経路/動き)へアクセスすることを可能にする。
Pointer events は、(ユーザーのデバイスがサポートする場合)ペン入力が保持される角度や傾き、接触面のジオメトリ、スタイラスまたはタッチスクリーンに加えられる圧力などの追加情報を含む。角度、傾き、ジオメトリ、圧力に関する情報は、ユーザーのデバイス上のセンサーに直接関連しており、この仕様はオリジンがこれらのセンサーへアクセスすることを可能にする。
このセンサーデータは、用いられている入力機構(マウス、タッチ、ペン)を判別する能力と同様に、ユーザー、またはユーザーのデバイスおよび環境の特性を推測するために利用されうる。これらの推測された特性および任意のデバイス/環境情報は、それ自体が機微になりうる。例えば、悪意あるサイトが、ユーザーが支援技術を使用しているかどうかをさらに推測できる可能性がある。この情報は、ユーザープロファイルの構築、ならびに特定ユーザーの「フィンガープリント」作成および追跡の目的で潜在的に利用されうる。
緩和策として、user agent は、ユーザーが特定のセンサーデータ(角度、傾き、圧力など)へのアクセスを無効にできる機能、またはユーザーからの明示的なオプトイン後にのみ利用可能にする機能を含めることを検討してもよい。
この仕様は、作者が「predicted events」へアクセスできる方法を定義する。この仕様自体は、user agent が予測に用いるべきアルゴリズムを定義しない。仕様の作者は、アルゴリズムはユーザーが実行している現在のジェスチャーに関連する先行 pointer event にのみ依存することを想定している。予測アルゴリズムの具体的実装が、追加データ(例えば、異なるサイトにわたるユーザーの完全な相互作用履歴)に依存せず、ユーザーに関する機微情報を露呈したり、「フィンガープリント」作成および追跡に利用されたりしないことを保証する責任は、user agent にある。
これらの考慮事項を超えて、ワーキンググループは、この仕様が次を満たすと考えている:
この節は非規範である。
buttons プロパティが 0 以外の値を持つときの状態。マウスでは、デバイスの少なくとも 1
つのボタンが押下されているとき。タッチでは、デジタイザとの物理的接触があるとき。ペンでは、ペンがデジタイザと物理的接触を持つとき、またはホバー中に少なくとも 1 つのボタンが押下されているとき。pointerId
により識別される)が文書内で追加のイベントを生成できる可能性があるなら、そのポインタは依然としてアクティブと見なされる。例:
WheelEvent
インターフェイス(マウスホイールやタッチパッドなど)をサポートする入力デバイスの物理的動きに応答して、user agent がページをスクロールまたはズームする見込み量(ピクセル、行、またはページ)。delta
の値(例えば deltaX、deltaY、または deltaZ 属性)は、現在の deltaMode
プロパティの文脈で解釈されるべきである。ホイール(または他のデバイス)の物理的動きと、delta が正か負かの関係は、環境およびデバイスに依存する。しかし、user agent が default action
としてスクロールする場合、delta の符号は、正の X、Y、Z 軸がそれぞれ document
の右端、下端、最も遠い奥行き(ユーザーから遠ざかる方向)へ向く右手座標系によって与えられる。Measurable properties は、実数または大きな定義域の整数で表現される、連続的なポインタセンサーデータに関する値を表す。pointer events
では、width、height、
pressure、
tangentialPressure、tiltX、tiltY、twist、
altitudeAngle、azimuthAngle、および [UIEVENTS] の Mouse
Event モデルプロパティである
screenX、screenY、clientX、clientY は measurable
properties である。
対照的に pointerId、pointerType、
isPrimary、および [UIEVENTS] の Mouse Event モデルプロパティである button、
buttons、ctrlKey、
shiftKey、altKey、metaKey は、センサーデータに関係しないため measurable
properties とは見なされない。
WheelEvent
インターフェイスを用いる入力デバイス上の増分変化の指示。いくつかのデバイスでは、これは文字どおりホイールの回転であるかもしれない(MAY)。一方で別のデバイスでは、平面上の移動、または特定ボタンへの圧力であるかもしれない(MAY)。
hit testing機能が用いられる。hit testing およびスタック順序に関する具体的詳細については、host language を参照。
この節は規範である。 以下の機能は廃止されており、レガシーソフトウェアとの互換性を必要とする user agents によってのみ実装されるべきである。また、[UIEvents] における legacy event initializers も参照。
WebIDLpartial interface MouseEvent {
};
MouseEvent オブジェクトの属性を初期化する。このメソッドは
UIEvent.initUIEvent() と同じ挙動を持つ。
initMouseEvent メソッドは非推奨であるが、広く配備された実装との後方互換性のためにサポートされる。
initEvent()
メソッドを参照。
initEvent()
メソッドを参照。
initEvent()
メソッドを参照。
view を指定する。この値は
null でもよい(MAY)。
detail を指定する。
screenX を指定する。
screenY を指定する。
clientX を指定する。
clientY を指定する。
ctrlKey を指定する。
altKey を指定する。
shiftKey を指定する。
metaKey を指定する。
button を指定する。
relatedTarget を指定する。この値は
null でもよい(MAY)。
本書に取り入れられているものもある、多くの方々からの提案および推奨に深く感謝する。グループの議長は、以下の過去および現在のグループメンバーならびに参加者からの貢献に謝意を表する: Mustaq Ahmed, Arthur Barstow, Ben Boyle, Matt Brubeck, Rick Byers, Marcos Cáceres, Cathy Chan, Bo Cupp, Domenic Denicola, Ted Dinklocker, Adam Ettenberger, Robert Flack, Dave Fleck, Mike Fraser, Ella Ge, Olga Gerchikov, Scott González, Kartikaya Gupta, Dominique Hazael-Massieux, Philippe Le Hégaret, Hayato Ito, Patrick Kettner, Patrick H. Lauke, Scott Low, Sangwhan Moon, Masayuki Nakano, Olli Pettay, Addison Phillips, Alan Pyne, Antoine Quint, Jacob Rossi, Kagami Sascha Rosylight, Doug Schepers, Ming-Chou Shih, Brenton Simpson, Dave Tapuska, Liviu Tinta, Asir Vedamuthu, Lan Wei, Jeffrey Yasskin, Navid Zolghadr.
過去にマウスおよびホイールイベントの面倒を見てくれた方々に感謝する: Gary Kacmarcik, Travis Leithead、そして 長年にわたるさまざまな 貢献者。
このモデルの第 1 版を先駆けて成立させるのを助けてくれた方々、特に次の方々に特別な感謝を表する:Charu Chandiram, Peter Freiling, Nathan Furtwangler, Thomas Olsen, Matt Rakow, Ramu Ramanathan, Justin Rogers, Jacob Rossi, Reed Townsend and Steve Wright.
この節は非規範である。
以下は、[PointerEvents3] 仕様に対する相対として、この仕様の公開版の間における、実質的および主要な編集上の変更点の参考要約である。 この仕様の Editor's Draft の完全な改訂履歴も参照。
WebIDL[Exposed=Window]
interface MouseEvent : UIEvent {
constructor(DOMString type, optional MouseEventInit eventInitDict = {});
readonly attribute long screenX;
readonly attribute long screenY;
readonly attribute long clientX;
readonly attribute long clientY;
readonly attribute long layerX;
readonly attribute long layerY;
readonly attribute boolean ctrlKey;
readonly attribute boolean shiftKey;
readonly attribute boolean altKey;
readonly attribute boolean metaKey;
readonly attribute short button;
readonly attribute unsigned short buttons;
readonly attribute EventTarget? relatedTarget;
boolean getModifierState(DOMString keyArg);
};
dictionary MouseEventInit : EventModifierInit {
long screenX = 0;
long screenY = 0;
long clientX = 0;
long clientY = 0;
short button = 0;
unsigned short buttons = 0;
EventTarget? relatedTarget = null;
};
dictionary PointerEventInit : MouseEventInit {
long pointerId = 0;
double width = 1;
double height = 1;
float pressure = 0;
float tangentialPressure = 0;
long tiltX;
long tiltY;
long twist = 0;
double altitudeAngle;
double azimuthAngle;
DOMString pointerType = "";
boolean isPrimary = false;
long persistentDeviceId = 0;
sequence<PointerEvent> coalescedEvents = [];
sequence<PointerEvent> predictedEvents = [];
};
[Exposed=Window]
interface PointerEvent : MouseEvent {
constructor(DOMString type, optional PointerEventInit eventInitDict = {});
readonly attribute long pointerId;
readonly attribute double width;
readonly attribute double height;
readonly attribute float pressure;
readonly attribute float tangentialPressure;
readonly attribute long tiltX;
readonly attribute long tiltY;
readonly attribute long twist;
readonly attribute double altitudeAngle;
readonly attribute double azimuthAngle;
readonly attribute DOMString pointerType;
readonly attribute boolean isPrimary;
readonly attribute long persistentDeviceId;
[SecureContext] sequence<PointerEvent> getCoalescedEvents();
sequence<PointerEvent> getPredictedEvents();
};
[Exposed=Window]
interface WheelEvent : MouseEvent {
constructor(DOMString type, optional WheelEventInit eventInitDict = {});
// DeltaModeCode
const unsigned long DOM_DELTA_PIXEL = 0x00;
const unsigned long DOM_DELTA_LINE = 0x01;
const unsigned long DOM_DELTA_PAGE = 0x02;
readonly attribute double deltaX;
readonly attribute double deltaY;
readonly attribute double deltaZ;
readonly attribute unsigned long deltaMode;
};
dictionary WheelEventInit : MouseEventInit {
double deltaX = 0.0;
double deltaY = 0.0;
double deltaZ = 0.0;
unsigned long deltaMode = 0;
};
partial interface Element {
undefined setPointerCapture (long pointerId);
undefined releasePointerCapture (long pointerId);
boolean hasPointerCapture (long pointerId);
};
partial interface mixin GlobalEventHandlers {
attribute EventHandler onpointerover;
attribute EventHandler onpointerenter;
attribute EventHandler onpointerdown;
attribute EventHandler onpointermove;
[SecureContext] attribute EventHandler onpointerrawupdate;
attribute EventHandler onpointerup;
attribute EventHandler onpointercancel;
attribute EventHandler onpointerout;
attribute EventHandler onpointerleave;
attribute EventHandler ongotpointercapture;
attribute EventHandler onlostpointercapture;
};
partial interface Navigator {
readonly attribute long maxTouchPoints;
};
partial interface MouseEvent {
// Deprecated in this specification
undefined initMouseEvent(DOMString typeArg,
optional boolean bubblesArg = false,
optional boolean cancelableArg = false,
optional Window? viewArg = null,
optional long detailArg = 0,
optional long screenXArg = 0,
optional long screenYArg = 0,
optional long clientXArg = 0,
optional long clientYArg = 0,
optional boolean ctrlKeyArg = false,
optional boolean altKeyArg = false,
optional boolean shiftKeyArg = false,
optional boolean metaKeyArg = false,
optional short buttonArg = 0,
optional EventTarget? relatedTargetArg = null);
};
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in: