We want to hear from you!Take our 2021 Community Survey!
このサイトの更新は終了しました。ja.react.dev へ

合成イベント (SyntheticEvent)

この記事は古くなっており、今後更新されません。新しい React 日本語ドキュメントである ja.react.dev をご利用ください。

以下の新しいドキュメントで最新の React の使い方がライブサンプル付きで学べます。

このリファレンスガイドでは、React のイベントシステムの一部を構成する SyntheticEvent(合成イベント)ラッパについて説明します。詳細については、イベント処理ガイドを参照してください。

概要

イベントハンドラには、SyntheticEvent のインスタンスが渡されます。これはブラウザのネイティブイベントに対するクロスブラウザ版のラッパです。stopPropagation()preventDefault() を含む、ブラウザのネイティブイベントと同じインターフェイスを持ちつつ、ブラウザ間で同じ挙動をするようになっています。

何らかの理由で実際のブラウザイベントが必要な場合は、単に nativeEvent 属性を使用するだけで取得できます。合成イベントはブラウザのネイティブイベントとは別物であり、直接の対応があるわけでもありません。例えば onMouseLeave イベントの場合、event.nativeEventmouseout イベントになっています。個々の対応については公開 API の範疇ではなく、常に変わる可能性があります。すべての SyntheticEvent オブジェクトは以下の属性を持っています。

boolean bubbles
boolean cancelable
DOMEventTarget currentTarget
boolean defaultPrevented
number eventPhase
boolean isTrusted
DOMEvent nativeEvent
void preventDefault()
boolean isDefaultPrevented()
void stopPropagation()
boolean isPropagationStopped()
void persist()
DOMEventTarget target
number timeStamp
string type

補足

v17 以降、SyntheticEventプーリングされなくなったため、e.persist() は何も行わなくなります。

補足

v0.14 以降、イベントハンドラから false を返してもイベントの伝播は止まりません。代わりに、e.stopPropagation() または e.preventDefault() を手動で呼び出す必要があります。

サポートするイベント

React は異なるブラウザ間でも一貫したプロパティを持つようにイベントを正規化します。

以下のイベントハンドラはイベント伝搬のバブリングフェーズで呼び出されます。キャプチャフェーズのイベントハンドラを登録するには、イベント名に Capture を追加します。たとえば、キャプチャフェーズでクリックイベントを処理するには onClick の代わりに onClickCapture を使用します。


リファレンス

クリップボードイベント

イベント名:

onCopy onCut onPaste

プロパティ:

DOMDataTransfer clipboardData

コンポジションイベント

イベント名:

onCompositionEnd onCompositionStart onCompositionUpdate

プロパティ:

string data

キーボードイベント

イベント名:

onKeyDown onKeyPress onKeyUp

プロパティ:

boolean altKey
number charCode
boolean ctrlKey
boolean getModifierState(key)
string key
number keyCode
string locale
number location
boolean metaKey
boolean repeat
boolean shiftKey
number which

key プロパティは DOM Level 3 Events spec に記載されている任意の値を取ることができます。


フォーカスイベント

イベント名:

onFocus onBlur

これらのフォーカスイベントは、フォーム要素だけでなくすべての React DOM 要素で動作します。

プロパティ:

DOMEventTarget relatedTarget

onFocus

onFocus イベントは要素(あるいはその内部の別の要素)がフォーカスを受け取った時に呼び出されます。例えば、ユーザがテキスト入力をクリックした際に呼び出されます。

function Example() {
  return (
    <input
      onFocus={(e) => {
        console.log('Focused on input');
      }}
      placeholder="onFocus is triggered when you click this input."
    />
  )
}

onBlur

onBlur イベントハンドラは要素(あるいはその内部の別の要素)からフォーカスが外れた場合に呼び出されます。例えば、ユーザが既にフォーカスされているテキスト入力の外側でクリックした場合に呼び出されます。

function Example() {
  return (
    <input
      onBlur={(e) => {
        console.log('Triggered because this input lost focus');
      }}
      placeholder="onBlur is triggered when you click this input and then you click outside of it."
    />
  )
}

フォーカスが当たった・外れたことの検出

currentTargetrelatedTarget を用いることで、フォーカスが当たった・外れた際のイベントが親要素の外側で起こったかどうかを判定できます。以下のコピー・ペーストで使えるデモでは、子要素のどれかへのフォーカス、要素自身へのフォーカス、サブツリー全体から出入りするフォーカスを、それぞれどのように検出するかを示しています。

function Example() {
  return (
    <div
      tabIndex={1}
      onFocus={(e) => {
        if (e.currentTarget === e.target) {
          console.log('focused self');
        } else {
          console.log('focused child', e.target);
        }
        if (!e.currentTarget.contains(e.relatedTarget)) {
          // Not triggered when swapping focus between children
          console.log('focus entered self');
        }
      }}
      onBlur={(e) => {
        if (e.currentTarget === e.target) {
          console.log('unfocused self');
        } else {
          console.log('unfocused child', e.target);
        }
        if (!e.currentTarget.contains(e.relatedTarget)) {
          // Not triggered when swapping focus between children
          console.log('focus left self');
        }
      }}
    >
      <input id="1" />
      <input id="2" />
    </div>
  );
}

フォームイベント

イベント名:

onChange onInput onInvalid onReset onSubmit 

onChange イベントの詳細については、Forms を参照してください。


汎用イベント

イベント名:

onError onLoad

マウスイベント

イベント名:

onClick onContextMenu onDoubleClick onDrag onDragEnd onDragEnter onDragExit
onDragLeave onDragOver onDragStart onDrop onMouseDown onMouseEnter onMouseLeave
onMouseMove onMouseOut onMouseOver onMouseUp

onMouseEnteronMouseLeave イベントは通常のバブリングとは異なり、(ポインタが)出て行った要素から入ってきた要素に伝播し、キャプチャフェーズを持ちません。

プロパティ:

boolean altKey
number button
number buttons
number clientX
number clientY
boolean ctrlKey
boolean getModifierState(key)
boolean metaKey
number pageX
number pageY
DOMEventTarget relatedTarget
number screenX
number screenY
boolean shiftKey

ポインタイベント

イベント名:

onPointerDown onPointerMove onPointerUp onPointerCancel onGotPointerCapture
onLostPointerCapture onPointerEnter onPointerLeave onPointerOver onPointerOut

onPointerEnteronPointerLeave イベントは通常のバブリングとは異なり、(ポインタが)出て行った要素から入ってきた要素に伝播し、キャプチャフェーズを持ちません。

プロパティ:

W3 spec に定義されている通り、ポインタイベントは下記のプロパティを持つマウスイベントの拡張です。

number pointerId
number width
number height
number pressure
number tangentialPressure
number tiltX
number tiltY
number twist
string pointerType
boolean isPrimary

クロスブラウザサポートについての補足:

すべてのブラウザでポインタイベントがサポートされているわけではありません(この記事の執筆時点でサポートされているブラウザは、Chrome、Firefox、Edge、および Internet Explorer です)。標準に準拠したポリフィルは react-dom のバンドルサイズを大幅に増加させるため、React は意図的にその他ブラウザのためのポリフィルを提供しません。

アプリケーションでポインタイベントが必要な場合は、サードパーティのポインタイベントポリフィルを追加することをお勧めします。


選択イベント

イベント名:

onSelect

タッチイベント

イベント名:

onTouchCancel onTouchEnd onTouchMove onTouchStart

プロパティ:

boolean altKey
DOMTouchList changedTouches
boolean ctrlKey
boolean getModifierState(key)
boolean metaKey
boolean shiftKey
DOMTouchList targetTouches
DOMTouchList touches

UI イベント

イベント名:

onScroll

補足

React 17 以降、onScroll イベントはバブルしなくなりました。これはブラウザの挙動と合致しており、スクロール可能な要素がネストされている場合に離れた親要素に対してイベントが発火する場合に起きる混乱を回避できます。

プロパティ:

number detail
DOMAbstractView view

ホイールイベント

イベント名:

onWheel

プロパティ:

number deltaMode
number deltaX
number deltaY
number deltaZ

メディアイベント

イベント名:

onAbort onCanPlay onCanPlayThrough onDurationChange onEmptied onEncrypted
onEnded onError onLoadedData onLoadedMetadata onLoadStart onPause onPlay
onPlaying onProgress onRateChange onSeeked onSeeking onStalled onSuspend
onTimeUpdate onVolumeChange onWaiting

画像イベント

イベント名:

onLoad onError

アニメーションイベント

イベント名:

onAnimationStart onAnimationEnd onAnimationIteration

プロパティ:

string animationName
string pseudoElement
float elapsedTime

遷移イベント

イベント名:

onTransitionEnd

プロパティ:

string propertyName
string pseudoElement
float elapsedTime

その他のイベント

イベント名:

onToggle
Is this page useful?このページを編集する