Copyright © 2026 World Wide Web Consortium. W3C® liability, trademark and permissive document license rules apply.
Pointer Events 仕様は、マウス、タッチスクリーン、ペン/スタイラスを含むさまざまな デバイスからの入力を処理するための、ハードウェアに依存しない統一されたフレームワークを定義します。単一のイベント群(例: pointerdown、pointermove、pointerup)を提供することで、開発者はそれぞれに対して デバイス固有のロジックを書かずに、多様な入力方式をサポートできます。
この仕様は Mouse Events および Wheel Events、ならびに他のポインターデバイス型に対して Mouse Events を発火するためのマッピングも定義します。
この節は、この文書の公開時点における 状態を説明します。現在の W3C 公開文書の一覧と、この技術報告書の最新リビジョンは、 W3C 標準および草案 インデックスにあります。
この仕様は [PointerEvents3] 仕様の更新です。また、 以前は [UIEVENTS] 仕様に含まれていた Mouse and Wheel Events も含みます。
このリビジョンには新機能が含まれます:
persistentDeviceId。複数の
インタラクションにわたって入力デバイスに安定した識別子を提供します。touch-action 値: pan-left,
pan-right, pan-up, pan-down
この文書は、Pointer Events Working Group により、 勧告 トラックを用いた作業草案として公開されました。
作業草案としての公開は、 W3C およびそのメンバーによる承認を意味しません。
これは草案文書であり、いつでも他の文書によって更新、置換、または廃止される可能性があります。 この文書を進行中の作業以外のものとして引用することは不適切です。
この文書は、 W3C 特許 ポリシーの下で活動するグループによって作成されました。 W3C は、そのグループの成果物に関連して行われた 特許開示の公開一覧 を維持しています。そのページには、 特許を開示するための手順も含まれています。実際に 特許を認識しており、その特許が 必須クレーム を含むと信じる個人は、 W3C 特許ポリシー第 6 節に従って情報を開示しなければなりません。
この文書は、 2025年8月18日 W3C プロセス文書に従います。
このセクションは非規範的です。
現在、ほとんどの [HTML] コンテンツは、マウス入力とともに使用される、かつ/またはマウス入力向けに設計されています。 独自の方法で入力を処理するものは通常、[UIEVENTS] Mouse Events に合わせてコードを書きます。 しかし、今日のより新しいコンピューティングデバイスには、タッチスクリーンやペン入力を含む、他の形式の入力が組み込まれています。 これらの入力形式をそれぞれ個別に処理するためのイベント型が提案されてきました。しかし、そのアプローチでは、新しい入力型のサポートを追加する際に、 ロジックやイベント処理の不要な重複した負担が発生することがよくあります。これは、コンテンツが 1 つのデバイス型だけを念頭に置いて書かれている場合に、 互換性の問題を生じさせることがよくあります。さらに、既存のマウスベースのコンテンツとの互換性のために、ほとんどの ユーザーエージェント はすべての入力型に対して Mouse Events を発火します。 これにより、Mouse Event が実際のマウスデバイスを表すのか、それとも互換性のために別の入力型から生成されているのかが曖昧になり、 両方のデバイス型に同時に対応するコードを書くことが難しくなります。
複数の入力型に対応するコードを書くコストを削減し、また上記で説明した Mouse Events に関する曖昧さを解消するために、 この仕様は、ポインター と呼ばれる、より抽象的な入力形式を定義します。 ポインターは、マウスカーソル、ペン、タッチ(マルチタッチを含む)、またはその他のポインティング入力デバイスによって画面上に作られる任意の接触点です。 このモデルにより、ユーザーがどのようなハードウェアを持っていても適切に動作するサイトやアプリケーションを書きやすくなります。 デバイス固有の処理が望まれるシナリオのために、この仕様はイベントを生成したデバイス型を調べるためのプロパティも定義します。 主な目標は、クロスデバイスのポインター入力に対する作成を容易にする単一のイベントおよびインターフェイスの集合を提供しつつ、 拡張された体験のために必要な場合にのみデバイス固有の処理を可能にすることです。
追加の重要な目標は、マルチスレッドのユーザーエージェントが、スクリプト実行をブロックせずに、パンおよびズームのための 直接操作 アクション(たとえば、タッチスクリーン上の指やスタイラスによるもの)を処理できるようにすることです。
この仕様はさまざまなポインター入力のための統一されたイベントモデルを定義しますが、このモデルは、 キーボードやキーボードに似たインターフェイスなど、他の形式の入力を対象としていません(たとえば、 タッチスクリーンのみのデバイス上で動作し、ユーザーがフォーカス可能なコントロールや要素を順番に移動できるようにする スクリーンリーダーまたは類似の支援技術)。ユーザーエージェントがこれらのインターフェイスに応答してポインターイベントを生成することを選択する場合もありますが、 このシナリオはこの仕様では対象外です。
まず第一に、作者には、focus、blur、および
click などの高レベルイベントに応答することで、すべての形式の入力に対して同等の機能を提供することが推奨されます。
しかし、低レベルイベント(Pointer Events など)を使用する場合、作者には、すべての種類の入力がサポートされることを保証することが推奨されます。
キーボードおよびキーボードに似たインターフェイスの場合、これには明示的なキーボードイベント処理の追加が必要になる場合があります。
詳細については、キーボードアクセス可能 [WCAG22] を参照してください。
汎用的なポインター入力を処理するためのイベントは、マウス用のものによく似ています: pointerdown,
pointermove, pointerup, pointerover, pointerout などです。これにより、コンテンツを
Mouse Events から Pointer Events へ容易に移行できます。
Pointer Events は、Mouse Events に存在する通常のプロパティ(client 座標、ターゲット要素、ボタン状態を含む)をすべて提供することに加えて、
圧力、接触ジオメトリ、傾きなど、他の形式の入力のための新しいプロパティも提供します。作者は 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 の一部が作者によってどのように使用される可能性があるかを示す基本的な例です。 さらに具体的な例は、この文書の関連セクションで提供されます。
/* Pointer Events または従来の touch/mouse のいずれかにバインド */
if (window.PointerEvent) {
// Pointer Events がサポートされている場合は、pointer イベントのみをリッスンする
target.addEventListener("pointerdown", function(e) {
// 必要であれば、e.pointerType に基づいて個別のロジックを適用する
// 異なる touch/pen/mouse の挙動に対して
...
});
...
} else {
// 従来の touch/mouse イベントハンドラー
target.addEventListener('touchstart', function(e) {
// 互換性マウスイベントおよび click を防止する
e.preventDefault();
...
});
...
target.addEventListener('mousedown', ...);
...
}
// キーボード処理のための追加のイベントリスナー
...
window.addEventListener("pointerdown", detectInputType);
function detectInputType(event) {
switch(event.pointerType) {
case "mouse":
/* mouse 入力を検出 */
break;
case "pen":
/* pen/stylus 入力を検出 */
break;
case "touch":
/* touch 入力を検出 */
break;
default:
/* pointerType が空(検出できなかった)
または UA 固有のカスタム型 */
}
}
<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;
// 一意の Id が存在するか確認する。
if (uniqueId == 0) {
return;
}
// デバイスに色が割り当てられているか確認する。
if (map.has(uniqueId)) {
return;
}
// デバイスに色を割り当てる。
let newColor = getNewColor();
map.set(uniqueId, newColor);
return newColor;
}
function getNewColor() {
/* 何らかの色値を返す */
}
</script>
マウスイベントモジュールは、[HTML401] の onclick、
ondblclick、onmousedown、onmouseup、onmouseover、
onmousemove、および onmouseout 属性に由来します。このイベントモジュールは、
マウスやトラックボールなどのポインティング入力デバイスで使用するために特に設計されています。
DOM Level 2 で導入され、この仕様で変更されました。
MouseEvent インターフェイスは、マウスイベントに関連付けられた特定のコンテキスト
情報を提供します。
入れ子になった要素の場合、マウスイベントは常に最も深く入れ子になった要素をターゲットにします。
ターゲット要素の祖先は、イベントバブリングを使用して、それらの子孫要素内で発生するマウスイベントの通知を 取得できます。
MouseEvent インターフェイスのインスタンスを作成するには、任意の MouseEventInit 辞書を渡して、MouseEvent コンストラクターを使用します。
initMouseEvent を使用して MouseEvent オブジェクトを初期化する場合、
実装は、他の座標(DOM Level 0 実装またはその他の独自属性によって公開されるターゲット座標、
例: pageX など)の計算に、クライアント座標 clientX および clientY を使用できます。
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イベントが発生した、スクリーン座標系の原点に対する水平座標。
この属性の 未初期化値 は
0 で MUST です。
screenYイベントが発生した、スクリーン座標系の原点に対する垂直座標。
この属性の 未初期化値 は
0 で MUST です。
clientXイベントが発生した、そのイベントに関連付けられたビューポートに対する水平座標。
この属性の 未初期化値 は
0 で MUST です。
clientYイベントが発生した、そのイベントに関連付けられたビューポートに対する垂直座標。
この属性の 未初期化値 は
0 で MUST です。
layerX祖先要素のうち最も近いもので、 スタッキングコンテキストであるか、位置指定されているか、または スタッキングコンテキストを 描画するときに位置指定フェーズで描画される要素からの水平オフセット。
この属性の 未初期化値 は
0 で MUST です。
layerY祖先要素のうち最も近いもので、 スタッキングコンテキストであるか、位置指定されているか、または スタッキングコンテキストを 描画するときに位置指定フェーズで描画される要素からの垂直オフセット。
この属性の 未初期化値 は
0 で MUST です。
ctrlKey
KeyboardEvent の ctrlKey
属性を参照してください。
この属性の 未初期化値 は
false で MUST です。
shiftKey
KeyboardEvent の shiftKey
属性を参照してください。
この属性の 未初期化値 は
false で MUST です。
altKey
KeyboardEvent の altKey
属性を参照してください。
この属性の 未初期化値 は
false で MUST です。
metaKey
KeyboardEvent の metaKey
属性を参照してください。
この属性の 未初期化値 は
false で MUST です。
button
マウスボタンの押下または解放によって発生したマウスイベント中、button
は、どのポインティングデバイスボタンの状態が変化したかを示すために
使用される MUST です。
button 属性の値は次のとおりである
MUST です:
0 は、デバイスの主ボタン(一般に、左ボタン、または単一ボタンデバイス上の唯一のボタンで、
ユーザーインターフェイスコントロールのアクティブ化またはテキスト選択に使用されるもの)または未初期化値を示す
MUST です。
1 は、補助ボタン(一般に、マウスホイールと組み合わされることが多い中央ボタン)を示す
MUST です。
2 は、副ボタン(一般に、コンテキストメニューを表示するためによく使用される右ボタン)を示す
MUST です。
3 は、X1(戻る)ボタンを示す MUST です。
4 は、X2(進む)ボタンを示す MUST です。
一部のポインティングデバイスは、より多くのボタン状態を提供またはシミュレートします。そのようなボタンを表すために、
2 より大きい値または 0 より小さい値を使用しても
MAY です。
button
の値は、マウスボタンの押下/解放によって発生していないイベントでは
更新されません。このようなシナリオでは、値 0 を左ボタンとしてではなく、既定値として解釈するよう
注意してください。
この属性の 未初期化値 は
0 で MUST です。
buttons
任意のマウスイベント中、buttons は、
現在押されているマウスボタンの組み合わせをビットマスクとして表すために使用される
MUST です。
名前は似ていますが、buttons 属性と button 属性の値は非常に
異なります。button の値は、
mousedown / mouseup イベントハンドラー中に有効であると想定される一方、
buttons 属性は、任意の信頼された
MouseEvent オブジェクト(配送中)について、
マウスのボタンの状態を反映します。これは「現在アクティブなボタンがない」状態(0)を表せるためです。
buttons 属性の値は次のとおりである
MUST です:
0 は、現在アクティブなボタンがないことを示す
MUST です。
1 は、デバイスの主ボタン(一般に、左ボタン、または単一ボタンデバイス上の唯一のボタンで、
ユーザーインターフェイスコントロールのアクティブ化またはテキスト選択に使用されるもの)を示す
MUST です。
2 は、存在する場合、副ボタン(一般に、コンテキストメニューを表示するためによく使用される右ボタン)を示す
MUST です。
4 は、補助ボタン(一般に、マウスホイールと組み合わされることが多い中央ボタン)を示す
MUST です。
一部のポインティングデバイスは、より多くのボタンを提供またはシミュレートします。そのようなボタンを表すには、値は連続する各ボタンごとに
2 倍にされる MUST です(二進数列
8、16、32、...)。
任意のボタン値集合の合計は一意の数値であるため、コンテンツ作者はビット演算を使用して、
デバイス上の任意の数のマウスボタンについて、現在いくつのボタンが押されており、それがどのボタンであるかを判定できます。たとえば、
値 3 は左ボタンと右ボタンが現在どちらも押されていることを示し、値 5 は左ボタンと中央ボタンが
現在どちらも押されていることを示します。
この属性の 未初期化値 は
0 で MUST です。
relatedTarget
イベントの種類に応じて、UI イベントに関連する二次的な EventTarget
を識別するために使用されます。
この属性の 未初期化値 は
null で MUST です。
キー値を使用して修飾子の状態を問い合わせます。
それが修飾キーであり、その修飾子が有効化されている場合は 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
属性を、ユーザーのスクリーン上のマウスポインターの望ましい
水平方向の相対位置に初期化します。
イベントオブジェクトを指定されたマウス位置に初期化しても、ユーザーのマウス ポインターを初期化された位置へ移動してはなりません。
screenY
screenY
属性を、ユーザーのスクリーン上のマウスポインターの望ましい垂直方向の
相対位置に初期化します。
イベントオブジェクトを指定されたマウス位置に初期化しても、ユーザーのマウス ポインターを初期化された位置へ移動してはなりません。
clientX
clientX
属性を、ユーザーのブラウザーのクライアントウィンドウに対する
マウスポインターの望ましい水平位置に初期化します。
イベントオブジェクトを指定されたマウス位置に初期化しても、ユーザーのマウス ポインターを初期化された位置へ移動してはなりません。
clientY
clientY
属性を、ユーザーのブラウザーのクライアントウィンドウに対する
マウスポインターの望ましい垂直位置に初期化します。
イベントオブジェクトを指定されたマウス位置に初期化しても、ユーザーのマウス ポインターを初期化された位置へ移動してはなりません。
button
button 属性を、マウスのボタンの望ましい状態を表す数値に
初期化します。
値 0 は主マウスボタンを表すために使用され、1 は補助/中央マウスボタンを表すために使用され、2 は右マウスボタンを表すために使用されます。 2 より大きい数値も可能ですが、この文書では指定されていません。
buttons
buttons 属性を、アクティブとみなされるマウスのボタンの
1 つまたは複数を表す数値に初期化します。
buttons 属性はビットフィールドです。
マスク値 1 がビットフィールドの値に適用されたときに true であれば、主マウスボタンが押下されています。
マスク値 2 がビットフィールドの値に適用されたときに true であれば、右マウスボタンが押下されています。
マスク値 4 がビットフィールドの値に適用されたときに true であれば、補助/中央ボタンが押下されています。
JavaScript では、右ボタン(2)と中央ボタン(4)が同時に押されているかのように
buttons
属性を初期化するには、buttons 値を次のいずれかとして割り当てることができます:
{ buttons: 2 | 4 }
または:
{ buttons: 6 }
relatedTarget
relatedTarget は、
(mouseover または mouseenter
イベントの場合)マウスポインターがちょうど離れた境界を持つ要素、または
(mouseout、mouseleave、または focusout
イベントの場合)マウスポインターが入ろうとしている境界を持つ要素に
初期化されるべきです。その他のイベントでは、この値を割り当てる必要はありません(既定で null になります)。
実装は、マウスイベントを生成するときに 現在のクリック回数を維持する MUST です。これは、特定の時間内におけるポインティングデバイスボタンの連続クリック回数を示す 非負整数である MUST です。カウントがリセットされるまでの遅延は環境設定に固有です。
このセクションのアルゴリズムは、ネイティブプラットフォーム OS が次を提供することを前提とします:
これらのイベントについて、OS は次の情報を提供できます:
このセクションは改訂が必要です。
一般に、Event インターフェイス、または
Event
インターフェイスを継承するインターフェイスのコンストラクターが呼び出される場合、
[DOM] で説明されている手順に従うべきです。ただし、MouseEvent インターフェイスは、Event オブジェクトのキー
修飾子の内部状態を初期化するための追加の辞書メンバーを提供します。具体的には、getModifierState()
メソッドを使用して問い合わせられる内部状態です。このセクションは、これらの任意の修飾子状態を用いて新しい
MouseEvent オブジェクトを初期化するための
[DOM] の手順を補足します。
MouseEvent、または以下のアルゴリズムを使用してこれらのオブジェクトから派生したオブジェクトを
構築する目的では、すべての MouseEvent および派生
オブジェクトは、Modifier Keys table
[UIEvents-Key] に記述されている
キー修飾子名を使用して設定および取得できる
内部キー修飾子状態を持ちます。
次の手順は、[DOM] でイベントを構築するために定義されたアルゴリズムを補足します:
Event が MouseEvent オブジェクト、またはそれから派生するオブジェクトであり、かつ
EventModifierInit
引数がコンストラクターに提供された場合、次のサブ手順を実行します:
EventModifierInit
引数について、辞書メンバーが文字列 "modifier" で始まる場合、キー修飾子名を、
接頭辞 "modifier" を除いた辞書メンバーの名前とし、対応する値に一致する
Event オブジェクトの
内部キー
修飾子状態を設定します。
このセクションは改訂が必要です。
UA は、User Agent 全体で共有される次の値を維持しなければなりません。
マウスボタンの現在の状態を追跡する マウスボタンビットマスク。
UA は、Window で共有される次の値を維持しなければなりません。
MouseEvent を送信した最後の Element を追跡する
最後の
mouse 要素値(初期値は undefined)。
最新のマウスイベントが送信されたときの 最後の mouse 要素の祖先 Element
のスナップショットを含む
最後の
mouse DOM パス値(初期値は空)。
このセクションは改訂が必要です。
MouseEvent
は、さまざまな修飾キーの状態を追跡するために使用される次の内部フラグを持ちます:
shift フラグ、
control
フラグ、
alt フラグ、
altgraph
フラグ、
および meta フラグ。
これらのフラグは、マウスイベント時に対応する修飾キーが押されていた場合に設定されます。
このセクションは改訂が必要です。
elementFromPoint()
に pos を渡したもの(pos にある最前面の DOM 要素)を返します
inert または disabled
要素を考慮するために、これは elementsFromPoint()
を呼び出し、無効な要素を拒否するべきです。
MouseEvent を初期化するこのセクションは改訂が必要です。
event、eventType、eventTarget、bubbles、および cancelable を用いて MouseEvent を初期化するには、 次の手順を実行します:
screenX を、デスクトップの原点に対して
イベントが発生した位置の x 座標に設定します
screenY を、デスクトップの原点に対して
イベントが発生した位置の y 座標に設定します
clientX を、ビューポートの原点に対してイベントが発生した位置の x 座標に設定します
clientY を、ビューポートの原点に対してイベントが発生した位置の y 座標に設定します
button を 0 に設定します
buttons を マウスボタンビットマスクに設定します
ここにハードコードするのではなく、PointerLock のためのフックを提供するべきです。
このセクションは改訂が必要です。
MouseEvent とします
shiftKey を true に、そうでない場合は false
に設定しますctrlKey を true に、そうでない場合は false
に設定しますaltKey を true に、そうでない場合は false に設定します
metaKey を true に、そうでない場合は false
に設定しますこのセクションは改訂が必要です。
MouseEvent 型を含む
DOMString としますEventTarget とします
MouseEvent を使用して イベントを作成する結果としますこのセクションは改訂が必要です。
MouseEvent 型を含む
DOMString としますEventTarget とします
MouseEvent を使用して イベントを作成する結果としますこのセクションは改訂が必要です。
MouseEvent とします
TODO。
type が [
mousedown, mouseup ] のいずれかである場合、
button を、
mbutton を用いて MouseEvent button
属性を計算する結果に設定します
このセクションは改訂が必要です。
その他のボタンは 0x08 から追加できます。
このセクションは改訂が必要です。
mousedown と mouseup の間には、他のマウスイベントが発生することがあります。
このセクションは改訂が必要です。
プラットフォームは、クリックを生成する mouseup に対して ネイティブ mouse up を処理する の直後にこれを呼び出すべきです。
このセクションは改訂が必要です。
EventTarget とします
screenX
が整数値でない場合、それを丸めます。screenY
が整数値でない場合、それを丸めます。PointerEvents と丸められた座標を使用するブラウザーに関する情報については、 pointerevents/100 を参照してください。
任意の「既定の動作」は、ターゲットの activation behavior アルゴリズムをトリガーすることにより、配送中に処理されます。そのため、ここでそれを処理する必要はありません。 ただし、既存の仕様が disabled/css-pointer-events/inert/... を処理していることを確認する必要があります。
HTMLelement.click() を処理するには、native =
null および target = HTMLelement でこのアルゴリズムを呼び出します。
キーボード起因のクリックを処理するには、native = null および target = 現在フォーカスされている要素でこのアルゴリズムを呼び出します。
このセクションは改訂が必要です。
これは、double click を生成するマウスクリックについて、handle native mouse click の直後に呼び出されるべきです。
screenX が整数値でない場合、
それを丸めます。screenY が整数値でない場合、
それを丸めます。このセクションは改訂が必要です。
このアルゴリズムは、PointerEvents の dispatch について仮定を置いています。なぜなら、それらは 現在明示的に指定されていないためです。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 はこの イベントを要素と shadow root の両方で発火します。
この仕様で定義される特定のマウスイベントは、互いに相対的に定められた順序で発生しなければなりません 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 つの要素が、 Web ページ上で同じ寸法および絶対位置を持っています。要素 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 イベントの間で click または dblclick
イベントをなお発火することが許容される mousemove
イベントの遅延時間、程度、距離、および数は、
実装、デバイス、およびプラットフォームに固有です。この許容範囲は、これらのユーザーがポインティングデバイスを操作する際に、
手の震えなどの身体障害を持つユーザーを支援できます。
各実装は適切な ヒステリシス
許容範囲を決定しますが、一般に、関連する mousedown
および
mouseup イベントのイベントターゲットが同じ要素であり、その間に
mouseout または
mouseleave イベントが介在しない場合は、click および dblclick
イベントを発火すべきです SHOULD。また、関連する mousedown
および mouseup イベントターゲットが異なる場合は、
最も近い共通の包含祖先上で click および
dblclick イベントを発火すべきです SHOULD。
mousedown イベントが HTML 文書の body
要素をターゲットとし、対応する mouseup イベントが
文書要素をターゲットとしていた場合、
click イベントは
文書
要素へ配送されます。これはそれが最も近い共通の包含
祖先であるためです。
ターゲット(例: ターゲット要素)がマウスイベントシーケンス中に DOM から削除された場合、そのシーケンスの残りのイベントはその要素上で発火されてはなりません MUST NOT。
mousedown イベントの結果としてターゲット要素が DOM から削除された場合、
その要素に対するイベントは、
mouseup、click、または dblclick、およびいかなる既定の
アクティベーションイベントについても配送されません。ただし、mouseup イベントは、初期ターゲット要素の削除後に
マウスに露出する要素上でなお配送されます。同様に、mouseup イベントの配送中に
ターゲット要素が DOM から削除された場合、
click およびそれ以降のイベントは配送されません。
| 型 | auxclick
|
|---|---|
| インターフェイス | PointerEvent
|
| 同期 / 非同期 | 同期 |
| バブル | はい |
| 信頼済みターゲット | Element |
| キャンセル可能 | はい |
| 合成 | はい |
| 既定の動作 | さまざま |
| コンテキスト (信頼済みイベント) |
|
auxclick イベント型は、ユーザーが
非主ポインターボタンを押下して解放したとき、またはそのようなアクションをシミュレートする方法で
ポインターをアクティブ化したときに、ポインターが示す 最上位
イベントターゲット上で配送されなければなりません MUST。
マウスボタンの作動方法は、ポインターデバイスおよび
環境設定に依存します。たとえば、画面上の
位置、またはポインティングデバイスボタンの押下と解放の間の遅延に依存してもよい
MAY です。
auxclick イベントは、非主ポインター
ボタンに対してのみ発火されるべきです(すなわち、button 値が 0 でなく、
buttons 値が
1 より大きい場合)。主ボタン
(標準的なマウスの左ボタンなど)は
auxclick イベントを発火してはなりません MUST
NOT。
主ボタンに関連付けられた対応するイベントについては、click を参照してください。
auxclick イベントの前には、他のノード型
(例: テキストノード)間の変化を無視して、同じ要素上の mousedown および
mouseup イベントが先行してもよい
MAY です。環境設定によっては、ポインティングデバイスボタンの押下と
解放の間にイベント型 mouseover、
mousemove、および mouseout の 1 つ以上が発生した場合でも、
auxclick イベントが配送されてもよい
MAY です。
auxclick イベント型の 既定の動作は、
イベントの ターゲット、
および button または buttons 属性の値に基づいて異なります。
auxclick イベント型の典型的な
既定の動作は次のとおりです:
myLink.addEventListener("auxclick", function(e) {
if (e.button === 1) {
// これは、たとえばリンクを中央クリックしたときに
// 新しいタブを開く既定の挙動を防止します。
e.preventDefault();
// アプリに合う方法で、リンクまたは非リンクボタンを新しいタブで開く処理など、
// 中央ボタンクリックを処理するための別の処理を行います。
// タブストリップでタブを閉じるなど、click アクションで行うべき
// その他のアクションもここで行えます。
}
});
右ボタンの場合、auxclick イベントは、
すべての contextmenu イベントの後に配送されます。
一部のユーザーエージェントはコンテキストメニューが表示されている間、すべての入力
イベントを飲み込むため、そのようなシナリオでは auxclick がアプリケーションで
利用できない場合があることに注意してください。
さらに明確にするために、例 7 を参照してください。
myDiv.addEventListener("contextmenu", function(e) {
// この呼び出しにより、コンテキストメニューが表示されて
// ページがイベントを受信する妨げにならないようにします。
e.preventDefault();
});
myDiv.addEventListener("auxclick", function(e) {
if (e.button === 2) {
// アプリ内でカスタマイズされたコンテキストメニューを開くなど、
// 右ボタンクリックを処理するための別の処理を行います。
}
});
| 型 | click
|
|---|---|
| インターフェイス | PointerEvent
|
| 同期 / 非同期 | 同期 |
| バブル | はい |
| 信頼済みターゲット | Element |
| キャンセル可能 | はい |
| 合成 | はい |
| 既定の動作 | さまざま |
| コンテキスト (信頼済みイベント) |
|
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 イベントをなおトリガーします(それが click の通常の時間的
ヒステリシス内に収まる場合)。
ユーザーエージェントによって生成される
mouse events はテキストノード上では配送されないことに注意してください。
ポインターデバイスに関連付けられることに加えて、
click イベント型は、要素の
アクティベーションの一部として配送されなければなりません MUST。
最大限のアクセシビリティのために、コンテンツ作者には、カスタム
コントロールのアクティベーション動作を定義する際に、
click イベント型を使用することが推奨されます。
mousedown や mouseup など、よりデバイス固有の
他のポインティングデバイスイベント型ではなく、これを使用してください。
click イベント型は、ポインター
デバイス(例: マウス)に起源がありますが、その後の実装拡張により
その関連付けを超えて拡張されており、要素のアクティベーションのための
デバイス非依存のイベント型とみなすことができます。
click イベント型の 既定の動作は、
イベントの ターゲット、
および button または buttons 属性の値に基づいて異なります。
click イベント型の典型的な
既定の動作は次のとおりです:
| 型 | dblclick |
|---|---|
| インターフェイス | MouseEvent |
| 同期 / 非同期 | 同期 |
| バブル | はい |
| 信頼済みターゲット | Element |
| キャンセル可能 | はい |
| 合成 | はい |
| 既定の動作 | なし |
| コンテキスト (信頼済みイベント) |
|
ユーザーエージェントは、
ポインティングデバイスの主ボタンが要素上で 2 回クリックされたときに、このイベントを配送しなければなりません
MUST。ダブルクリックの
定義は環境設定に依存します。ただし、イベントターゲットは
mousedown、mouseup、および dblclick の間で同じでなければなりません
MUST。click と double click が同時に発生する場合、このイベント
型はイベント型 click の後に配送されなければならず
MUST、そうでない場合はイベント型
mouseup の後に配送されなければなりません。
click イベントと同様に、dblclick イベントは
主ポインターボタンに対してのみ発火されるべきです。副ボタンは
dblclick イベントを発火してはなりません MUST
NOT。
click イベント型と同様に、
dblclick イベント型の 既定の動作は、イベントの ターゲット、および
button
または buttons 属性の値に基づいて異なります。
dblclick イベント型の典型的な
既定の動作は、
click イベント型のものと一致します。
| 型 | mousedown
|
|---|---|
| インターフェイス | MouseEvent |
| 同期 / 非同期 | 同期 |
| バブル | はい |
| 信頼済みターゲット | Element |
| キャンセル可能 | はい |
| 合成 | はい |
| 既定の動作 | さまざま: ドラッグ/ドロップ操作を開始する、テキスト選択を開始する、スクロール/パン インタラクションを開始する(サポートされている場合は中央マウスボタンと組み合わせて) |
| コンテキスト (信頼済みイベント) |
|
| 型 | mouseenter
|
|---|---|
| インターフェイス | MouseEvent |
| 同期 / 非同期 | 同期 |
| バブル | いいえ |
| 信頼済みターゲット | Element |
| キャンセル可能 | いいえ |
| 合成 | いいえ |
| 既定の動作 | なし |
| コンテキスト (信頼済みイベント) |
|
mouseover に似ていますが、
バブルしない点、およびポインターデバイスが要素からその子孫要素の
1 つの境界上へ移動したときには配送されてはならない
MUST NOT 点が異なります。
このイベント型と CSS
:hover 疑似クラス [CSS2]
には類似点があります。
mouseleave イベント型も参照してください。
| 型 | mouseleave
|
|---|---|
| インターフェイス | MouseEvent |
| 同期 / 非同期 | 同期 |
| バブル | いいえ |
| 信頼済みターゲット | Element |
| キャンセル可能 | いいえ |
| 合成 | いいえ |
| 既定の動作 | なし |
| コンテキスト (信頼済みイベント) |
|
mouseout に似ていますが、
バブルしない点、およびポインティングデバイスが要素の境界と
そのすべての子の境界を離れるまで配送されてはならない
MUST NOT 点が異なります。
このイベント型と CSS
:hover 疑似クラス [CSS2]
には類似点があります。
mouseenter イベント型も参照してください。
| 型 | mousemove
|
|---|---|
| インターフェイス | MouseEvent |
| 同期 / 非同期 | 同期 |
| バブル | はい |
| 信頼済みターゲット | Element |
| キャンセル可能 | はい |
| 合成 | はい |
| 既定の動作 | なし |
| コンテキスト (信頼済みイベント) |
|
mousemove
イベントが発火されるべきです
SHOULD。実装には、
応答性とパフォーマンスのバランスを取るために最適な頻度を決定することが推奨されます。
ブラウザーなど一部の実装環境では、ユーザーがドラッグ操作を開始し
(例: マウスボタンが押されている)、ポインティング
デバイスがユーザーエージェントの境界を離れた場合でも、
mousemove イベントが発火し続けることがあります。
このイベントは以前 DOM Level 2 Events でキャンセル不能と指定されていましたが、 ユーザーエージェント間の既存の相互運用性を反映するため変更されました。
| 型 | mouseout
|
|---|---|
| インターフェイス | MouseEvent |
| 同期 / 非同期 | 同期 |
| バブル | はい |
| 信頼済みターゲット | Element |
| キャンセル可能 | はい |
| 合成 | はい |
| 既定の動作 | なし |
| コンテキスト (信頼済みイベント) |
|
mouseleave に似ていますが、
バブルする点、およびポインターデバイスが要素からその子孫要素の
1 つの境界上へ移動したときに配送されなければならない
MUST 点が異なります。
mouseover イベント型も参照してください。
| 型 | mouseover
|
|---|---|
| インターフェイス | MouseEvent |
| 同期 / 非同期 | 同期 |
| バブル | はい |
| 信頼済みターゲット | Element |
| キャンセル可能 | はい |
| 合成 | はい |
| 既定の動作 | なし |
| コンテキスト (信頼済みイベント) |
|
mouseenter に似ていますが、
バブルする点、およびポインターデバイスが、同じ
イベントリスナー
インスタンスに対する
ターゲットである祖先要素を持つ要素の
境界上へ移動したときに配送されなければならない
MUST 点が異なります。
mouseout イベント型も参照してください。
| 型 | mouseup
|
|---|---|
| インターフェイス | MouseEvent |
| 同期 / 非同期 | 同期 |
| バブル | はい |
| 信頼済みターゲット | Element |
| キャンセル可能 | はい |
| 合成 | はい |
| 既定の動作 | なし |
| コンテキスト (信頼済みイベント) |
|
ブラウザーなど一部の実装環境では、
たとえばユーザーがマウスボタンを押した状態でドラッグ操作を開始した場合、
ポインティングデバイスがユーザーエージェントの境界を離れていても、
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イベントを発生させたポインターの一意な識別子。ユーザーエージェントは、主マウス
ポインターのために、汎用の pointerId
値
0 または 1 を予約してもよい MAY。pointerId
値
-1 は、ポインティングデバイス以外のものによって生成されたイベントを
示すために予約され、使用されなければならない MUST です。
その他のポインターについては、ユーザーエージェントは pointerId
値の割り当て方法について、さまざまな戦略や手法を自由に実装できます。ただし、
トップレベル
閲覧コンテキスト([HTML] によって定義されるもの)内のすべての
アクティブポインターは一意でなければならず、その識別子は
他のどのトップレベル閲覧コンテキストからも影響を受けてはなりません
MUST NOT(すなわち、あるトップレベル閲覧コンテキストは、
ポインターが閲覧コンテキストの外へ移動して別のトップレベル閲覧コンテキストへ入ったときに、
そのポインターの pointerId
が同じになると
仮定することはできません)。
ユーザーエージェントは、
以前のアクティブポインターから廃止された pointerId 値を再利用してもよく
MAY、または特定のポインティングデバイスに対して常に同じ
pointerId
を再利用してもよい MAY です(たとえば、複数ユーザー共同アプリケーションで
特定ユーザーの特定の pen/stylus 入力を一意に識別するため)。ただし、後者の場合、
異なるページまたはドメイン間でフィンガープリンティングや追跡が行われる可能性を最小化するために、
pointerId
は、
ページ / セッションの存続期間中に限り、その特定のポインティングデバイスに明示的に関連付けられなければならず
MUST、その特定のポインティングデバイスが次に新しいセッションで再び使用されるときには、
新しいランダム化された pointerId
が選択されなければなりません
MUST。
pointerId 選択
アルゴリズムは実装固有です。作者は、その値が、他のすべてのアクティブポインターと一意に区別される
ポインターの識別子であること以外の特定の意味を伝えると仮定することはできません。たとえば、
ユーザーエージェントは、アクティブになった順に、任意のアクティブポインターへ
0 から始まる数値を単純に割り当ててもよいですが、これらの値が単調増加することは
保証されません。特定のポインティングデバイスに対して同じ pointerId
を再利用するかどうかは
個々の実装に委ねられているため、作者にはそれに依存しないこと、代わりに
persistentDeviceId
を参照することが強く推奨されます。
widthポインターの 接触ジオメトリの幅(X 軸上の大きさ)を、
CSS ピクセル単位で表します([CSS21]
を参照)。
この値は、特定のポインターについて各イベントで更新されてもよい MAY です。通常は接触ジオメトリを持たない入力(従来のマウスなど)、
および入力の実際のジオメトリがハードウェアによって検出されない場合、ユーザーエージェントは
既定値 1 を返さなければなりません MUST。
heightポインターの 接触ジオメトリの高さ(Y 軸上の大きさ)を、
CSS ピクセル単位で表します([CSS21]
を参照)。
この値は、特定のポインターについて各イベントで更新されてもよい MAY です。通常は接触ジオメトリを持たない入力(従来のマウスなど)、
および入力の実際のジオメトリがハードウェアによって検出されない場合、ユーザーエージェントは
既定値 1 を返さなければなりません MUST。
pressure[0,1] の範囲におけるポインター入力の正規化された圧力であり、
0 および 1 は、それぞれハードウェアが検出可能な最小圧力および最大圧力を表します。
圧力をサポートしないハードウェアおよびプラットフォームでは、
アクティブボタン状態にあるときの値は
0.5 でなければならず MUST、
それ以外の場合は 0 でなければなりません。
tangentialPressureポインター入力の正規化された接線方向圧力(バレル圧力とも呼ばれる)であり、通常は追加の
制御(例: エアブラシスタイラス上のフィンガーホイール)によって設定されます。範囲は
[-1,1] で、0 は制御の中立位置です。一部のハードウェアは
[0,1] の範囲の正の値のみをサポートする場合があることに注意してください。
接線方向圧力をサポートしないハードウェアおよびプラットフォームでは、値は 0 でなければなりません
MUST。
tiltXY-Z 平面と、トランスデューサー(例: pen/stylus)軸および Y 軸の両方を含む平面との間の
平面角(度単位、範囲 [-90,90])。正の
tiltX は、X 値が増加する方向、すなわち右向きです。
tiltX は tiltY とともに使用して、デジタイザーに対する
トランスデューサーの法線からの傾きを表すことができます。傾きまたは角度を報告しないハードウェアおよび
プラットフォームでは、値は 0 でなければなりません MUST。
tiltX。
tiltYX-Z 平面と、トランスデューサー(例: pen/stylus)軸および X 軸の両方を含む平面との間の
平面角(度単位、範囲 [-90,90])。正の
tiltY は、Y 値が増加する方向、すなわちユーザー側です。
tiltY は tiltX とともに使用して、デジタイザーに対する
トランスデューサーの法線からの傾きを表すことができます。傾きまたは角度を報告しないハードウェアおよび
プラットフォームでは、値は 0 でなければなりません MUST。
tiltY。
twistトランスデューサー(例: pen/stylus)の自身の主軸まわりの時計回りの回転(度単位、範囲
[0,359])。twist を報告しないハードウェアおよびプラットフォームでは、
値は 0 でなければなりません MUST。
altitudeAngleトランスデューサー(例: pen/stylus)の高度角(ラジアン単位、範囲
[0,π/2])— ここで 0 は表面(X-Y 平面)に平行であり、
π/2 は表面に垂直です。傾きまたは角度を報告しないハードウェアおよびプラットフォームでは、
値は π/2 でなければなりません MUST。
altitudeAngle の既定値は π/2 であり、
トランスデューサーを表面に垂直なものとして位置付けます。
これは Touch Events - Level
2 仕様における
altitudeAngle プロパティの定義とは異なります。そちらの既定値は
0 です。
π/4(X-Y
平面から 45 度)の altitudeAngle の例。azimuthAngleトランスデューサー(例: pen/stylus)の方位角(ラジアン単位、範囲
[0, 2π])— ここで 0 は、X-Y 平面上でキャップが X 値の増加方向
(真上から見た場合の「3 時」方向)を向いているトランスデューサーを表し、時計回りに進むにつれて
値が増加します(「6 時」で π/2、「9 時」で π、
「12 時」で 3π/2)。トランスデューサーが表面に完全に垂直である場合
(altitudeAngle が π/2)、値は 0 でなければなりません
MUST。傾きまたは角度を報告しないハードウェアおよびプラットフォームでは、
値は 0 でなければなりません MUST。
π/6(「4 時」)の
azimuthAngle の例。pointerTypeイベントを発生させたデバイス型(mouse、pen、touch など)を示します。ユーザーエージェントが
mouse、pen/stylus、または touch 入力デバイスについて ポインターイベントを発火する場合、
pointerType の値は次の表に従わなければなりません MUST:
| ポインターデバイス型 | pointerType 値 |
|---|---|
| Mouse | mouse |
| Pen / stylus | pen |
| Touch contact | touch |
デバイス型をユーザーエージェントが検出できない場合、値は空文字列でなければなりません
MUST。ユーザーエージェントが上記に列挙されていないポインターデバイス型をサポートする場合、
pointerType の値は、異なるデバイス型の名前の衝突を避けるため、
ベンダー接頭辞を付けるべきです SHOULD。将来の仕様は、
他のデバイス型について追加の規範的な値を提供してもよい MAY です。
pointerType をどのように使用できるかの基本的なデモについては
例 2 を参照してください。また、開発者は、
ユーザーエージェントが独自のカスタム pointerType 値を実装している場合や、
pointerType が単に空文字列である状況をカバーするために、
何らかの既定処理を含めるべきであることにも注意してください。
isPrimaryそのポインターがこのポインター型の プライマリポインターを表すかどうかを示します。
persistentDeviceIdポインティングデバイスの一意な識別子。ハードウェアが複数のポインターをサポートする場合、
ポインティングデバイスから生成される pointer events は、そのポインターがセッション中に一意に識別可能である場合に限り、
persistentDeviceId を取得しなければなりません MUST。
ポインターが一意に識別可能である場合、そのポインティングデバイスに割り当てられた
persistentDeviceId は、セッションの残りの期間一定のままです。
persistentDeviceId 値 0 は、生成元デバイスを識別できなかったイベントを示すために
予約され、使用されなければなりません MUST。pointerId と同様に、異なるページまたはドメイン間で
フィンガープリンティングや追跡が行われる可能性を最小化するために、
persistentDeviceId は、ページ / セッションの存続期間中に限り、その特定のポインティングデバイスに
明示的に関連付けられなければならず MUST、
その特定のポインティングデバイスが次に新しいセッションで再び使用されるときには、
新しいランダム化された persistentDeviceId が選択されなければなりません
MUST。
persistentDeviceId がポインティングデバイスからのすべての pointer events で利用可能であることは
保証されません。たとえば、デバイスが pointerdown に
persistentDeviceId を持たせるのに間に合うように、そのハードウェア ID を
デジタイザーへ報告しない場合があります。そのような場合、persistentDeviceId は
初めは 0 で、その後有効な値へ変化することがあります。
getCoalescedEvents()合成イベントのリストを返すメソッド。
getPredictedEvents()予測イベントのリストを返すメソッド。
PointerEventInit 辞書は、PointerEvent インターフェイスのコンストラクターによって、
信頼されていない(合成された)ポインターイベントを構築するための仕組みを提供するために使用されます。これは
[UIEVENTS] で定義される
MouseEventInit 辞書を継承します。
信頼されていないポインターイベントを発火する方法を示すサンプルコードについては、
例を参照してください。
PointerEvent の
イベント構築手順は、
PointerEventInit の
coalescedEvents を
合成イベントリストへクローンし、
PointerEventInit の
predictedEvents を
予測イベントリストへクローンします。
PointerEvent インターフェイスは、UI
Events で定義される MouseEvent を継承します。
また、CSSOM View Module で提案されている拡張にも
注意してください。この拡張は、小数座標を許可するために、さまざまな座標プロパティを
long から double に変更します。この提案された拡張を
PointerEvent にはすでに実装しているが、
通常の MouseEvent には実装していないユーザーエージェントについては、
click,
auxclick, および contextmenu イベントに関して追加の要件があります。
マルチポインター(例: マルチタッチ)のシナリオでは、isPrimary プロパティは、各ポインター型について
アクティブポインターの集合の中から
マスターポインターを識別するために使用されます。
pointerType につき 1 つ)がプライマリとみなされます。たとえば、touch 接触と
mouse カーソルが同時に移動した場合、その両方がプライマリとみなされるポインターを生成します。
isPrimary の値を false とする
pointer events を発火してもよい MAY です。e という名前の ポインターイベントを発火するとは、
イベントを発火することを意味します。
そのイベントは e という名前で、
属性が PointerEvent Interface および
属性と既定の動作で定義されるように設定された
PointerEvent を使用します。
イベントが gotpointercapture、lostpointercapture、click、
auxclick、または contextmenu イベントでない場合、この
PointerEvent について 保留中のポインターキャプチャを処理する手順を実行します。
イベントが発火される ターゲットを決定する方法は次のとおりです:
targetDocument を、ターゲットの ノード文書 [DOM] とします。
イベントが pointerdown、pointermove、または pointerup の場合、イベントの
pointerId について
アクティブ文書を
targetDocument に設定します。
イベントが pointerdown であり、関連付けられた
デバイスが直接操作デバイスであり、ターゲットが Element である場合、
暗黙的ポインターキャプチャで説明されるように、この
pointerId について、ターゲット要素へ
ポインターキャプチャを設定する。
このイベントを発火する前に、ユーザーエージェントは、
イベント順序を保証する目的で、そのポインティングデバイスが
previousTarget からターゲット上へ移動したかのように、ターゲットを扱うべきです
SHOULD [UIEVENTS]。
needsOverEvent フラグが設定されている場合、ターゲット要素が同じであっても
pointerover イベントが必要です。
決定されたターゲットにイベントを発火します。
決定されたターゲットを、指定されたポインターの previousTarget として保存し、
needsOverEvent フラグを false にリセットします。
任意の時点で previousTarget がもはや 接続済み [DOM] でなくなる場合、
previousTarget を、previousTarget へイベントを dispatch することに対応するイベントパスに従う、
最も近いまだ 接続済み [DOM]
の親へ更新し、
needsOverEvent フラグを true に設定します。
この仕様で定義されるイベント型の bubbles および cancelable プロパティと
既定の動作は、次の表に示されています。これらの各イベント型の詳細は
Pointer Event 型で提供されます。
| イベント型 | バブル | キャンセル可能 | 既定の動作 |
|---|---|---|---|
pointerover
|
はい | はい | なし |
pointerenter |
いいえ | いいえ | なし |
pointerdown
|
はい | はい | さまざま: ポインターがプライマリである場合、
mousedown イベントのすべての既定の動作
このイベントをキャンセルすると、後続の 互換性マウスイベントの発火も防止されます。 |
pointermove
|
はい | はい | さまざま: ポインターがプライマリである場合、mousemove のすべての既定の動作
|
pointerrawupdate |
はい | いいえ | なし |
pointerup |
はい | はい | さまざま: ポインターがプライマリである場合、mouseup のすべての既定の動作
|
pointercancel |
はい | いいえ | なし |
pointerout
|
はい | はい | なし |
pointerleave |
いいえ | いいえ | なし |
gotpointercapture |
はい | いいえ | なし |
lostpointercapture |
はい | いいえ | なし |
ビューポート操作(パンおよびズーム)— 一般には 直接操作インタラクションの結果 — は、
意図的に pointer events の既定の動作ではありません。つまり、これらの挙動(例: タッチスクリーン上で指を動かした結果として
ページをパンすること)は、pointer event をキャンセルしても抑制できません。作者は代わりに、
文書の領域について touch-action を使用し、直接操作の挙動を宣言する必要があります。
イベントのキャンセルへのこの依存関係を取り除くことで、ユーザーエージェントによるパフォーマンス最適化が容易になります。
pointerenter および pointerleave イベントについては、
composed
[DOM] 属性は
false であるべきです SHOULD。上記の表にある他のすべての
pointer events については、この属性は true であるべきです SHOULD。
上記の表にあるすべての pointer events について、detail [UIEVENTS] 属性は 0 であるべきです SHOULD。
fromElement および toElement を公開しています。これらのユーザーエージェントには、
作者を標準化された代替(target および relatedTarget)の使用へ移行させるため、
PointerEvents におけるそれらの(継承された)属性の値を null に設定することを推奨します。
MouseEvent の relatedTarget と同様に、
relatedTarget は、(pointerover または
pointerenter イベントの場合)ポインターが直前にその境界から離れた要素、
または(pointerout または pointerleave の場合)ポインターがその境界へ
入ろうとしている要素に初期化されるべきです。他の pointer events については、この値は既定で null になります。
要素がポインターキャプチャを受け取ると、そのポインターについて以後のすべてのイベントは、
キャプチャしている要素の境界内にあるものとみなされることに注意してください。
gotpointercapture
および lostpointercapture イベントについては、
上記の表で定義されたものを除くすべての属性は、ユーザーエージェントに
保留中のポインターキャプチャを処理する手順を実行させ、
gotpointercapture
および lostpointercapture イベントを発火させた Pointer
Event と
同じであるべきです。
ユーザーエージェントは、
ポインターキャプチャを暗黙的に解放するとき、
および gotpointercapture
または lostpointercapture ではない Pointer
Events を発火するときに、
次の手順を実行しなければなりません MUST。
lostpointercapture という名前の pointer
event を発火します。
gotpointercapture という名前の pointer
event を発火します。
click,
auxclick, および contextmenu イベントのセクションで定義されるように、
lostpointercapture イベントが
dispatch された後であっても、
対応する click、auxclick、または contextmenu イベントが存在する場合は、
なおキャプチャしているターゲットへ dispatch されます。
ユーザーエージェントは、
Web ページが特定の pointerId を持つ pointer events を
受信し続ける可能性が低いことを検出したとき、ポインターイベントストリームを抑制する必要があります
MUST。次のいずれかのシナリオはこの条件を満たします(追加のシナリオがあってもよい
MAY):
touch-action CSS
プロパティのセクションを参照してください。
ユーザーエージェントが ポインターイベントストリームを抑制することができる MAY その他のシナリオには、次のものが含まれます:
これらのシナリオを検出する方法は、この仕様の範囲外です。
ユーザーエージェントは、 ポインターイベントストリームを抑制するために、 次の手順を実行しなければなりません MUST:
pointercancel
イベントを発火する。pointerout イベントを発火する。
pointerleave イベントを発火する。
スクリーン表面に対して相対的に移動した、またはいずれかのプロパティに何らかの変化があったポインティングデバイスは、
Pointer Event 型で定義されるさまざまなイベントを発火します。
静止しているポインティングデバイス(スクリーン表面に対して相対的に移動せず、いかなるプロパティにも変化がなかったもの)については、
ユーザーエージェントは、ポインターの
ヒットテストターゲットに影響する
レイアウト変更の後で、特定の境界イベントを発火しなければなりません MUST。
詳細については pointerover、pointerenter、pointerout および pointerleave を参照してください。
ユーザーエージェントは、
パフォーマンス上の理由(例: 境界イベントリスナーによって引き起こされる過剰なヒットテストやレイアウト変更を避けるため)により、
これらの境界イベントの発火を遅延させてもよい MAY です。
pointermove イベントを決して発火しません。
Pointer Events には、X-Y 平面に対するトランスデューサーの向きを表現するための、相補的な 2 つの属性集合が含まれます:
tiltX / tiltY(元の Pointer Events 仕様で導入)と、
azimuthAngle / altitudeAngle
(Touch Events - Level 2
仕様から採用)。
具体的なハードウェアおよびプラットフォームによっては、ユーザーエージェントはスクリーン平面に対する
トランスデューサーの向きについて、おそらく 1 つの値集合だけを受け取ります — tiltX /
tiltY または altitudeAngle / azimuthAngle のいずれかです。
ユーザーエージェントは、これらの値を変換するために次のアルゴリズムを使用しなければなりません
MUST。
ユーザーエージェントが azimuthAngle / altitudeAngle から
tiltX / tiltY を計算するときは、最終的な整数値を
Math.round [ECMASCRIPT] の規則を使用して丸めるべきです
SHOULD。
/* tiltX/tiltY と altitudeAngle/azimuthAngle の間の変換 */
function spherical2tilt(altitudeAngle, azimuthAngle) {
const radToDeg = 180/Math.PI;
let tiltXrad = 0;
let tiltYrad = 0;
if (altitudeAngle == 0) {
// pen は X-Y 平面内にある
if (azimuthAngle == 0 || azimuthAngle == 2*Math.PI) {
// pen は正の X 軸上にある
tiltXrad = Math.PI/2;
}
if (azimuthAngle == Math.PI/2) {
// pen は正の Y 軸上にある
tiltYrad = Math.PI/2;
}
if (azimuthAngle == Math.PI) {
// pen は負の X 軸上にある
tiltXrad = -Math.PI/2;
}
if (azimuthAngle == 3*Math.PI/2) {
// pen は負の Y 軸上にある
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;
// 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) {
// azimuth を計算するための情報が不足している
azimuthAngle = 0;
} else {
// 非境界ケース: tiltX も tiltY も 0 または +-90 と等しくない
const tanX = Math.tan(tiltXrad);
const tanY = Math.tan(tiltYrad);
azimuthAngle = Math.atan2(tanY, tanX);
if (azimuthAngle < 0) {
azimuthAngle += 2*Math.PI;
}
}
// 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 {
// 非境界ケース: tiltX も tiltY も 0 または +-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 としますTODO。
target としますMouseEvent としますTODO。
target としますMouseEvent としますTODO。
target としますMouseEvent としますTODO。
target としますMouseEvent とします
これは pointermove と pointerrawupdate を送信できますか? それとも 2 つのメソッドが必要ですか?
pointermove イベントがどのように合成されるかを適切に定義するには何が必要ですか?
TODO。
target としますMouseEvent とします
mousedown イベントとは異なり、pointerdown
イベントは、複数のボタンが押されてもネストされません。
MouseEvent は、
フィールドを PointerEvent へコピーできるように渡されます。
TODO。
target としますMouseEvent とします
target としますMouseEvent とします
mouseup イベントとは異なり、pointerup イベントは、複数の
ボタンが押されてもネストされません。MouseEvent は、
フィールドを PointerEvent へコピーできるように渡されます。
TODO。
target としますこの仕様で定義されるイベント型を以下に示します。
プライマリポインターの場合、これらのイベントは(gotpointercapture および lostpointercapture を除き)、互換性マウスイベントも発火する場合があります。
ユーザーエージェントは、
次のいずれかが発生したとき、ポインターイベントを発火することにより、
pointerover という名前のイベントを発火しなければなりません
MUST:
pointerdown イベントを発火する前
(pointerdown を参照)。
ユーザーエージェントは、
次のいずれかが発生したとき、ポインターイベントを発火することにより、
pointerenter という名前のイベントを発火しなければなりません
MUST:
pointerdown イベントを発火する前
(pointerdown を参照)。
mouseenter イベント、
および [CSS21]
で
説明される CSS :hover 疑似クラスの間には類似点があります。
pointerleave イベントも参照してください。
ユーザーエージェントは、
ポインターがアクティブボタン状態に入ったとき、
ポインターイベントを発火することにより、
pointerdown という名前のイベントを発火しなければなりません
MUST。mouse の場合、これはデバイスがボタン未押下状態から
少なくとも 1 つのボタン押下状態へ遷移したときです。touch の場合、これはデジタイザーに物理的な接触が行われたときです。
pen の場合、これはボタンが押されていない状態で pen がデジタイザーに物理的に接触したとき、または
ホバー中にボタン未押下状態から少なくとも 1 つのボタン押下状態へ遷移したときです。
pointerdown および pointerup が、mousedown および
mouseup と同じすべての状況で発火されるわけではないことを意味します。
詳細については コード化ボタンを参照してください。
ホバーをサポートしないデバイスでの入力については、
ユーザーエージェントは、
pointerdown イベントを
dispatch する前に、ポインターイベントを発火することにより、
pointerover という名前のイベントに続けて、
pointerenter という名前の
ポインターイベントも発火しなければなりません MUST。
pointerdown
イベントをキャンセルすることで
(isPrimary プロパティが true の場合)、特定の
互換性マウスイベントの発火を防止できます。
これはポインター上の PREVENT MOUSE EVENT フラグを設定します。ただし、これによって
mouseover、mouseenter、mouseout、または
mouseleave イベントの発火が防止されるわけではないことに注意してください。
ユーザーエージェントは、
ポインターが、pointerdown または pointerup イベントを発火しないプロパティを
変更したとき、ポインターイベントを発火することにより、
pointermove という名前のイベントを発火しなければなりません
MUST。これには、座標、圧力、接線方向圧力、
傾き、twist、接触ジオメトリ(width および height)、または
コード化ボタンの任意の変更が含まれます。
ユーザーエージェントは、pointermove イベントの dispatch を
(たとえば、パフォーマンス上の理由で)遅延させてもよい MAY です。
合成イベント情報は、単一の dispatch された
pointermove イベントについて、
getCoalescedEvents
メソッドを通じて公開されます。
そのようなイベントの最終座標は、イベントのターゲットを見つけるために使用されるべきです。
ユーザーエージェントは、
ポインターが pointerdown または pointerup イベントを発火しないプロパティを変更したとき、
ポインターイベントを発火することにより、
pointerrawupdate という名前のイベントを、
セキュアコンテキスト内でのみ
発火しなければなりません MUST。そのようなプロパティの一覧については
pointermove イベントを参照してください。
pointermove とは対照的に、
ユーザーエージェントは pointerrawupdate
イベントをできるだけ早く、
かつ JavaScript がそのイベントを処理できる頻度で dispatch すべきです SHOULD。
pointerrawupdate イベントの target
は、
pointermove イベントのものと異なる場合があります。
これは、pointermove イベントが
遅延または合成される場合があり、target を見つけるために使用されるイベントの最終位置が、
その合成イベントの位置と異なる可能性があるためです。
同じ pointerId を持つ別の
pointerrawupdate がすでに存在し、それが
イベントループで
まだ dispatch されていない場合、ユーザーエージェントは、
新しい pointerrawupdate
について新しい
タスクを作成する代わりに、
そのイベントと合成してもよい MAY ことに注意してください。
これにより、pointerrawupdate が
合成イベントを持つことがあり、それらはすべて、イベントが
イベントループで処理され次第、
1 つの pointerrawupdate イベントの
合成イベントとして配信されます。
詳細については getCoalescedEvents
を参照してください。
pointerrawupdate と pointermove の順序については、
ユーザーエージェントが、pointerrawupdate と pointermove の両方のイベントを引き起こす更新を
プラットフォームから受け取った場合、ユーザーエージェントは、
対応する pointermove より前に
pointerrawupdate イベントを
dispatch しなければなりません MUST。
target を除き、最後の pointermove イベント以降に
dispatch されたすべての pointerrawupdate
イベントの合成イベントリストの連結は、
他のイベント属性に関して、次の pointermove
イベントの合成イベントと同じです。
pointerrawupdate の属性は、
cancelable を除き、ほぼ pointermove と同じです。
cancelable は pointerrawupdate については false でなければなりません
MUST。
ユーザーエージェントは、互換性マウスイベントを
pointerrawupdate について発火すべきではありません
SHOULD。
pointerrawupdate
イベントのリスナーを追加すると、
ユーザーエージェントの実装によっては Web ページのパフォーマンスに悪影響を及ぼす可能性があります。
ほとんどのユースケースでは、他の pointerevent 型で十分なはずです。
pointerrawupdate
リスナーは、JavaScript が高頻度イベントを必要とし、それらを同じ速さで処理できる場合にのみ追加すべきです。
そのような場合、おそらく他の型の pointer events をリッスンする必要はありません。
ユーザーエージェントは、
ポインターがアクティブボタン状態を離れたとき、
ポインターイベントを発火することにより、
pointerup という名前のイベントを発火しなければなりません
MUST。mouse の場合、これはデバイスが少なくとも 1 つのボタン押下状態から
ボタン未押下状態へ遷移したときです。touch の場合、これはデジタイザーから物理的接触が取り除かれたときです。
pen の場合、これはボタンが押されていない状態で pen がデジタイザーとの物理的接触から取り除かれたとき、
またはホバー中に少なくとも 1 つのボタン押下状態からボタン未押下状態へ遷移したときです。
ホバーをサポートしないデバイスでの入力については、
ユーザーエージェントは、
pointerup イベントを dispatch した後に、
ポインターイベントを発火することにより、
pointerout という名前のイベントに続けて
pointerleave という名前の
ポインターイベントも発火しなければなりません MUST。
すべての pointerup イベントは pressure
値 0 を持ちます。
ユーザーエージェントは、 ポインターが現在キャプチャされている場合、ポインターキャプチャを暗黙的に解放することも しなければなりません MUST。
pointerdown および pointerup が、mousedown および
mouseup と同じすべての状況で発火されるわけではないことを意味します。
詳細については コード化ボタンを参照してください。
ユーザーエージェントは、
ポインターイベントストリームを抑制するシナリオを検出したとき、
ポインターイベントを発火することにより、
pointercancel という名前のイベントを発火しなければなりません
MUST。
pointercancel イベントの次のプロパティの値は、
同じ pointerId を持つ最後に dispatch された
pointer event の値と一致しなければなりません MUST: width、
height、pressure、tangentialPressure、tiltX、
tiltY、twist、altitudeAngle、azimuthAngle、
pointerType、isPrimary、および [UIEVENTS] から継承された座標。pointercancel イベント内の
coalescedEvents および predictedEvents リストは空でなければならず
MUST、そのイベントの cancelable 属性は
false でなければなりません MUST。
ユーザーエージェントは、
次のいずれかが発生したとき、ポインターイベントを発火することにより、
pointerout という名前のイベントを発火しなければなりません
MUST:
pointerup イベントを
発火した後(pointerup を参照)。ユーザーエージェントは、
次のいずれかが発生したとき、ポインターイベントを発火することにより、
pointerleave という名前のイベントを発火しなければなりません
MUST:
pointerup イベントを
発火した後(pointerup を参照)。mouseleave イベント、
および [CSS21]
で
説明される CSS :hover 疑似クラスの間には類似点があります。
pointerenter イベントも参照してください。
ユーザーエージェントは、
要素がポインターキャプチャを受け取ったとき、ポインターイベントを発火することにより、
gotpointercapture
という名前の
イベントを発火しなければなりません MUST。このイベントは、ポインターキャプチャを受け取っている要素で発火されます。
そのポインターについての後続のイベントは、この要素で発火されます。ポインターキャプチャの設定および 保留中のポインターキャプチャを処理するセクションを参照してください。
ユーザーエージェントは、
ポインターについてポインターキャプチャが解放された後、ポインターイベントを発火することにより、
lostpointercapture
という名前の
イベントを発火しなければなりません MUST。
このイベントは、キャプチャが解放された後、そのポインターについての後続のどのイベントよりも前に
発火されなければなりません MUST。このイベントは、
ポインターキャプチャが取り除かれた要素で発火されます。そのポインターについての後続のすべてのイベントは、
click,
auxclick, および contextmenu イベントを除き、
イベントターゲットを決定するために通常のヒットテスト機構(この仕様の範囲外)に従います。ポインターキャプチャの解放、ポインターキャプチャの暗黙的な解放、および 保留中のポインターキャプチャを処理する
セクションを参照してください。
ユーザーの環境は、垂直スクロールを y 軸に沿った回転に、 水平スクロールを x 軸に沿った回転に、ズームを z 軸に沿った回転に 関連付けるよう構成されている場合があります。
WheelEvent オブジェクトの
deltaX、deltaY、および deltaZ 属性は、それぞれの軸に沿った測定値を、
ピクセル、行、またはページ単位で示します。報告される測定値は、環境固有の
アルゴリズムが、ホイールデバイスの実際の回転/移動を適切な値および単位へ
変換した後に提供されます。
ユーザーの環境設定は、ホイールデバイスの実際の回転/移動を
異なる方法で解釈するようカスタマイズできます。
一般的な刻み付き
マウスホイールの 1 回の移動は、162 ピクセルの測定値を
生成する場合があります(162 は単なる例の値であり、実際の値はユーザーエージェントの
現在の画面寸法に依存する場合があります)。
しかし、ユーザーは既定の環境設定を変更してマウスホイールを高速化し、
この数値を増加させることができます。
さらに、一部のマウスホイールソフトウェアは加速(ホイールの
回転/移動が速いほど、各測定値のデルタが大きくなる)や、サブピクセルの回転
測定値さえサポートする場合があります。
このため、作者は、あるユーザーエージェントにおける特定の回転量が、
すべてのユーザーエージェントで同じデルタ値を生成すると仮定することはできません。
wheel イベントの複数回の dispatch の間で
一貫していなければなりません MUST。
ユーザーエージェントが
wheel イベントの既定の動作としてスクロールする場合、
デルタの符号は、
正の X、Y、および Z 軸が、それぞれ文書の最も右側の端、最も下側の端、および
最も遠い奥行き(ユーザーから離れる方向)を向く右手座標系によって与えられるべきです
SHOULD。
個々のユーザーエージェントは(環境およびハードウェア構成によって)、 ホイール上の同じ物理的なユーザー操作を異なる方法で解釈する場合があります。 たとえば、トラックパッドの端を上から下へ垂直にスワイプする操作は、 ページを下へスクロールするためのホイール操作として解釈される場合も、 ページを上へパンするための操作として解釈される場合もあります(すなわち、それぞれ 正または負の deltaY 値になります)。
スクロール可能な要素内をターゲットとする一連の wheel events が子要素の上で開始した場合、 同じユーザージェスチャーの後続のイベントは、その子要素の上で発生する可能性があります。
WheelEvent インターフェイスは、
wheel イベントに関連付けられた
固有のコンテキスト情報を提供します。
WheelEvent インターフェイスの
インスタンスを作成するには、任意の WheelEventInit 辞書を渡して、
WheelEvent コンストラクターを使用します。
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;
readonly attribute boolean momentum;
};
DOM_DELTA_PIXELDOM_DELTA_LINEDOM_DELTA_PAGEdeltaXwheel
イベントの既定の動作がスクロールであるユーザーエージェントでは、この値は、
イベントがキャンセルされない場合にスクロールされる x 軸に沿った測定値
(ピクセル、行、またはページ単位)でなければなりません MUST。
そうでない場合、これはホイールデバイスの x 軸まわりの移動についての
実装固有の測定値(ピクセル、行、またはページ単位)です。
この属性の未初期化値は
0.0 でなければなりません
MUST。
deltaYwheel
イベントの既定の動作がスクロールであるユーザーエージェントでは、この値は、
イベントがキャンセルされない場合にスクロールされる y 軸に沿った測定値
(ピクセル、行、またはページ単位)でなければなりません MUST。
そうでない場合、これはホイールデバイスの y 軸まわりの移動についての
実装固有の測定値(ピクセル、行、またはページ単位)です。
この属性の未初期化値は
0.0 でなければなりません
MUST。
deltaZwheel
イベントの既定の動作がスクロールであるユーザーエージェントでは、この値は、
イベントがキャンセルされない場合にスクロールされる z 軸に沿った測定値
(ピクセル、行、またはページ単位)でなければなりません MUST。
そうでない場合、これはホイールデバイスの z 軸まわりの移動についての
実装固有の測定値(ピクセル、行、またはページ単位)です。
この属性の未初期化値は
0.0 でなければなりません
MUST。
deltaModedeltaMode 属性には、デルタ値の測定単位を示す指標が含まれます。
既定値は DOM_DELTA_PIXEL
(ピクセル)です。
この属性は、デルタ値の測定単位を
示すために、DOM_DELTA 定数のいずれかに設定されなければなりません
MUST。
正確な測定値は、デバイス、オペレーティングシステム、および
アプリケーション構成に固有です。
この属性の未初期化値は
0 でなければなりません
MUST。
momentumtrue でなければならず、そうでない場合は
false でなければなりません。
この属性の未初期化値は
false でなければなりません
MUST。
WebIDLdictionary WheelEventInit : MouseEventInit {
double deltaX = 0.0;
double deltaY = 0.0;
double deltaZ = 0.0;
unsigned long deltaMode = 0;
boolean momentum = false;
};
下記の定義は、対応する属性がすでに上で定義されているため、 冗長に思われます。次を参照してください: pointerevents/646。
deltaXdeltaZ 属性を参照してください。deltaYdeltaZ 属性を参照してください。deltaZWheelEvent オブジェクトの
deltaZ 属性を初期化します。
この属性(および
deltaX と deltaY 属性)の相対的な正の値は、
X、Y、および Z 軸が、それぞれ文書の最も右側の端、最も下側の端、
および最も遠い奥行き(ユーザーから離れる方向)を向く
右手座標系によって与えられます。負の相対値は、それぞれの
反対方向です。
deltaMode
WheelEvent オブジェクト上の
deltaMode 属性を、列挙値 0、
1、または 2 へ初期化します。これらは、ホイールの回転がスクロールをもたらす場合に、
スクロールされるピクセル量
(DOM_DELTA_PIXEL)、
スクロールされる行
(DOM_DELTA_LINE)、または
スクロールされるページ
(DOM_DELTA_PAGE)を
表します。
momentummomentum 属性を初期化します。
| 型 | wheel |
|---|---|
| インターフェイス | WheelEvent |
| 同期 / 非同期 | 非同期 |
| バブル | はい |
| 信頼済みターゲット | Element |
| キャンセル可能 | さまざま |
| 合成 | はい |
| 既定の動作 | 文書をスクロール(またはズーム)する |
| コンテキスト (信頼済みイベント) |
|
wheel イベントとして配信されてもよく、
または各非ゼロ軸ごとの個別の
wheel イベントとして配信されてもよい
MAY。
wheel イベント型の典型的な
既定の動作は、
示された量だけ文書をスクロール(または場合によってはズーム)することです。
このイベントがキャンセルされた場合、実装は文書をスクロールまたはズームしてはならず
MUST NOT(またはこのイベント型に関連付けられたその他の
実装固有の既定の動作を実行してはなりません)。
一部のユーザー エージェント、または一部の入力デバイスでは、ホイールが回された速度が デルタ値に影響する場合があり、 速度が速いほど高いデルタ値が生成されます。
wheel event で preventDefault を呼び出すと、スクロールを防止したり、
または中断したりできます。最大限のスクロール性能のために、ユーザーエージェントは、
スクロールに関連付けられた各 wheel event がキャンセルされるかどうかを確認するために、
それぞれの処理を待たない場合があります。そのような場合、ユーザーエージェントは、
cancelable プロパティが false である
wheel イベントを生成すべきです。これは、
preventDefault を使用してスクロールを防止または中断できないことを示します。
それ以外の場合、cancelable は true になります。
特に、ユーザーエージェントは、そのイベントについて
非 passive リスナーが存在しないことを
観測した場合、キャンセル不能な
wheel イベントのみを生成すべきです。
次のセクションでは、ポインターキャプチャの設定および解放を容易にするための、既存の Element インターフェイスへの
拡張について説明します。
WebIDLpartial interface Element {
undefined setPointerCapture (long pointerId);
undefined releasePointerCapture (long pointerId);
boolean hasPointerCapture (long pointerId);
};
setPointerCapture()このメソッドが呼び出された要素に対し、引数 pointerId
で識別される
ポインターについてポインターキャプチャを設定します。
そのポインターの後続イベントについて、キャプチャしているターゲットは、ポインターが常にキャプチャしているターゲット上に
あるかのように通常のヒットテスト結果を置き換え、キャプチャが解放されるまで、それらは常にこの要素を
ターゲットにしなければなりません MUST。このメソッドが有効であるためには、
ポインターはそのアクティブボタン状態になければならず
MUST、そうでない場合は何もせず失敗します。提供されたメソッドの引数が
いずれのアクティブポインターにも一致しない場合、"NotFoundError" DOMException を
投げます。
releasePointerCapture()このメソッドが呼び出された要素から、引数 pointerId
で識別されるポインターについてポインターキャプチャを解放します。
そのポインターについての後続イベントは、イベントターゲットを決定するために通常のヒットテスト機構
(この仕様の範囲外)に従います。提供されたメソッドの引数がいずれのアクティブポインターにも一致しない場合、"NotFoundError" DOMException を
投げます。
hasPointerCaptureこのメソッドが呼び出された要素が、引数 pointerId
で識別されるポインターについて
ポインター
キャプチャを持っているかどうかを示します。具体的には、pointerId の
保留中のポインターキャプチャターゲット
オーバーライドが、このメソッドが呼び出された要素に設定されている場合は
true を返し、そうでない場合は false を返します。
setPointerCapture()
の呼び出し直後に
true を返します。ただし、その要素はまだ gotpointercapture イベントを
受け取っていません。その結果、pointerdown
イベントリスナーの内部から
暗黙的ポインターキャプチャを検出するのに
役立つ場合があります。
次のセクションでは、イベントハンドラー登録を容易にするための、既存の GlobalEventHandlers
mixin への拡張について説明します。
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 イベント型の
イベント
ハンドラー IDL 属性です。
onpointerenterpointerenter イベント型の
イベント
ハンドラー IDL 属性です。
onpointerdownpointerdown イベント型の
イベント
ハンドラー IDL 属性です。
onpointermovepointermove イベント型の
イベント
ハンドラー IDL 属性です。
onpointerrawupdatepointerrawupdate イベント型の
イベント
ハンドラー IDL 属性です。
onpointeruppointerup イベント型の
イベント
ハンドラー IDL 属性です。
onpointercancelpointercancel イベント型の
イベント
ハンドラー IDL 属性です。
onpointeroutpointerout イベント型の
イベント
ハンドラー IDL 属性です。
onpointerleavepointerleave イベント型の
イベント
ハンドラー IDL 属性です。
ongotpointercapturegotpointercapture
イベント型の
イベント
ハンドラー IDL 属性です。
onlostpointercapturelostpointercapture
イベント型の
イベント
ハンドラー IDL 属性です。
属性と既定の動作で述べたように、ビューポート操作
(パンおよびズーム)は、pointer event をキャンセルしても抑制できません。代わりに、作者は
touch-action CSS プロパティを使用して、これらの挙動のうちどれを許可し、どれを
抑制するかを宣言的に定義しなければなりません。
touch-action CSS プロパティは touch 入力のみを
指すように見えますが、実際にはパンおよびズームのための直接操作を可能にするすべての形式のポインター入力に適用されます。| 名前: | touch-action |
|---|---|
| 値: | auto | none | [ [ pan-x | pan-left |
pan-right ] || [ pan-y | pan-up |
pan-down ] ] | manipulation
|
| 初期値: | auto |
| 適用対象: | 次を除くすべての要素: 非置換インライン要素、表の行、行グループ、表の列、 および列グループ |
| 継承: | しない |
| パーセンテージ: | N/A |
| メディア: | visual |
| 算出値: | 指定値と同じ |
| 標準順序: | 文法に従う |
| アニメーション型: | アニメーション不可 |
touch-action CSS プロパティは、直接
操作インタラクション(プロパティ名にもかかわらず touch に限定されません)が、ユーザーエージェントの
パンおよびズーム挙動をトリガーしてもよい MAY かどうかを決定します。
touch-action 値に関するセクションを参照してください。
パンまたはズームを開始する直前に、ユーザーエージェントは、次の条件がすべて true である場合、 ポインターイベントストリームを抑制しなければなりません MUST:
pointerdown イベントが送信されている、かつ
pointerdown に続く pointerup または pointercancel イベントが、そのポインターについて
まだ送信されていない。touch-action は、埋め込み閲覧コンテキストへ適用/カスケードされません。
たとえば、<iframe> に touch-action を適用しても、
<iframe> 自体の内部でのパンおよびズームのための直接操作インタラクションの挙動には
何の効果もありません。
ユーザーが直接操作ポインター(タッチスクリーン上の
touch や stylus など)を使用して要素とやり取りするとき、その入力の効果は、
touch-action プロパティの値と、その要素および祖先の既定の直接操作の挙動によって、
次のように決定されます:
touch-action に適合するものとします。
CSS 変換が適用されている場合、要素の座標空間は、ここでの適合性に影響する形でスクリーン座標と
異なる場合があることに注意してください。たとえば、スクリーンに対して 90 度回転した要素の X 軸は、
スクリーン座標の Y 軸に平行になります。touch-action プロパティに適合する場合にサポートされます。
document 要素との間の各要素の touch-action プロパティに適合する場合にサポートされます。
touch-action 値への変更は、
その操作の継続中は無視されます。たとえば、pointerdown
ハンドラースクリプトの一部として、
要素の touch-action 値を auto から none へ
プログラムで変更しても、そのポインターがアクティブである間、その入力についてのパンまたはズームの挙動を
ユーザーエージェントが中止または抑制することにはなりません。
pan-* の各種 touch-action 値の場合、ユーザーエージェントが
ジェスチャーの開始時に、そのジェスチャーを直接処理するかどうかを決定した後は、同じジェスチャーの方向の
後続の変化は、そのポインターがアクティブである間、ユーザーエージェントによって無視されるべきです
SHOULD。たとえば、要素に touch-action: pan-y
(垂直方向のパンのみがユーザーエージェントによって処理されることを意味します)が設定されており、
touch ジェスチャーが水平に開始された場合、ユーザーが指を画面に触れたままジェスチャーの方向を垂直へ変更しても、
垂直パンは発生すべきではありません。
touch-action 値を処理または関連付ける
方法は、この仕様の範囲外です。touch-action プロパティは、ビューポートのパンおよびズームに関連する直接操作の挙動を対象とします。
テキスト選択/ハイライト、リンクおよびフォームコントロールのアクティベーションなど、追加のユーザーエージェントの
挙動は、この CSS プロパティによって影響を受けてはなりません MUST NOT。
auto または none 値の挙動を
トリガーするための定義は、この仕様の範囲外です。pan-x または
pan-y)、パン中に軸を変更することはできません。
touch-action 値は、[COMPAT] で定義されています。方向固有の pan 値は、一部の overscroll 挙動をカスタマイズするのに有用です。
たとえば、単純な pull-to-refresh 効果を実装するために、文書の
touch-action を、スクロール位置が 0 のときは
pan-x pan-down に、それ以外の場合は pan-x pan-y に
設定できます。
これにより、pointer event ハンドラーは、文書の先頭から開始する上方向の
パン/スクロールの挙動を定義できます。
方向固有の pan 値は、ネイティブにスクロールする要素内で pointer event 処理による
カスタムパンを実装するコンポーネントを構成するためにも使用できます(またはその逆)。
たとえば、画像カルーセルは pan-y を使用して、文書の垂直パンを妨げることなく、
任意の水平パン操作について pointer events を受け取ることを保証できます。
カルーセルが最も右側の端に到達したとき、後続の端を超えたスクロール操作が可能であれば
ビューポート内の文書をスクロールできるように、その touch-action を
pan-y pan-right に変更できます。
パン/スクロール操作が進行中である間、その挙動を変更することはできません。
auto では、ユーザーエージェントは通常、
double-tap ジェスチャーを処理できるように、click の前に 300ms の遅延を追加します。
このような場合、touch-action: none または
touch-action: manipulation を明示的に設定すると、この遅延が取り除かれます。
tap または double-tap ジェスチャーを決定する方法は、この仕様の範囲外であることに注意してください。
<div style="touch-action: none;">
この要素は、そうでなければパンまたはズームにつながるすべての直接操作インタラクションについて pointer events を受け取ります。
</div>
<div style="touch-action: pan-x;">
この要素は、水平方向にパンしていないときに pointer events を受け取ります。
</div>
<div style="overflow: auto;">
<div style="touch-action: none;">
この要素は、そうでなければパンまたはズームにつながるすべての直接操作インタラクションについて pointer events を受け取ります。
</div>
<div>
この要素上の直接操作インタラクションは、親を操作するために消費されてもよい MAY です。
</div>
</div>
<div style="overflow: auto;">
<div style="touch-action: pan-y;">
<div style="touch-action: pan-x;">
この要素は、水平パンのみを許可している一方で、中間祖先
(それとスクロール可能要素の間にあるもの)が垂直パンのみを許可しているため、
すべての直接操作インタラクションについて pointer events を受け取ります。
したがって、パン/ズームのための直接操作の挙動は、
ユーザーエージェントによって処理されません。
</div>
</div>
</div>
<div style="overflow: auto;">
<div style="touch-action: pan-y pan-left;">
<div style="touch-action: pan-x;">
この要素は、左方向にパンしていないときに pointer events を受け取ります。
</div>
</div>
</div>
このセクションは非規範的です。
ポインターキャプチャにより、特定のポインターについてのイベント(任意の互換性マウスイベントを含む)を、ポインターの位置に対する通常の
ヒットテスト結果とは異なる特定の要素へ
再ターゲットできます。これは、カスタムスライダーコントロール(例: [HTML]
<input type="range"> コントロールに似たもの)のようなシナリオで有用です。
ポインターキャプチャはスライダーのつまみ要素に設定でき、ポインターがつまみから外れても、ユーザーが
コントロールを前後にスライドできるようにします。
pointerdown した後、ポインターがつまみから外れても
ユーザーがつまみをスライドできるように、ポインターキャプチャを使用できます。
ポインターキャプチャは、element.setPointerCapture(pointerId) メソッドを呼び出すことにより、
Element 型の element に設定されます。
このメソッドが呼び出されたとき、ユーザーエージェントは、次の手順を実行しなければなりません
MUST:
pointerId が
いずれのアクティブポインターにも一致しない場合、"NotFoundError" DOMException を
投げます。
pointerId によって指定される
アクティブポインターとします。
InvalidStateError" DOMException を
投げます。
pointerLockElement)を
持っている間にこのメソッドが呼び出された場合、"InvalidStateError" DOMException を
投げます。
pointerId について、保留中のポインターキャプチャターゲットオーバーライドを、このメソッドが
呼び出された Element に設定します。pointerdown リスナーで解放しようとして失敗した場合にも当てはまります。ポインターキャプチャは、
element.releasePointerCapture(pointerId) メソッドを呼び出すことにより、要素上で明示的に解放されます。
このメソッドが呼び出されたとき、ユーザーエージェントは次の手順を
実行しなければなりません MUST:
pointerId が
いずれのアクティブポインターにも一致せず、かつ
これらの手順がポインターキャプチャの暗黙的解放の結果として
呼び出されているのでもない場合、"NotFoundError" DOMException を
投げます。
pointerId を持つ
Element について
hasPointerCapture が false である場合、
これらの手順を終了します。
pointerId について、
保留中のポインターキャプチャターゲット
オーバーライドが設定されていれば、それをクリアします。
パンおよびズームのための直接操作インタラクションを実装する入力
(タッチスクリーン上の touch や stylus など)は、任意の pointerdown リスナーの呼び出し直前に、
ターゲット要素上で setPointerCapture が呼び出されたかのように
正確に振る舞うべきです SHOULD。これが発生したかどうかを判断するために、
hasPointerCapture API を使用できます
(たとえば、pointerdown リスナー内で)。
次の pointer event が発火される前に、そのポインターについて releasePointerCapture が呼び出されない場合、
キャプチャがアクティブであることを示す gotpointercapture
イベントが(通常どおり)ターゲットへ
dispatch されます。
pointerup または pointercancel イベントを発火した直後に、
ユーザーエージェントは、直前に dispatch
された
pointerup または pointercancel イベントの
pointerId について、
保留中のポインターキャプチャターゲット
オーバーライドをクリアしなければなりません MUST。その後、必要であれば
lostpointercapture を発火するために
保留中のポインターキャプチャを処理する手順を実行します。
保留中のポインターキャプチャを処理する手順を実行した後、
ポインターが hover をサポートする場合、ユーザーエージェントは、キャプチャなしのポインターの
現在位置を反映するために必要な対応する境界イベントも送信しなければなりません MUST。
ポインターキャプチャターゲットオーバーライドが もはや 接続済み [DOM] でなくなった場合、 ポインターキャプチャターゲットオーバーライドは document に設定されるべきです SHOULD。
保留中のポインターキャプチャターゲット オーバーライドがもはや 接続済み [DOM] でなくなった場合、 保留中のポインターキャプチャターゲット オーバーライドノードはクリアされるべきです SHOULD。
lostpointercapture
イベントが
document で発火されます。
ポインターロック [PointerLock] が要素に正常に適用された場合、任意の要素が
キャプチャされるよう設定されている、またはキャプチャされるよう保留中であれば、ユーザーエージェントは
releasePointerCapture メソッドが
呼び出されたかのように手順を実行しなければなりません MUST。
パフォーマンス上の理由から、ユーザーエージェントは、ポインターの測定可能なプロパティ
(座標、圧力、接線方向圧力、傾き、twist、接触ジオメトリなど)が更新されるたびに
pointermove
イベントを送信しないことを選択できます。代わりに、複数の変更を 1 つの
pointermove または pointerrawupdate イベントへ
合成(結合/マージ)できます。この方法は、ユーザーエージェントが実行しなければならない
MUST イベント処理量を減らすのに役立ちますが、
ポインター位置を追跡するときの粒度と忠実度は当然低下します。特に、高速で大きな移動の場合にそうです。
getCoalescedEvents メソッドを
使用すると、アプリケーションは未合成の生の位置変化へアクセスできます。これにより、ポインター移動データを
より正確に処理できます。たとえば描画アプリケーションでは、未合成イベントを使用して、ポインターの実際の
移動により近い滑らかな曲線を描画できます。
pointermove イベントからの
合成された座標のみ(灰色の点)を使用すると、曲線は目に見えて角ばってぎざぎざになります。
getCoalescedEvents() によって提供される、より粒度の細かい点(赤い円)を使用して
同じ線を描くと、ポインター移動のより滑らかな近似になります。PointerEvent には、関連付けられた
合成イベントリスト
(0 個以上の PointerEvent のリスト)があります。信頼済みの pointermove および
pointerrawupdate イベントについて、このリストは
このイベントへ合成されたすべての PointerEvent のシーケンスです。「親」である信頼済みの
pointermove および
pointerrawupdate イベントは、これらの合成イベントの
蓄積を表しますが、追加の処理(たとえば表示リフレッシュレートに合わせるため)を持つ場合があります。
その結果、これらのイベントの合成イベントリストには常に少なくとも 1 つのイベントが含まれます。
他のすべての信頼済みイベント型については、これは空のリストです。信頼されていないイベントは、
合成イベントリストをコンストラクターに渡された値で初期化します。
isTrusted ビットを
false に設定しますが、合成
イベントリスト内の同じビットは、元の true 値のまま変更されません。
信頼済みイベントの合成イベントリスト内のイベントは、次を持ちます:
timeStamp 値
[DOM] — すべての合成イベントは、
getPredictedEvents メソッドが
呼び出された dispatch 済み pointer event の timeStamp 以下の
timeStamp を持ちます。
合成イベントリストは timeStamp によって
時系列順にソートされていなければならず MUST、そのため最初のイベントは
最小の timeStamp を持ちます。
pointerId、pointerType、
および isPrimary。
<style>
/* パンやズームなどのユーザーエージェント固有の直接操作の挙動を無効化し、
canvas 要素上のすべてのイベントが代わりにアプリケーションへ渡されるようにします。 */
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); // すべての raw/未合成点を描画
}
} else {
paint(e); // 最終的な合成点を描画
}
});
function paint(event) {
if (event.buttons>0) {
context.fillRect(event.clientX, event.clientY, 5, 5);
}
}
</script>
これらの dispatch されたイベントすべての順序は、元のイベントの実際の順序と一致しなければなりません
MUST。
たとえば、pointerdown イベントが
合成された pointermove イベントの dispatch を引き起こす場合、
ユーザーエージェントは、まずその
pointerId の
すべての合成イベントを含む 1 つの pointermove イベントを dispatch
し、その後に
pointerdown イベントを dispatch しなければなりません
MUST。
以下は、増加する timeStamp 値を持って
実際に発生するイベントと、ユーザーエージェントによって dispatch されるイベントの例です:
| 実際のイベント | dispatch されるイベント |
|---|---|
pointer(pointerId=2)
座標変更 |
pointerrawupdate(pointerId=2)、
1 つの合成イベント付き |
pointer(pointerId=1)
座標変更 |
pointerrawupdate(pointerId=1)、
1 つの合成イベント付き |
pointer(pointerId=2)
座標変更 |
pointerrawupdate(pointerId=2)、
1 つの合成イベント付き |
pointer(pointerId=2)
座標変更 |
pointerrawupdate(pointerId=2)、
1 つの合成イベント付き |
pointer(pointerId=1)
座標変更 |
pointerrawupdate(pointerId=1)、
1 つの合成イベント付き |
pointer(pointerId=2)
座標変更 |
pointerrawupdate(pointerId=2)、
1 つの合成イベント付き |
pointer(pointerId=1)ボタン
押下 |
pointermove
(pointerId=1)、
2 つの合成イベント付きpointermove
(pointerId=2)、
4 つの合成イベント付きpointerdown
(pointerId=1)、
合成イベント 0 個 |
pointer(pointerId=2)
座標変更 |
pointerrawupdate(pointerId=2)、
1 つの合成イベント付き |
pointer(pointerId=2)
座標変更 |
pointerrawupdate(pointerId=2)、
1 つの合成イベント付き |
pointer(pointerId=1)ボタン
解放 |
pointermove
(pointerId=2)、
2 つの合成イベント付きpointerup(pointerId=1)、
合成イベント 0 個 |
一部のユーザーエージェントには、一連の確認済みポインター移動の後で、将来のポインター移動の位置が
どうなるかを(現在のジェスチャーに対する先行イベント、および移動の速度/軌跡に基づいて)予測できる
組み込みアルゴリズムがあります。アプリケーションは、この情報を
getPredictedEvents メソッドとともに使用して、
体感レイテンシーを低減するために予測位置へ投機的に「先描き」し、実際の点を受け取ったらそれらの
予測点を破棄できます。
pointermove イベントからの合成座標を使用し、
ユーザーエージェントが予測した将来の点(灰色の円)を示しています。PointerEvent には、関連付けられた
予測イベントリスト
(0 個以上の PointerEvent のリスト)があります。信頼済みの pointermove イベントについては、これは将来そのイベントに
続くとユーザーエージェントが予測する PointerEvent のシーケンスです。
他のすべての信頼済みイベント型については、これは空のリストです。
信頼されていないイベントは、予測イベントリストを
コンストラクターに渡された値で初期化します。
isTrusted ビットを
false に設定しますが、予測
イベントリスト内の同じビットは、元の true 値のまま変更されません。
リスト内のイベント数と、それらが現在のタイムスタンプからどれだけ離れているかは、ユーザーエージェントと それが使用する予測アルゴリズムによって決定されます。
信頼済みイベントの予測イベントリスト内のイベントは、次を持ちます:
timeStamp 値
[DOM] — すべての予測イベントは、
getPredictedEvents メソッドが
呼び出された dispatch 済み pointer event の timeStamp 以上の
timeStamp を持ちます。
予測イベントリストは timeStamp によって
時系列順にソートされていなければならず MUST、そのため最初のイベントは
最小の timeStamp を持ちます。
pointerId、pointerType、
および isPrimary。
作者は、予測イベントを次の pointer event が dispatch されるまでの有効な予測としてのみ考慮すべきであることに 注意してください。ユーザーエージェントがどれだけ先の未来までイベントを予測するかによっては、 1 つ以上の予測イベントのタイムスタンプよりも前に、通常の pointer events が dispatch される可能性があります。
let predicted_points = [];
window.addEventListener("pointermove", function(event) {
// 以前に描画した予測点を消去する。
for (let e of predicted_points.reverse()) {
clearPoint(e.pageX, e.pageY);
}
// 最後に受信したイベント以降に実際に発生した移動を描画する。
for (let e of event.getCoalescedEvents()) {
drawPoint(e.pageX, e.pageY);
}
// レイテンシーの知覚を低減するため、現在の予測点を描画する。
predicted_points = event.getPredictedEvents();
for (let e of predicted_points) {
drawPoint(e.pageX, e.pageY);
}
});
信頼済みの PointerEvent が作成されるとき、ユーザーエージェントは、
合成イベントリストおよび予測イベントリスト内の各イベントについて、次の手順を実行すべきです
SHOULD:
pointerId、
pointerType、
isPrimary および isTrusted を、「親」
pointer event のそれぞれのプロパティと一致するように設定します。
cancelable および bubbles を false に設定します
(これらのイベントが単独で dispatch されることはないため)。PointerEvent 値へ初期化します。
信頼済みの PointerEvent のtarget が変更されたとき、
ユーザーエージェントは、合成イベントリストおよび予測イベントリスト内の各イベントについて、次を実行すべきです
SHOULD:
今日存在する Web コンテンツの大多数は、Mouse Events のみに対してコードを書いています。以下では、このような コンテンツとの互換性のために、ユーザー エージェントが汎用ポインター入力をマウスイベントへどのようにマップしてもよいか MAY についてのアルゴリズムを説明します。
マウスイベントとの互換性マッピングは、この仕様のOPTIONAL な機能です。 ユーザーエージェントは、既存のレガシーコンテンツとの最良の互換性のために、この機能をサポートすることが推奨されます。
高いレベルでは、互換性マウスイベントはそれぞれ対応する pointer event と「交互に挟まれる」ことが意図されています。 しかし、この具体的な順序は必須ではなく、互換性マウスイベントを実装するユーザーエージェントは、 その相対的な順序が一貫している限り、マウスイベントの dispatch を遅延またはグループ化することを 決定してもよい MAY です。
特にタッチスクリーン入力の場合、ユーザーエージェントは(作者が によって明示的に抑制していない限り)
ジェスチャー認識のために追加のヒューリスティックを適用してもよい
MAY です。touch-actionpointerdown
イベントと pointerup イベントの間のイベントシーケンス中に、
ジェスチャー認識は、ジェスチャーを検出または無視するために pointerup
イベントまで待機しなければならない場合があります。
その結果、ユーザーエージェントがインタラクションが特定のジェスチャーとして意図されたものではないと判断した場合、
シーケンス全体の互換性マウスイベントは、最後の pointerup
イベントの後でまとめて dispatch される場合があります。これらのユーザーエージェントのジェスチャー認識の詳細は、
この仕様では定義されず、実装間で異なる場合があります。
互換性マウスイベントのサポートにかかわらず、ユーザーエージェントは click、
auxclick および contextmenu イベントを常にサポートしなければなりません
MUST。これらのイベントは PointerEvent 型であり、したがって
互換性マウスイベントではないためです。
pointer event 中に preventDefault を呼び出しても、click、
auxclick、または contextmenu が発火されるかどうかに影響してはなりません
MUST NOT。
これらの高レベルイベントの一部(contextmenu、focus、blur など)と pointer
events との相対的な順序は未定義であり、ユーザーエージェント間で異なります。たとえば、一部のユーザーエージェントでは
contextmenu は多くの場合 pointerup
の後に続きますが、他のユーザーエージェントでは
多くの場合 pointerup または pointercancel より前に発生し、状況によっては対応する
pointer event なしに発火される場合もあります(たとえばキーボード操作の結果として)。
さらに、ユーザーエージェントは click、auxclick、または
contextmenu イベントを発火すべきかどうかを判断するために、独自のヒューリスティックを
適用する場合があります。一部のユーザーエージェントは、同じ型の他の(非プライマリ)ポインター、または
異なる型の他のプライマリポインターが存在する場合、これらのイベントを発火しないことを選択する場合があります。
ユーザーエージェントは、特定の操作が「きれいな」 tap、click、または long-press ではなかったと判断し
(たとえば、タッチスクリーン上の指によるインタラクションに、指が画面に接触している間の移動が多すぎる場合)、
click、auxclick、または contextmenu イベントを発火しないことを
決定する場合があります。ユーザーエージェントの挙動のこれらの側面はこの仕様では定義されず、実装間で
異なる場合があります。
特に注記がない限り、マップされた任意のマウスイベントのターゲットは、ターゲットがその
ownerDocument のツリーに参加しなくなっていない限り、対応する pointer event と同じターゲットであるべきです
SHOULD。この場合、マウスイベントは、元のターゲットがツリーから削除された時点での
最も近い祖先ノードのうち、その ownerDocument のツリーにまだ参加しているものに対して発火されるべきであり、
つまりマウスイベントについて(新しいターゲットノードに基づく)新しいイベントパスが構築されます。
作者は、pointerdown イベントをキャンセルすることで、
特定の互換性マウスイベントの生成を防止できます。
マウスイベントは、ポインターが押下状態にあるときにのみ防止できます。ホバー中のポインター(例: ボタンが押されていない マウス)は、そのマウスイベントを防止できません。
mouseover、mouseout、mouseenter、および
mouseleave イベントは(ポインターが押下状態であっても)決して防止されません。
pointer event の EventListener が
passive
[DOM] に
設定されている場合、互換性マウスイベントは防止できません。
プライマリポインターのみが互換性マウスイベントを生成できますが、
複数のプライマリポインターが同時にアクティブになり、それぞれが独自の
互換性マウスイベントを生成できます。MouseEvents に依存するスクリプトとの互換性のために、マウス遷移イベント
(mouseover、mouseout、mouseenter および
mouseleave)は、単一のレガシーマウス入力の移動をシミュレートするべきです
SHOULD。これは、すべてのイベントターゲットについて入出状態が
[UIEVENTS] に従って有効であることを意味します。ユーザーエージェントは、
文書内の レガシーマウスポインターの実効位置を次のように維持することで、これを保証すべきです
SHOULD。
pointerdown、pointerup または pointermove イベント、または window での
pointerleave イベントを発火する直前に、ユーザーエージェントは
次の手順を実行すべきです SHOULD:
pointerdown、pointerup または pointermove イベントのターゲットとします。pointerleave イベントについては、T を未設定にします。
mouseover、mouseout、mouseenter および
mouseleave イベントを dispatch します。現在の レガシーマウスポインターの実効位置または
T のいずれかの未設定値は、ウィンドウ外のマウス位置とみなします。
レガシー
マウスポインターの実効位置は、pointer 遷移イベント(pointerover、
pointerout、pointerenter および pointerleave)から
対応するレガシーマウス遷移イベント(mouseover、mouseout、
mouseenter および mouseleave)へ、常に直接マッピングできるわけではない
という事実をモデル化します。次のアニメーションは、ユーザーエージェントが、単一のレガシーマウス入力を
使用して 2 つのプライマリポインターを調停できるようにするため、pointer 遷移イベントよりも多くの
レガシーマウス遷移イベントを dispatch する必要がある場合を示しています。
このアニメーションでは、マウスクリックと touch tap の間の時間帯に注意してください。Button 1 は
pointerout イベントを受け取りません(この期間内に「実際の」マウスポインターがボタンの矩形から
離れていないため)が、touch tap で レガシーマウスポインターの実効位置が
Button 2 へ移動したとき、Button 1 は mouseout イベントを受け取ります。同様に、touch
tap とマウスが Button 1 を離れる直前までの時間帯では、同じ理由で Button 1 は
pointerover イベントを受け取りませんが、レガシーマウスポインターの実効位置が
Button 1 の内部へ戻ったとき、Button 1 は mouseover イベントを受け取ります。
ユーザーエージェントが hover をサポートするデバイスについて pointer event を dispatch するときは常に、次の手順を 実行すべきです SHOULD:
isPrimary プロパティが false の場合、
その pointer event を dispatch し、これらの手順を終了します。pointerdown、pointerup または pointermove イベント、または window での
pointerleave イベントである場合、
レガシーマウス
ポインターの実効位置の追跡で説明されるように、互換性マウス遷移イベントを dispatch します。
pointerdown であり、event のキャンセル済みフラグが設定されている場合、この
pointerType について PREVENT MOUSE EVENT フラグを設定します。
PREVENT MOUSE EVENT フラグがこの pointerType について設定されて
いない場合で、dispatch された pointer event が次のいずれかであった場合:
pointerdown なら、
mousedown イベントを発火します。
pointermove なら、
mousemove イベントを発火します。
pointerup なら、
mouseup イベントを発火します。
pointercancel なら、
window で mouseup イベントを発火します。
pointerup または pointercancel であった場合、この
pointerType について PREVENT MOUSE EVENT フラグをクリアします。
ほとんどのタッチスクリーンなど、一部のデバイスは、アクティブ状態でない間に座標(または座標の集合)を hover することを サポートしません。マウスイベントに対して書かれた既存コンテンツの多くは、マウスがイベントを生成していると仮定しており、 したがって特定の性質が一般に true であると仮定します:
mousemove イベントを生成する可能性が高いです。
これにより、ユーザーエージェントはこれらの種類の入力デバイスに対して異なるマッピングを提供する必要があります。 ユーザーエージェントが hover をサポートしないデバイスについて pointer event を dispatch するときは常に、次の手順を実行すべきです SHOULD:
isPrimary プロパティが false の場合、
その pointer event を dispatch し、これらの手順を終了します。pointerover であり、このポインターについて
pointerdown イベントがまだ dispatch されていない場合、
mousemove イベントを発火します(レガシーのマウス固有コードとの互換性のため)。
pointerdown、pointerup または pointermove イベント、または window での
pointerleave イベントである場合、
レガシーマウス
ポインターの実効位置の追跡で説明されるように、互換性マウス遷移イベントを dispatch します。
pointerdown であり、event のキャンセル済みフラグが設定されている場合、この
pointerType について PREVENT MOUSE EVENT フラグを設定します。
PREVENT MOUSE EVENT フラグがこの pointerType について設定されて
いない場合で、dispatch された pointer event が次のいずれかであった場合:
pointerdown なら、
mousedown イベントを発火します。
pointermove なら、
mousemove イベントを発火します。
pointerup なら、
mouseup イベントを発火します。
pointercancel なら、
window で mouseup イベントを発火します。
pointerup または pointercancel であった場合、この
pointerType について PREVENT MOUSE EVENT フラグをクリアします。
ユーザーエージェントが Touch Events([TOUCH-EVENTS] で定義されるもの) と Pointer Events の両方をサポートする場合、ユーザー エージェントは、このセクションで説明される互換性マウスイベントと、[TOUCH-EVENTS] で概説される フォールバックマウスイベントの両方を 生成してはなりません MUST NOT。
hover をサポートしないプライマリポインター
(例: タッチスクリーン上の 1 本の指)による要素のアクティベーション(click)は、通常、
次のイベントシーケンスを生成します:
mousemovepointeroverpointerentermouseovermouseenterpointerdownmousedownpointermove
および mousemove イベント
pointerupmouseuppointeroutpointerleavemouseoutmouseleaveclickしかし、このインタラクション中に pointerdown イベントの
キャンセル済みフラグが
設定された場合、イベントシーケンスは次のようになります:
mousemovepointeroverpointerentermouseovermouseenterpointerdownpointermove
イベントpointeruppointeroutpointerleavemouseoutmouseleaveclickこの付録では、Pointer Events 実装に関するセキュリティおよびプライバシー上の考慮事項について説明します。 この議論は、この仕様で定義されるイベントモデル、API、およびイベントの実装から直接生じるセキュリティおよび プライバシーの問題に限定されます。
この仕様で定義されるイベント型の多くは、ユーザー操作に応じて dispatch されます。これにより、悪意のある イベントリスナーが、ユーザーが通常は機密と考える情報、たとえばユーザーがページとやり取りしている間の マウス/stylus/指の正確な経路/移動へアクセスできるようになります。
Pointer events には、(ユーザーのデバイスがサポートしている場合)ペン入力が保持されている角度や傾き、 接触面のジオメトリ、stylus またはタッチスクリーンに加えられた圧力などの追加情報が含まれます。 角度、傾き、ジオメトリ、および圧力に関する情報は、ユーザーのデバイス上のセンサーに直接関連しており、 つまりこの仕様は origin がこれらのセンサーへアクセスすることを許可します。
このセンサーデータ、および使用された入力機構の種類(mouse、touch、pen)を判断する能力は、ユーザー、 またはユーザーのデバイスおよび環境の特徴を推測するために使用される可能性があります。これらの推測された特徴や デバイス/環境情報は、それ自体が機微である可能性があります — たとえば、ユーザーが支援技術を使用しているかどうかを、 悪意のあるサイトがさらに推測できるようにする可能性があります。この情報は、ユーザープロファイルの構築や、 特定のユーザーを「fingerprint」して追跡しようとする目的にも使用される可能性があります。
緩和策として、ユーザーエージェントは、ユーザーが特定のセンサーデータ(角度、傾き、圧力など)へのアクセスを 無効にできる機能、および/またはユーザーからの明示的な opt-in 後にのみ利用可能にする機能を含めることを 検討してもよいです。
この仕様は、作者が「予測イベント」へアクセスできる方法を定義します。仕様自体は、ユーザーエージェントが予測に 使用すべきアルゴリズムを定義しません。仕様の作者は、そのアルゴリズムが、ユーザーが実行している現在の ジェスチャーに関連する先行 pointer events のみに依存することを想定しています。予測アルゴリズムの具体的な実装が、 ユーザーの異なるサイトにまたがる完全なインタラクション履歴など、ユーザーに関する機微情報を明らかにしたり、 ユーザーを「fingerprint」して追跡するために使用できる追加データに依存しないことを保証する責任は、 ユーザーエージェントにあります。
これらの考慮事項を超えて、ワーキンググループは、この仕様が次のとおりであると考えています:
このセクションは非規範的です。
buttons プロパティについて 0 でない値を持つ状態。mouse では、デバイスの少なくとも
1 つのボタンが押されているときです。touch では、デジタイザーとの物理的接触があるときです。pen では、
pen がデジタイザーに物理的に接触しているか、hover 中に少なくとも 1 つのボタンが押されているときです。pointerId によって識別される)が
文書内で追加のイベントを生成できる可能性がある場合、そのポインターはまだアクティブとみなされます。例:
WheelEvent インターフェイスをサポートする入力デバイス
(マウスホイールやタッチパッドなど)の物理的移動に応じて、ユーザーエージェントがページをスクロールまたは
ズームする推定スクロール量(ピクセル、行、またはページ単位)。デルタの値(例: deltaX、
deltaY、または deltaZ 属性)は、現在の
deltaMode プロパティのコンテキストで解釈されます。
ホイール(または他のデバイス)の物理的移動と、デルタが正か負かとの関係は、
環境およびデバイスに依存します。しかし、ユーザーエージェントが既定の動作としてスクロールする場合、
デルタの符号は、
正の X、Y、および Z 軸が、それぞれ文書の最も右側の端、
最も下側の端、および最も遠い奥行き(ユーザーから離れる方向)を向く右手座標系によって与えられます。
測定可能なプロパティは、実数または大きな定義域の整数を用いて表現される連続的なポインターセンサーデータに関連する
値を表します。pointer events では、width、height、
pressure、tangentialPressure、tiltX、
tiltY、twist、altitudeAngle、azimuthAngle、
および [UIEVENTS] Mouse
Event モデルのプロパティ
screenX、screenY、clientX、clientY は
測定可能なプロパティです。
対照的に、pointerId、pointerType、
isPrimary、および
[UIEVENTS] Mouse Event モデルのプロパティ button、
buttons、ctrlKey、shiftKey、altKey、
および metaKey は、センサーデータに関連しないため、測定可能なプロパティとはみなされません。
WheelEvent インターフェイスを使用する入力デバイス上の
増分変化の指標。一部のデバイスではこれはホイールの文字どおりの回転であってもよく
MAY、他のデバイスでは平面上の移動、または特定のボタンへの圧力であってもよい
MAY です。
ヒットテスト機能が、ターゲットを決定するために使用されます。 ヒットテストおよび重なり順序に関する具体的な詳細については、ホスト言語を参照してください。
このセクションは規範的です。 以下の機能は廃止済みであり、レガシーソフトウェアとの互換性を必要とする ユーザーエージェントによってのみ 実装されるべきです。[UIEvents] の レガシーイベント初期化子も参照してください。
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 です。
提案や推奨を寄せてくださった多くの方々に深く感謝します。その一部はこの文書に取り込まれています。 グループの Chair は、以下の過去および現在のグループメンバーと参加者からの貢献に感謝します: 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.
過去に mouse および wheel events を扱った方々に感謝します: Gary Kacmarcik, Travis Leithead, and the 長年にわたる さまざまな貢献者。
このモデルの初版を先導する手助けをしてくださった方々に特別な感謝を捧げます。特に: Charu Chandiram, Peter Freiling, Nathan Furtwangler, Thomas Olsen, Matt Rakow, Ramu Ramanathan, Justin Rogers, Jacob Rossi, Reed Townsend and Steve Wright.
このセクションは非規範的です。
以下は、[PointerEvents3] 仕様に対する、 この仕様の公開間における実質的および主要な編集上の変更の参考用要約です。 この仕様の Editor's Drafts の完全な改訂履歴を参照してください。
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;
readonly attribute boolean momentum;
};
dictionary WheelEventInit : MouseEventInit {
double deltaX = 0.0;
double deltaY = 0.0;
double deltaZ = 0.0;
unsigned long deltaMode = 0;
boolean momentum = false;
};
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: