その他の一般的なイベント
リソースイベント
###アンロードイベント前
「beforeunload」イベントは、ウィンドウ、ドキュメント、さまざまなリソースがアンロードされる前にトリガーされます。これを使用すると、ユーザーがリソースを誤ってアンインストールすることを防ぐことができます。
イベント オブジェクトの returnValue
プロパティが空でない文字列の場合、ブラウザはダイアログ ボックスをポップアップ表示し、リソースをアンインストールするかどうかをユーザーに尋ねます。ただし、ユーザーが指定した文字列は表示されない場合があり、ブラウザには事前定義された文字列が表示されます。ユーザーが「キャンセル」ボタンをクリックした場合、リソースはアンロードされません。
window.addEventListener('beforeunload', function (event) {
event.returnValue = '本当に退会してもよろしいですか? ';
});
上記のコードでは、ユーザーがウィンドウを閉じると、ブラウザーはユーザーに確認を求めるウィンドウをポップアップ表示します。
ブラウザによっては、このイベントに対する動作が非常に不安定になります。また、一部のブラウザでは、「event.preventDefault()」を呼び出すときにダイアログ ボックスが表示されます。 IE ブラウザは、ダイアログ ボックスがポップアップする前に、空ではない文字列を明示的に返す必要があります。さらに、ほとんどのブラウザでは、ダイアログ ボックスに指定されたテキストは表示されず、デフォルトのテキストのみが表示されます。したがって、次の記述方法を使用すると、互換性を最大限に高めることができます。
window.addEventListener('beforeunload', function (e) {
varconfirmationMessage = 'ウィンドウを閉じることを確認しますか? ';
e.returnValue = 確認メッセージ;
確認メッセージを返します。
});
多くのモバイル ブラウザ (Safari など) はデフォルトでこのイベントを無視し、デスクトップ ブラウザにもこのイベントを無視するメソッドがあることに注意してください。したがって、このイベントはまったく効力を持たない可能性があり、ユーザーがブラウザ ウィンドウを閉じるのを防ぐことができず、このイベントを使用しないことをお勧めします。
さらに、「beforeunload」イベントが使用されると、ブラウザは現在の Web ページをキャッシュせず、「戻る」ボタンを使用するとサーバーに Web ページが再要求されます。これは、このイベントを監視する目的は一般に Web ページのステータスであるため、現時点ではページの初期ステータスをキャッシュしても意味がありません。
アンロードイベント
unload
イベントは、ウィンドウが閉じられるか、document
オブジェクトがアンロードされようとしているときにトリガーされます。そのトリガー順序は、beforeunload
および pagehide
イベントの後にあります。
「アンロード」イベントが発生すると、ドキュメントは特別な状態になります。すべてのリソースはまだ存在しますが、ユーザーには表示されず、すべての UI インタラクションは影響を受けません。このイベントは、listen 関数でエラーが発生しても、ドキュメントのアンロードを停止することはできません。
window.addEventListener('アンロード', function(event) {
console.log('ドキュメントはアンロードされます');
});
携帯電話では、ブラウザまたはシステムが Web ページを単純に破棄する場合がありますが、その場合にはイベントはまったく発生しません。そして、「beforeunload」イベントと同様に、「unload」イベントが使用されると、上記と同じ理由でブラウザは現在の Web ページをキャッシュしません。したがって、Web ページのアンロード時に実行されるコードを指定するには、いかなる状況でもこのイベントに依存しないでください。このイベントをまったく使用しないことを検討してください。
このイベントは pagehide
で置き換えることができます。
ロードイベント、エラーイベント
ページまたはリソースが正常に読み込まれると、「load」イベントがトリガーされます。ページまたはリソースがブラウザーのキャッシュからロードされる場合、「load」イベントはトリガーされないことに注意してください。
window.addEventListener('load', function(event) {
console.log('すべてのリソースがロードされました');
});
「error」イベントは、ページまたはリソースの読み込みに失敗したときにトリガーされます。ユーザーがロードをキャンセルすると、「abort」イベントが発生します。
これら 3 つのイベントは実際には進捗イベントであり、「ドキュメント」オブジェクト内で発生するだけでなく、さまざまな外部リソースでも発生します。 Web の閲覧は、画像、スタイル シート、スクリプト、ビデオ、オーディオ、Ajax リクエスト (XMLHttpRequest) などのさまざまなリソースを読み込むプロセスです。これらのリソースと「document」オブジェクト、「window」オブジェクト、および XMLHttpRequestUpload オブジェクトは、「load」イベントと「error」イベントをトリガーします。
最後に、ページの load
イベントを pageshow
イベントに置き換えることもできます。
セッションの履歴イベント
ページ表示イベント、ページ非表示イベント
デフォルトでは、ブラウザは現在のセッションのページをキャッシュし、ユーザーが「進む/戻る」ボタンをクリックすると、ブラウザはキャッシュからページを読み込みます。
pageshow
イベントは、最初の読み込みやキャッシュからの読み込みなど、ページが読み込まれるときにトリガーされます。ページが (ブラウザーからキャッシュされているかどうかに関係なく) 読み込まれるたびに実行するコードを指定したい場合は、このイベントの listen 関数にコードを配置できます。
初めてロードするとき、その起動順序は load
イベントよりも後になります。キャッシュからロードする場合、キャッシュ内のページは通常、load
イベント リスニング関数の実行後に表示されるものと同じであるため、load
イベントはトリガーされません。そのため、それを繰り返す必要はありません。同様に、ページがキャッシュから読み込まれる場合、Web ページで初期化された JavaScript スクリプト (DOMContentLoaded イベントのリスニング関数など) は実行されません。
window.addEventListener('pageshow', function(event) {
console.log('pageshow: ', イベント);
});
「pageshow」イベントには「persisted」属性があり、ブール値を返します。ページが最初にロードされるとき、この属性は false で、ページがキャッシュからロードされるとき、この属性は true です。
window.addEventListener('pageshow', function(event){
if (event.persisted) {
// ...
}
});
pagehide
イベントは pageshow
イベントに似ており、ユーザーが「進む/戻る」ボタンを使用して現在のページから離れるとトリガーされます。アンロードイベントとの違いは、「アンロード」イベントのリスニング関数がウィンドウオブジェクトに定義されている場合、ページはキャッシュに保存されませんが、「ページハイド」イベントを使用するとページが保存されることです。キャッシュ内にあります。
「pagehide」イベント インスタンスには「persisted」属性もあります。この属性を「true」に設定すると、ページがキャッシュに保存されます。「false」に設定すると、Web ページがキャッシュに保存されなくなります。このとき、unload が設定されている場合、pagehide イベントの直後に実行されるイベント リスニング関数。
ページに <frame>
または <iframe>
要素が含まれている場合、<frame>
ページの pageshow
イベントおよび pagehide
イベントがメイン ページの前にトリガーされます。
これら 2 つのイベントは、ブラウザの「history」オブジェクトが変更された場合にのみトリガーされ、Web ページが表示されるかどうかとは関係がないことに注意してください。
ポップステートイベント
popstate
イベントは、ブラウザの history
オブジェクトの現在のレコードが明示的に切り替えられるとトリガーされます。 history.pushState()
または history.replaceState()
を呼び出しても、popstate
イベントはトリガーされないことに注意してください。このイベントは、ユーザーがマウスで「戻る/進む」ボタンをクリックするか、「history.back()」、「history.forward()」、```を呼び出すなど、ユーザーが「history」レコード間を明示的に切り替えた場合にのみトリガーされます。スクリプトは、history.go()` のときにトリガーされます。
イベント オブジェクトには state
プロパティがあり、現在のレコードの history.pushState
メソッドおよび history.replaceState
メソッドによって追加された state
オブジェクトを保存します。
window.onpopstate = 関数 (イベント) {
console.log('状態: ' + イベント.状態);
};
History.pushState({ページ: 1}, 'タイトル 1', '?page=1');
History.pushState({ページ: 2}, 'タイトル 2', '?page=2');
History.replaceState({ページ: 3}, 'タイトル 3', '?page=3');
History.back(); // 状態: {"ページ":1}
History.back(); // 状態: null
History.go(2); // 状態: {"ページ":3}
上記のコードでは、pushState
メソッドが 2 つのレコードを history
に追加し、その後 replaceState
メソッドが現在のレコードを置き換えます。したがって、back
メソッドを 2 回続けて使用すると、現在のエントリが元の URL に返されます。これには、state
オブジェクトが付加されていないため、イベントの state
属性は null
になります。レコードを 2 つ進めて、メソッドによって追加された replaceState
レコードに戻ります。
ブラウザが初めてページをロードするとき、「popstate」イベントをトリガーするかどうかは、Firefox によって異なる処理を受けません。
ハッシュチェンジイベント
hashchange
イベントは、URL のハッシュ部分 (つまり、#
記号を含む #
記号の後の部分) が変更されたときにトリガーされます。このイベントは通常、「window」オブジェクト上でリッスンされます。
hashchange
のイベント インスタンスには、oldURL
プロパティと newURL
プロパティという 2 つの固有のプロパティがあり、それぞれ変更前と変更後の完全な URL を表します。
// URL は http://www.example.com/ です
window.addEventListener('hashchange', myFunction);
関数 myFunction(e) {
console.log(e.oldURL);
console.log(e.newURL);
}
location.hash = 'パート2';
// http://www.example.com/
// http://www.example.com/#part2
Web ページのステータス イベント
DOMContentLoaded イベント
Web ページがダウンロードされて解析された後、ブラウザは document
オブジェクトに対して DOMContentLoaded イベントをトリガーします。この時点では、Web ページの解析だけが完了しており (ページ全体の DOM が生成されています)、すべての外部リソース (スタイル シート、スクリプト、iframe など) はまだダウンロードされていない可能性があります。言い換えれば、このイベントは「load」イベントよりもはるかに早く発生します。
document.addEventListener('DOMContentLoaded', function (event) {
console.log('DOM 生成');
});
Web ページの JavaScript スクリプトは同期的に実行され、スクリプトがブロックされると、DOMContentLoaded
イベントのトリガーが遅れることに注意してください。
document.addEventListener('DOMContentLoaded', function (event) {
console.log('DOM が生成されました');
});
// このコードは DOMContentLoaded イベントのトリガーを遅らせます
for(var i = 0; i < 1000000000; i++) {
// ...
}
###readystatechangeイベント
readystatechange
イベントは、Document オブジェクトおよび XMLHttpRequest オブジェクトの readyState
プロパティが変更されるとトリガーされます。 document.readyState
には 3 つの可能な値があります: loading
(Web ページが読み込まれています)、interactive
(Web ページは解析されましたが、外部リソースはまだ読み込み中です)、および complete
(Web ページとすべての外部リソースが終了しました)読み込み中、load
イベントが発生しようとしています)。
document.onreadystatechange = function () {
if (document.readyState === 'インタラクティブ') {
// ...
}
}
このイベントは、DOMContentLoaded
イベントの別の実装メソッドとして見ることができます。
ウィンドウイベント
スクロールイベント
「scroll」イベントは、文書または文書要素がスクロールされるとき、主にユーザーがスクロール バーをドラッグするときにトリガーされます。
window.addEventListener('scroll', callback);
このイベントは継続的に大量にトリガーされるため、リスニング機能では非常に計算量の多い操作を行う必要はありません。推奨されるアプローチは、「requestAnimationFrame」または「setTimeout」を使用してイベントのトリガー頻度を制御し、それを「customEvent」と組み合わせて新しいイベントをスローすることです。
(関数 () {
var throttle = 関数 (タイプ、名前、オブジェクト) {
var obj = obj || ウィンドウ;
実行中の変数 = false;
var func = function () {
if (実行中) { 戻り値 }
実行中 = true;
requestAnimationFrame(function() {
obj.dispatchEvent(新しいカスタムイベント(名前));
実行中 = false;
});
};
obj.addEventListener(type, func);
};
//スクロールイベントをoptimizedScrollイベントに変換する
throttle('scroll', 'optimizedScroll');
})();
window.addEventListener('optimizedScroll', function() {
console.log('リソースを意識したスクロール コールバック!');
});
上記のコードでは、イベントトリガーの頻度を制御するために throttle()
関数が使用されており、内部関数 func()
があり、各 scroll
イベントが実際にこの関数をトリガーします。 requestAnimationFrame()
メソッドは、func()
関数の内部で使用され、ページが再描画されるたび (1 秒あたり 60 回) にのみ optimizedScroll
イベントがトリガーされるようにし、実際に scroll
を変換します。イベントを「optimizedScroll」イベントに追加すると、トリガー頻度は 1 秒あたり最大 60 回に制御されます。
より長い時間間隔を設定するには、代わりに setTimeout()
メソッドを使用してください。
(関数() {
window.addEventListener('scroll'、scrollThrottler、false);
var スクロールタイムアウト;
関数scrollThrottler() {
if (!scrollTimeout) {
スクロールタイムアウト = setTimeout(function () {
スクロールタイムアウト = null;
実際のScrollHandler();
}、66);
}
}
関数actualScrollHandler() {
// ...
}
}());
上記のコードでは、各 scroll
イベントは scrollThrottler
関数を実行します。この関数にはタイマー setTimeout
があり、実際の実行タスク actualScrollHandler
を 66 ミリ秒ごと (1 秒あたり 15 回) トリガーします。
以下は、「throttle」関数を記述するより一般的な方法です。
関数スロットル(fn, wait) {
var time = Date.now();
戻り関数() {
if ((時間 + 待機 - Date.now()) < 0) {
fn();
時間 = Date.now();
}
}
}
window.addEventListener('scroll', throttle(callback, 1000));
上記のコードは、「scroll」イベントの発生頻度を 1 秒あたり 1 回に制限します。
lodash
関数ライブラリは、直接使用できる既製の throttle
関数を提供します。
window.addEventListener('scroll', _.throttle(callback, 1000));
「debounce」の概念は、本書の前半で紹介しましたが、「throttle」との違いは、「throttle」は「スロットル」であり、一定期間内に 1 回だけ実行されることを保証するのに対し、「debounce」は```であることです。連続操作が必要な「手ぶれ補正」を終了してから実行してください。 Web ページのスクロールを例にとると、ユーザーがスクロールを停止するまで debounce
は実行されませんが、ユーザーが Web ページをスクロールしている場合、スクロール プロセス中に throttle
が実行されます。
サイズ変更イベント
resize
イベントは、主に window
オブジェクト上でブラウザ ウィンドウのサイズが変更されたときにトリガーされます。
varsizeMethod = function () {
if (document.body.clientWidth < 768) {
console.log('モバイルデバイスのビューポート');
}
};
window.addEventListener('resize'、resizeMethod、true);
このイベントも継続的に大量にトリガーされるため、上記の scroll
イベントと同様に、throttle
関数を通じてイベント トリガーの頻度を制御するのが最善です。
fullscreenchange イベント、fullscreenerror イベント
fullscreenchange
イベントは、全画面状態に入るときまたは全画面状態から出るときにトリガーされます。このイベントは document
オブジェクトで発生します。
document.addEventListener('fullscreenchange', function (event) {
console.log(document.fullscreenElement);
});
fullscreenerror
イベントは、ブラウザが全画面状態に切り替えられないときにトリガーされます。
クリップボード イベント
次の 3 つのイベントはクリップボード操作に関連します。
cut
: 選択したコンテンツをドキュメントから削除し、クリップボードに追加するときにトリガーします。copy
: コピーアクションが実行されるときにトリガーされます。paste
: クリップボードの内容がドキュメントに貼り付けられた後にトリガーされます。
たとえば、入力ボックスの貼り付けイベントを無効にしたい場合は、次のコードを使用できます。
inputElement.addEventListener('paste', e => e.preventDefault());
上記のコードにより、ユーザーは <input>
入力ボックスにコンテンツを貼り付けることができなくなります。
3 つのイベント「cut」、「copy」、「paste」のイベント オブジェクトはすべて、「ClipboardEvent」インターフェイスのインスタンスです。 「ClipboardEvent」にはインスタンス属性「clipboardData」があり、クリッピングデータを格納するDataTransferオブジェクトです。特定の API インターフェイスと操作方法については、「ドラッグ アンド ドロップ イベント」の DataTransfer オブジェクトのセクションを参照してください。
document.addEventListener('copy', function (e) {
e.clipboardData.setData('text/plain', 'Hello, world!');
e.clipboardData.setData('text/html', '<b>Hello, world!</b>');
e.preventDefault();
});
上記のコードにより、クリップボードにコピーされるデータは、ユーザーがコピーしたいデータではなく、開発者が指定したデータになります。
フォーカスイベント
フォーカス イベントは要素ノードと「ドキュメント」オブジェクトで発生し、フォーカスの取得または喪失に関連します。主に以下の4つのイベントが含まれます。
focus
: 要素ノードがフォーカスを取得した後にトリガーされます。このイベントはバブルアップしません。blur
: 要素ノードがフォーカスを失った後にトリガーされ、このイベントはバブルしません。focusin
: 要素ノードがフォーカスを取得しようとしているときにトリガーされ、focus
イベントの前に発生します。イベントが盛り上がります。focusout
: 要素ノードがフォーカスを失いかけたときにトリガーされ、blur
イベントの前に発生します。イベントが盛り上がります。
これら 4 つのイベントのイベント オブジェクトはすべて FocusEvent
インターフェイスを継承します。 FocusEvent
インスタンスには次のプロパティがあります。
FocusEvent.target
: イベントのターゲット ノード。FocusEvent.popularTarget
:focusin
イベントの場合はフォーカスを失ったノードを返し、focusout
イベントの場合はフォーカスを受け取るノードを返します。
「focus」イベントと「blur」イベントはバブルせず、キャプチャフェーズ中にのみトリガーできるため、「addEventListener」メソッドの 3 番目のパラメータを「true」に設定する必要があります。
form.addEventListener('focus', function (event) {
イベント.ターゲット.スタイル.バックグラウンド = 'ピンク';
}、 真実);
form.addEventListener('blur', function (event) {
イベント.ターゲット.スタイル.バックグラウンド = '';
}、 真実);
上記のコードは、フォームのテキスト入力ボックス用です。フォーカスを受け取ると背景色を設定し、フォーカスを失うと背景色を削除します。
CustomEvent インターフェース
CustomEvent インターフェイスは、カスタム イベント インスタンスを生成するために使用されます。ブラウザーによって事前定義されたこれらのイベントは手動で生成できますが、データをイベントにバインドすることはできません。イベントのトリガー中に指定したデータを渡す必要がある場合は、CustomEvent インターフェイスによって生成されたカスタム イベント オブジェクトを使用できます。
ブラウザーは、CustomEvent イベント インスタンスを生成するための CustomEvent()
コンストラクターをネイティブに提供します。
新しいカスタムイベント(タイプ、オプション)
CustomEvent()
コンストラクターは 2 つのパラメーターを受け入れます。最初のパラメータはイベントの名前を表す文字列であり、これは必須です。 2 番目のパラメーターはイベントの構成オブジェクトです。このパラメーターはオプションです。 Event イベントの構成プロパティを受け入れることに加えて、「CustomEvent」の構成オブジェクトには独自のプロパティが 1 つだけあります。
detail
: イベントの付随データを示します。デフォルトはnull
です。
以下に例を示します。
var イベント = new CustomEvent('build', { 'detail': 'hello' });
関数eventHandler(e) {
console.log(e.detail);
}
document.body.addEventListener('build', function (e) {
console.log(e.detail);
});
document.body.dispatchEvent(イベント);
上記のコードでは、「build」イベントを手動で定義しました。イベントがトリガーされると、イベントが監視され、イベント インスタンスの detail
属性 (つまり、文字列 hello
) が出力されます。
別の例を示します。
var myEvent = new CustomEvent('myevent', {
詳細: {
foo: 'バー'
}、
泡: 本当、
キャンセル可能: false
});
el.addEventListener('myevent', function (event) {
console.log('Hello ' +event.detail.foo);
});
el.dispatchEvent(myEvent);
上記のコードは、CustomEvent のイベント インスタンスが、Event インターフェイスのインスタンス属性に加えて、detail
属性も持っていることも示しています。
作者: wangdoc
アドレス: https://wangdoc.com/
ライセンス: クリエイティブ・コモンズ 3.0