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