タッチイベント - レベル 2

コミュニティグループ最終報告書

このバージョン:
https://www.w3.org/community/reports/touchevents/CG-FINAL-touch-events-20240704/
最新の公開版:
https://www.w3.org/community/reports/touchevents/CG-FINAL-touch-events-20240704/
編集者による最新草案:
https://w3c.github.io/touch-events/
編集者:
Doug Schepers (W3C)
Sangwhan Moon (Opera Software ASA)
Matt Brubeck (Mozilla)
Arthur Barstow (招待専門家)
Rick Byers (Google)
Patrick H. Lauke (TetraLogical)
リポジトリ
GitHub にあります。
バグを報告する。
コミット履歴。
メーリングリスト。

この文書のステータス

この仕様は Touch Events Community Groupによって公開されました。これはW3C標準ではなく、W3Cの標準化トラック上にもありません。 次に示す W3C Community Final Specification Agreement (FSA) の下では、その他の条件が適用されることにご注意ください。 詳しくは W3C Community and Business Groupsをご覧ください。

この仕様は Touch Events Community Group によって公開されました。これはW3C標準ではなく、W3Cの標準化トラック上にもありません。

次に示す W3C Community Final Specification Agreement (FSA) の下では、その他の条件が適用されることにご注意ください。

この仕様のこの版は Touch Events Level 1 に対する修正および改善を含み、以前に公開された Touch Event Extensions の機能を取り込みます。

注記

現在、Touch Events に関するさらなる作業を継続する意図はありません。本書は、元の Touch Events Level 1 仕様の公開以降、ユーザーエージェントで行われた追加および変更を反映するために維持されています。コミュニティグループは Touch Events をレガシーな API と見なしており、作成者には代わりに Pointer Events の採用を強く推奨します。

要約

Touch Events 仕様は、タッチ感知表面への 1 つ以上の接触点を表し、これらの点が表面やその上に表示される任意の DOM 要素(例:タッチスクリーン)またはそれに関連する要素(例:ディスプレイを持たない描画用タブレット)に対してどのように変化するかを表す一連の低レベルイベントを定義します。また、スタイラスの機能を考慮して、描画用タブレットなどのペン・タブレット装置にも対応します。

1. はじめに

この節は規範ではありません。

ウェブアプリケーションにタッチ入力を提供する端末上で動作するユーザーエージェントは通常、ユーザーがインタラクティブなウェブアプリケーションにアクセスできるように解釈されたマウスイベントを使用します。しかし、これらの解釈されたイベントは物理的なタッチ入力に基づいて正規化されたデータであるため、意図したユーザー体験を提供する上で制約があることが多いです。さらに、システムレベルの制限やレガシー互換性のため、マウスイベントの制約によりデバイスの能力にかかわらず同時入力を扱うことができません。

一方で、ネイティブアプリケーションは提供されるシステム API を使って両方のケースに対処できます。

Touch Events 仕様は、ウェブアプリケーションがタッチイベントおよび複数のタッチ点を直接扱えるようにするインターフェイスを定めることで、この問題に対する解決策を提供します。

2. 適合性

非規範としてマークされた節に加え、この仕様中のすべての作成ガイドライン、図、例、および注記は非規範です。本仕様のその他のすべては規範です。

文書中のキーワード MUST は、 BCP 14 [RFC2119] [RFC8174] に記載されているとおりに解釈されます。ただし、それらがここに示すように完全に大文字で表示されている場合に限ります。

この仕様は、そのインターフェイスを実装する単一の製品、すなわちユーザーエージェントに適用される適合基準を定義します。

WindowProxy は [HTML5] に定義されています。

2.1 WebIDL 適合性

この仕様の IDL ブロックは、WebIDL 仕様によって定義される適合する IDL 断片です [WEBIDL]。

適合するユーザーエージェントは、本仕様のこれらの IDL 断片に対して 適合する JavaScript 実装 である必要がありますが、次の例外を許容します:

注記:IDL 属性を反映するどちらの方法でも、プラットフォームオブジェクト上で単純にプロパティを取得および設定することが機能します。例えば、Touch オブジェクト aTouch が与えられたとき、aTouch.target を評価するとその Touch オブジェクトの EventTarget が返されます。ユーザーエージェントが IDL 属性をアクセッサプロパティとして実装している場合、プロパティアクセスは getter を呼び出して EventTarget を返します。ユーザーエージェントがアクセッサプロパティと同等の振る舞いを持つデータプロパティとしてプラットフォームオブジェクトに実装している場合、オブジェクトは own プロパティ名 target を持ち、その値が EventTarget オブジェクトであり、プロパティアクセスはその値を返します。

3. Touch インターフェイス

このインターフェイスは、タッチイベントの個々の タッチポイント を記述します。Touch オブジェクトは不変であり、一度作成された後はその属性を変更してはなりません。

WebIDLenum TouchType {
    "direct",
    "stylus"
};

dictionary TouchInit {
    required long        identifier;
    required EventTarget target;
             double      clientX = 0;
             double      clientY = 0;
             double      screenX = 0;
             double      screenY = 0;
             double      pageX = 0;
             double      pageY = 0;
             float       radiusX = 0;
             float       radiusY = 0;
             float       rotationAngle = 0;
             float       force = 0;
             double      altitudeAngle = 0;
             double      azimuthAngle = 0;
             TouchType   touchType = "direct";
};

[Exposed=Window]
interface Touch {
    constructor(TouchInit touchInitDict);
    readonly        attribute long        identifier;
    readonly        attribute EventTarget target;
    readonly        attribute double      screenX;
    readonly        attribute double      screenY;
    readonly        attribute double      clientX;
    readonly        attribute double      clientY;
    readonly        attribute double      pageX;
    readonly        attribute double      pageY;
    readonly        attribute float       radiusX;
    readonly        attribute float       radiusY;
    readonly        attribute float       rotationAngle;
    readonly        attribute float       force;
    readonly        attribute float       altitudeAngle;
    readonly        attribute float       azimuthAngle;
    readonly        attribute TouchType   touchType;
};
identifier

タッチポイント に割り当てられる識別番号です。

タッチポイントがアクティブになると、他のいかなるアクティブなタッチポイントとも異なる identifier を割り当てられなければなりません。タッチポイントがアクティブである限り、そのタッチポイントを参照するすべてのイベントは同じ identifier を割り当てなければなりません。

target

タッチポイントが最初に表面に置かれたときにそのタッチポイントが開始された EventTarget です。たとえタッチポイントがその後その要素のインタラクティブ領域の外に移動したとしても、最初に開始した要素が返されます。

注記

一部の実装では、粗い入力の不正確さを補正するためにターゲット要素を変更することがあります。したがって、ターゲット要素が必ずしもイベント座標上の要素と一致するとは限りません。粗い入力のターゲティングや曖昧性の解消に用いられる方法は本仕様の範囲外です。

screenX

画面に対する点の水平方向の座標(ピクセル単位)

screenY

画面に対する点の垂直方向の座標(ピクセル単位)

clientX

ビューポートに対する点の水平方向の座標(スクロールオフセットを除く、ピクセル単位)

clientY

ビューポートに対する点の垂直方向の座標(スクロールオフセットを除く、ピクセル単位)

pageX

ビューポートに対する点の水平方向の座標(スクロールオフセットを含む、ピクセル単位)

pageY

ビューポートに対する点の垂直方向の座標(スクロールオフセットを含む、ピクセル単位)

radiusX

rotationAngle で示される軸に沿った接触領域(例:指、スタイラス)を最も近似する楕円の半径(CSS ピクセル単位、[CSS-VALUES] に定義されたもの)で、screenX と同じスケール。値が不明な場合は 0。値は負であってはなりません。

radiusY

rotationAngle で示される軸に直交する軸に沿った接触領域を最も近似する楕円の半径(CSS ピクセル単位、[CSS-VALUES] に定義されたもの)で、screenY と同じスケール。値が不明な場合は 0。値は負であってはなりません。

rotationAngle

radiusX と radiusY で記述される楕円が中心を軸に時計回りに回転している角度(度数)。値が不明な場合は 0。値は 0 以上かつ 90 未満である必要があります。

もし radiusX と radiusY で記述される楕円が円形であれば、rotationAngle は影響を持ちません。この場合、ユーザーエージェントは 0 を使用してもよく、または許容される範囲内の任意の値を使用しても構いません。(例えば、突然の変化を避けるために前回のタッチイベントの rotationAngle 値を使用することがあります。)

force

適用された圧力の相対値で、範囲は 0 から 1。ここで 0 は圧力なし、1 はタッチデバイスが感知可能な最大圧力を表します。値が不明な場合は 0。力(force)が既知の環境では、force 属性が表す絶対圧力や圧力感度のレベルは異なる場合があります。

altitudeAngle

トランスデューサ(例:ペン/スタイラス)の高度(ラジアン単位)、範囲は [0, π/2] — ここで 0 は表面(X-Y 平面)と平行、π/2 は表面に垂直を表します。チルトや角度を報告しないハードウェアやプラットフォームでは、値は MUST0 にする必要があります。

注記
ここで定義されている altitudeAngle のデフォルト値は 0 です。これは Pointer Events - Level 3 [POINTEREVENTS] 仕様における altitudeAngle プロパティのデフォルト値(π/2、すなわちトランスデューサが表面に垂直であることを示す)とは異なります。
altitudeAngle explanation diagram
Figure 1 例:altitudeAngle が π/4(X-Y 平面から45度)の場合。
azimuthAngle

トランスデューサ(例:ペン/スタイラス)の方位角(ラジアン単位)、範囲は [0, 2π] — ここで 0 はキャップが X 値の増加方向(真上から見て「3時」を指す方向)を向いていることを表し、値は時計回りに増加します(π/2 が「6時」、π が「9時」、3π/2 が「12時」)。トランスデューサが完全に表面に垂直(altitudeAngle が π/2)の場合、値は MUST0 にする必要があります。チルトや角度を報告しないハードウェアやプラットフォームでは、値は MUST0 にする必要があります。

azimuthAngle explanation diagram
Figure 2 例:azimuthAngle が π/6(「4時」の方向)。
touchType

タッチを引き起こしたデバイスの種類。

TouchType

可能なタッチ入力の種類を表す列挙型。

direct

画面上の指による直接のタッチ。

stylus

スタイラスやペンデバイスによるタッチ。

4. TouchList インターフェイス

このインターフェイスは、タッチイベントの個々の接触点のリストを定義します。TouchList オブジェクトは不変であり、一度作成された後はその内容を変更してはなりません。

TouchList オブジェクトの supported property indices([WEBIDL)は、リストの長さの1つ少ない数までの範囲の番号です。

WebIDL[Exposed=Window]
interface TouchList {
    readonly        attribute unsigned long length;
    getter Touch? item (unsigned long index);
};
length

リスト内の Touch オブジェクトの数を返します

item

指定されたインデックスのリスト内の Touch を返すか、インデックスがリストの長さ未満でない場合は null を返します。

5. TouchEvent インターフェイス

このインターフェイスは touchstarttouchendtouchmove、および touchcancel のイベント型を定義します。TouchEvent オブジェクトは不変であり、一度作成・初期化された後はその属性を変更してはなりません。TouchEvent は [DOM-LEVEL-3-EVENTS] で定義された UIEvent インターフェイスを継承します。

TouchEventInit 辞書は、信頼されない(合成)タッチイベントを構築するためのメカニズムを提供するために TouchEvent インターフェイスのコンストラクタによって使用されます。これは [DOM-LEVEL-3-EVENTS] で定義された EventModifierInit 辞書を継承します。イベント構築の手順は [DOM4] に定義されています。合成タッチイベントを発火するサンプルコードについては を参照してください。

WebIDLdictionary TouchEventInit : EventModifierInit {
            sequence<Touch> touches = [];
            sequence<Touch> targetTouches = [];
            sequence<Touch> changedTouches = [];
};

[Exposed=Window]
interface TouchEvent : UIEvent {
    constructor(DOMString type, optional TouchEventInit eventInitDict = {});
    readonly        attribute TouchList touches;
    readonly        attribute TouchList targetTouches;
    readonly        attribute TouchList changedTouches;
    readonly        attribute boolean   altKey;
    readonly        attribute boolean   metaKey;
    readonly        attribute boolean   ctrlKey;
    readonly        attribute boolean   shiftKey;
    getter boolean getModifierState (DOMString keyArg);
};
touches

現在表面に触れているすべての接触点に対応する Touch オブジェクトのリスト。

targetTouches

現在表面に触れており、かつ現在のイベントのターゲットである要素上で開始されたすべての接触点に対応する Touch オブジェクトのリスト。

changedTouches

イベントに寄与したすべての接触点に対応する Touch オブジェクトのリスト。

touchstart イベントの場合、これは現在のイベントで新たにアクティブになったタッチポイントのリストでなければなりません。touchmove イベントの場合、これは前回のイベント以降に移動したタッチポイントのリストでなければなりません。touchend および touchcancel イベントの場合、これは表面からちょうど取り除かれたタッチポイントのリストであり、取り除かれる前のタッチポイントの最後に知られている座標を含まなければなりません。

altKey

alt(Alternate)キー修飾が有効な場合は true;それ以外は false

metaKey

meta(Meta)キー修飾が有効な場合は true;それ以外は false。プラットフォームによっては別名の修飾キーにマップされることがあります。

ctrlKey

ctrl(Control)キー修飾が有効な場合は true;それ以外は false

shiftKey

shift(Shift)キー修飾が有効な場合は true;それ以外は false

getModifierState(keyArg)

キー値を使用して修飾キーの状態を照会します。修飾キーでありかつその修飾が有効な場合は true、それ以外は false を返します。

5.1 TouchEvent 実装者向けノート

この節は規範ではありません。

注記

ユーザーエージェントは、与えられた Touch オブジェクトのすべてが、該当する TouchEvent が配信されたのと同じドキュメントに関連付けられていることを保証すべきです。これを実装するために、ユーザーエージェントは現在の touch-active ドキュメントの概念を維持するべきです。最初のタッチ時に、これはタッチが作成されたターゲットドキュメントに設定されます。すべてのアクティブなタッチポイントが解放されると、touch-active ドキュメントはクリアされます。すべての TouchEvent は現在の touch-active ドキュメントにディスパッチされ、その中の各 Touch オブジェクトはそのドキュメント内の DOM 要素(および座標)のみを参照します。タッチが完全に現在の touch-active ドキュメントの外で開始された場合、それは完全に無視されます。

5.2 使用例

この節は規範ではありません。

以下の例は、TouchList の異なるメンバー間の関係を、TouchEvent 内で示すものです。

5.2.1 touchestargetTouchesTouchEvent の場合)

この例は、TouchEvent インターフェイスで定義された touchestargetTouches メンバー間の有用性と関係を示します。以下のコードは、タッチ可能な要素およびドキュメント上のタッチポイントの数に応じて異なる出力を生成します:

<div id="touchable">This element is touchable.</div>

<script>
document.getElementById('touchable').addEventListener('touchstart', function(ev) {

    if (ev.touches.item(0) == ev.targetTouches.item(0))
    {
        /**
         * If the first touch on the surface is also targeting the
         * "touchable" element, the code below should execute.
         * Since targetTouches is a subset of touches which covers the
         * entire surface, TouchEvent.touches >= TouchEvents.targetTouches
         * is always true.
         */

        document.write('Hello Touch Events!');
    }

    if (ev.touches.length == ev.targetTouches.length)
    {
        /**
         * If all of the active touch points are on the "touchable"
         * element, the length properties should be the same.
         */

        document.write('All points are on target element')
    }

    if (ev.touches.length > 1)
    {
        /**
         * On a single touch input device, there can only be one point
         * of contact on the surface, so the following code can only
         * execute when the terminal supports multiple touches.
         */

        document.write('Hello Multiple Touch!');
    }

}, false);
</script>

5.2.2 changedTouchesTouchEvent の場合)

この例は changedTouches の有用性と、TouchList の他のメンバーとの関係を示します。以下のコードは、定義されたタッチ可能要素からタッチポイントが取り除かれるたびにトリガーされる例です:

<div id="touchable">This element is touchable.</div>

<script>
document.getElementById('touchable').addEventListener('touchend', function(ev) {

    /**
     * Example output when three touch points are on the surface,
     * two of them being on the "touchable" element and one point
     * in the "touchable" element is lifted from the surface:
     *
     * Touch points removed: 1
     * Touch points left on element: 1
     * Touch points left on document: 2
     */

    document.write('Touch points removed: ' + ev.changedTouches.length);
    document.write('Touch points left on element: ' + ev.targetTouches.length);
    document.write('Touch points left on document: ' + ev.touches.length);

}, false);
</script>

5.2.3 スクリプトから合成的な TouchEvent を発火させる

この例は、スクリプトから TouchEvent を作成して発火する方法を示します。

if (Touch.length < 1 || TouchEvent.length < 1)
  throw "TouchEvent constructors not supported";

var touch = new Touch({
    identifier: 42,
    target: document.body,
    clientX: 200,
    clientY: 200,
    screenX: 300,
    screenY: 300,
    pageX: 200,
    pageY: 200,
    radiusX: 5,
    radiusY: 5
});

var touchEvent = new TouchEvent("touchstart", {
    cancelable: true,
    bubbles: true,
    composed: true,
    touches: [touch],
    targetTouches: [touch],
    changedTouches: [touch]
});

document.body.dispatchEvent(touchEvent);

5.3 TouchEvent 型の一覧

この節は規範ではありません。

次の表は本仕様で定義される TouchEvent イベント型の概要を示します。すべてのイベントはバブリングフェーズを達成するべきです。すべてのイベントは [WHATWG-DOM] に準拠した合成イベントであるべきです。

イベント型 同期/非同期 バブリングフェーズ 合成 信頼済み近接イベントターゲットの型 インターフェイス キャンセル可能性 デフォルト動作
touchstart 同期 はい はい Document, Element TouchEvent 状況により異なる 未定義
touchend 同期 はい はい Document, Element TouchEvent 状況により異なる 状況により異なる:ユーザーエージェントは マウスおよびクリックイベント を発行する場合があります
touchmove 同期 はい はい Document, Element TouchEvent 状況により異なる 未定義
touchcancel 同期 はい はい Document, Element TouchEvent いいえ なし

5.4 タッチイベントのキャンセル可能性

タッチイベントのキャンセル は、スクロール(スクリプト実行と並行して発生している可能性がある)を防止または中断するのを防ぐことができます。スクロールの最大パフォーマンスを確保するために、ユーザーエージェントはスクロールに関連する各タッチイベントがキャンセルされるかを確認するために各イベントの処理を待たない場合があります。そのような場合、ユーザーエージェントは cancelable プロパティが false のタッチイベントを生成すべきであり、これは preventDefault がスクロールを防止または中断するために使用できないことを示します。そうでない場合、cancelabletrue になります。

特に、ユーザーエージェントはイベントに対して 非パッシブなリスナが存在しないことを観測した とき、キャンセル不可能なタッチイベントのみを生成するべきです。

5.5 The touchstart イベント

ユーザーエージェントは、ユーザーがタッチポイントをタッチ面に置いたときにこのイベント型を送出しなければなりません。

このイベントのターゲットは Element でなければなりません。タッチポイントがフレーム内にある場合、そのイベントはそのフレームの子ブラウジングコンテキスト内の要素に送出されるべきです。

このイベントが キャンセル された場合、それは同じ アクティブタッチポイント に関連する任意のタッチイベントによって引き起こされるデフォルト動作(マウスイベントやスクロールなど)を防止すべきです。

5.6 The touchend イベント

ユーザーエージェントは、ユーザーがタッチポイントをタッチ面から取り除いたとき(画面外へドラッグされるなど、タッチポイントが物理的にタッチ面を離れる場合を含む)にこのイベント型を送出しなければなりません。

このイベントのターゲットは、タッチポイントが最初に表面に置かれたときに開始された同じ Element でなければなりません。たとえタッチポイントがその後ターゲット要素のインタラクティブ領域の外に移動していたとしても同様です。

取り除かれたタッチポイントは、changedTouches 属性に含まれなければならず、touches および targetTouches 属性には含まれてはなりません。

このイベントが キャンセル された場合、このイベントを含む任意のタッチイベントのシーケンスは クリックとして解釈されてはなりません

5.7 The touchmove イベント

ユーザーエージェントは、ユーザーがタッチポイントをタッチ面上で移動させたときにこのイベント型を送出しなければなりません。

このイベントのターゲットは、タッチポイントが最初に表面に置かれたときに開始された同じ Element でなければなりません。たとえタッチポイントがその後ターゲット要素のインタラクティブ領域の外に移動していたとしても同様です。

touchmove イベントをユーザーエージェントが送出する頻度は実装依存であり、ハードウェアの能力や実装の詳細に依存する場合があります。

ユーザーエージェントは、同じ アクティブタッチポイント に関連する少なくとも1つの touchmove イベントが キャンセルされていない ことが判明するまで、任意の touchmove イベントによって引き起こされるデフォルト動作を抑制するべきです。同じアクティブタッチポイントに関連する少なくとも1つの touchmove イベントがキャンセルされていないと判明した後にデフォルト動作が抑制されるかどうかは実装依存です。

5.8 The touchcancel イベント

ユーザーエージェントは、例えば UA から発生する同期イベントやアクションによってタッチがキャンセルされた場合や、タッチポイントがドキュメントウィンドウを離れてネイティブの UI 等のユーザー操作を扱える非ドキュメント領域に入った場合など、実装依存の方法でタッチポイントが中断されたことを示すためにこのイベント型を送出しなければなりません。ユーザーエージェントはまた、ユーザーがデバイスや実装が保持するよう構成されている数より多くのタッチポイントを表面に置いた場合にもこのイベント型を送出してもよく、その場合は Touch オブジェクトのうち先頭のものが TouchList から削除されるべきです。

このイベントのターゲットは、タッチポイントが最初に表面に置かれたときに開始された同じ Element でなければなりません。たとえタッチポイントがその後ターゲット要素のインタラクティブ領域の外に移動していたとしても同様です。

取り除かれたタッチポイントは、changedTouches 属性に含まれなければならず、touches および targetTouches 属性には含まれてはなりません。

6. リターゲティング

次の節では、[WHATWG-DOM] に定義された リターゲティング手順 を説明します。

Touch オブジェクトには関連付けられた unadjustedTarget(null または EventTarget)があります。特に記載がない限り、これは null です。

TouchEventリターゲティング手順 は、与えられた touchEvent に対して以下の手順を実行しなければなりません:

  1. Touch の各 touch について、touchEventtouchestargetTouches、および changedTouches メンバー内で次の処理を行います:

    1. もし touchunadjustedTarget が null の場合、touchunadjustedTargettouchtarget に設定します。
    2. touchtarget を、リターゲティング を用いて touchunadjustedTargettouchEventtarget に対して評価した結果に設定します。

7. レガシーなタッチイベントAPIの条件付き公開

ユーザーエージェントには、ブール値の expose legacy touch event APIs が関連付けられており、その値は 実装依存 です。

注記

既存のウェブコンテンツは、これらの API の存在をユーザーエージェントがタッチ対応の "モバイル" デバイスであるというシグナルとして使うことが多く、非モバイルデバイス上でこれらの API を公開すると(たとえタッチ対応であっても)、そのようなウェブコンテンツにとって最適でないユーザー体験を引き起こす可能性があります。

8. GlobalEventHandlers ミックスインへの拡張

次の節は、既存の GlobalEventHandlers ミックスイン([HTML5] に定義)への拡張を説明し、イベントハンドラ登録を容易にします。expose legacy touch event APIs が false のユーザーエージェントでは、このミックスインを実装してはなりません。

WebIDLpartial interface mixin GlobalEventHandlers {
                    attribute EventHandler ontouchstart;
                    attribute EventHandler ontouchend;
                    attribute EventHandler ontouchmove;
                    attribute EventHandler ontouchcancel;
};
ontouchstart

touchstart イベント型のイベントハンドラ IDL 属性([HTML5] を参照)です。

ontouchend

touchend イベント型のイベントハンドラ IDL 属性([HTML5] を参照)です。

ontouchmove

touchmove イベント型のイベントハンドラ IDL 属性([HTML5] を参照)です。

ontouchcancel

touchcancel イベント型のイベントハンドラ IDL 属性([HTML5] を参照)です。

9. マウスイベントおよび click との相互作用

ユーザーエージェントは、同じユーザー入力に対してタッチイベントと(タッチを想定していない既存のウェブコンテンツとの互換性のために)マウスイベント [DOM-LEVEL-2-EVENTS] の両方を発行する場合があります。ある単一のユーザー操作に対してタッチイベントとマウスイベントの両方を発行する場合、当該操作に関するいかなるマウスイベントよりも先に touchstart イベント型を送出しなければなりません。もし touchstarttouchmove、または touchendキャンセル された場合、ユーザーエージェントはその防止されたタッチイベントの結果として生じるようなマウスイベントを送出すべきではありません。

注記

もしウェブアプリケーションがタッチイベントを処理できるなら、イベントを キャンセル することで対応するマウスイベントをユーザーエージェントが送出する必要がなくなります。もしウェブアプリケーションがタッチ入力向けに特化して書かれていない場合、代わりにその後のマウスイベントに反応するでしょう。

注記

ユーザーエージェントは通常、単指のアクティベーションジェスチャー(タップや長押しのような)に対してのみマウスおよびクリックイベントを送出します。タッチポイントの移動を伴うジェスチャや、二つ以上の アクティブタッチポイント を含むマルチタッチ操作は、通常タッチイベントのみを生成します。

もしユーザーエージェントが一連のタッチイベントをタップジェスチャとして解釈する場合、対応するタッチ入力の touchend イベントの位置で、順に mousemovemousedownmouseup、および click イベントを送出するべきです。ドキュメントの内容がタッチイベントの処理中に変更された場合、ユーザーエージェントはマウスイベントをタッチイベントとは異なるターゲットに送出してもよいです。

さらなるタッチおよびマウスイベントのデフォルト動作と順序は、ここで特に指定されている場合を除き、実装依存です。

注記

要素のアクティベーション(例えば、いくつかの実装ではタップ)は、通常次のイベントシーケンスを生成します(ただしユーザーエージェントの具体的な挙動により若干異なる場合があります):

  1. touchstart
  2. 指の移動に応じてゼロ個以上の touchmove イベント
  3. touchend
  4. mousemove (旧来のマウス専用コードとの互換性のため)
  5. mousedown
  6. mouseup
  7. click

しかしながら、もし touchstarttouchmove、または touchend のいずれかがこのインタラクション中に キャンセル されていた場合、マウスやクリックイベントは発火されず、結果として得られるイベントシーケンスは単に次のようになります:

  1. touchstart
  2. 指の移動に応じてゼロ個以上の touchmove イベント
  3. touchend
注記

ユーザーエージェントが Touch Events をサポートしていても、必ずしもタッチスクリーンだけが入力手段であるとは限りません。特にタッチ対応ラップトップや、外部の入力デバイスとペアになった従来の「タッチのみ」デバイス(電話やタブレットなど)では、ユーザーはトラックパッド、マウス、またはキーボードと併用してタッチスクリーンを使うことがあります。このため、開発者は「タッチまたはマウス/キーボード」の条件付きでイベントリスナをバインドすることは避けるべきです。そうするとサイト/アプリがタッチ専用になり、他の入力手段を使いたいユーザーを排除してしまいます。


// conditional "touch OR mouse/keyboard" event binding
// DON'T DO THIS, as it makes interactions touch-exclusive
// on devices that have both touch and mouse/keyboard

if ('ontouchstart' in window) {
  // set up event listeners for touch
  target.addEventListener('touchend', ...);
  ...
} else {
  // set up event listeners for mouse/keyboard
  target.addEventListener('click', ...);
  ...
}

代わりに、開発者は異なる形式の入力を同時に扱うべきです。


// concurrent "touch AND mouse/keyboard" event binding

// set up event listeners for touch
target.addEventListener('touchend', function(e) {
  // prevent compatibility mouse events and click
  e.preventDefault();
  ...
});
...

// set up event listeners for mouse/keyboard
target.addEventListener('click', ...);
...

同じインタラクションを二重に処理しないようにするため、開発者は互換性のあるマウスイベントやクリックの生成を抑制するためにタッチイベントを キャンセル することを確認するべきです。あるいは、タッチイベントから生成されたマウスイベントを検出する方法として InputDeviceCapabilities API を参照してください。

10. 用語集

アクティブタッチポイント
現在画面上にありユーザーエージェントによって追跡されているタッチポイント。タッチポイントは、ユーザーエージェントがその出現を示すtouchstart イベントを最初にディスパッチしたときにアクティブになります。タッチポイントは、ユーザーエージェントがタッチポイントが表面から取り除かれたか追跡されなくなったことを示すtouchend または touchcancel イベントをディスパッチした後にアクティブでなくなります。
タッチポイント
ポインタ(例:指やスタイラス)がインターフェースの対象面と交差する座標点。これはタッチスクリーンに指が触れる場合や、紙にデジタルペンで書く場合などに適用されます。
キャンセルされたイベント
デフォルト動作が preventDefault()、イベントハンドラで false を返す、または [DOM-LEVEL-3-EVENTS] および [HTML] に定義されるその他の手段によって防止されたイベント。

A. 謝辞

この節は規範ではありません。

この仕様の基礎として用いられたモデルの開発に尽力した WebKit のエンジニアの皆様、WebKit のタッチイベントの要約を提供してくれた Neil Roberts(SitePen)、執筆と提案で貢献した Peter‑Paul Koch(PPK)、ReSpec.js spec authoring tool を開発した Robin Berjon、そして多くの貢献を行った WebEvents WG に感謝します。

仕様の発展に伴い追加のコメントを寄せてくださった多くの方々にも感謝します。その中には Matthew Schinckel、Andrew Grieve、Cathy Chan、Boris Zbarsky、Patrick H. Lauke、Simon Pieters が含まれます。もしお名前を誤って省略していたらお知らせください。

本仕様のテストスイートに貢献いただいた次の方々に感謝します:Matt Brubeck、Olli Pettay、Art Barstow、Cathy Chan、Rick Byers。

B. 前回公開以降の変更

この節は規範ではありません。

これは、2013年10月10日公開の勧告版以降に行われた主な変更の要約です。完全なコミット履歴 も参照できます。

C. 参考文献

C.1 規範的参照

[CSS-VALUES]
CSS Values and Units Module Level 3. Tab Atkins Jr.; Elika Etemad. W3C. 2024年3月22日. W3C Candidate Recommendation. URL: https://www.w3.org/TR/css-values-3/
[DOM-LEVEL-2-EVENTS]
Document Object Model (DOM) Level 2 Events Specification. Tom Pixley. W3C. 2020年11月3日. W3C Recommendation. URL: https://www.w3.org/TR/DOM-Level-2-Events/
[DOM-LEVEL-3-EVENTS]
UI Events. Gary Kacmarcik; Travis Leithead. W3C. 2024年6月22日. W3C Working Draft. URL: https://www.w3.org/TR/uievents/
[DOM4]
DOM Standard. Anne van Kesteren. WHATWG. 現行標準. URL: https://dom.spec.whatwg.org/
[html]
HTML Standard. Anne van Kesteren; Domenic Denicola; Ian Hickson; Philip Jägenstedt; Simon Pieters. WHATWG. 現行標準. URL: https://html.spec.whatwg.org/multipage/
[HTML5]
HTML5. Ian Hickson; Robin Berjon; Steve Faulkner; Travis Leithead; Erika Doyle Navara; Theresa O'Connor; Silvia Pfeiffer. W3C. 2018年3月27日. W3C Recommendation. URL: https://www.w3.org/TR/html5/
[infra]
Infra Standard. Anne van Kesteren; Domenic Denicola. WHATWG. 現行標準. URL: https://infra.spec.whatwg.org/
[RFC2119]
Key words for use in RFCs to Indicate Requirement Levels. S. Bradner. IETF. 1997年3月. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc2119
[RFC8174]
Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words. B. Leiba. IETF. 2017年5月. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc8174
[WEBIDL]
Web IDL Standard. Edgar Chen; Timothy Gu. WHATWG. 現行標準. URL: https://webidl.spec.whatwg.org/

C.2 参考情報

[POINTEREVENTS]
Pointer Events. Jacob Rossi; Matt Brubeck. W3C. 2019年4月4日. W3C Recommendation. URL: https://www.w3.org/TR/pointerevents/