1. 基本的な使い方これは MutationObserver コンストラクターを通じてインスタンス化でき、パラメーターはコールバック関数です。 オブザーバーを新しい MutationObserver(() => console.log("change")); console.log(オブザーバー); オブザーバー オブジェクトのプロトタイプ チェーンは次のとおりです。 MutationObserverインスタンス: 1. オブザーバー方式による監視
構文は次のとおりです。 // 2 つのパラメータ observer (DOM 要素、MutationObserverInit オブジェクト) を受け取ります。
例 1: body 要素クラスの変更を監視する: オブザーバーを新しい MutationObserver(() => console.log("change")); //body要素の属性の変更を監視する observer.observe(document.body, { 属性: true }); // body 要素のクラスを変更すると、MutationObserver オブジェクトの作成時に渡されたコールバック関数が非同期的に実行されます。 document.body.className = "main"; console.log("body属性が変更されました"); // コンソール出力: // ボディ属性を変更しました // 変更 上記 2. コールバック関数にMutationRecordインスタンス配列パラメータを追加する現在、コールバック関数は非常に単純で、文字列を出力するだけなので、どのような変更が行われたかは不明です。 実際、コールバック関数は オブザーバー = 新しい MutationObserver( // コールバック関数は MutationRecord インスタンスの配列です。形式は次のとおりです。 // [MutationRecord、MutationRecord、MutationRecord、...] (mutationRecords) => console.log(mutationRecords) ); オブザーバー.観察(ドキュメント.本文, { 属性: true }); ドキュメント.body.className = "main"; console.log("body属性が変更されました"); // コンソール出力: // ボディ属性を変更しました // (1) [MutationRecord] mutationRecords情報は次のとおりです。 MutationRecordの例: より重要な情報の一部:
本文の属性を複数回変更すると、複数のレコードが作成されます。 // ミューテーションレコード オブザーバー = 新しい MutationObserver( // コールバック関数は配列である MutationRecord インスタンスを受け取ります。 (mutationRecords) => console.log(mutationRecords) ); オブザーバー.観察(ドキュメント.本文, { 属性: true }); // 3 回変更します document.body.className = "main"; document.body.className = "コンテナ"; document.body.className = "ボックス"; // コンソールに次のように出力されます: // (3) [ミューテーションレコード、ミューテーションレコード、ミューテーションレコード] 知らせ:
3. Disconnectメソッドはコールバックを終了するコールバックを終了する場合は、disconnect メソッドを使用できます。 オブザーバー = 新しい MutationObserver( (mutationRecords) => console.log(mutationRecords) ); オブザーバー.観察(ドキュメント.本文, { 属性: true }); // 最初の変更 document.body.className = "main"; //observer.disconnect() を終了します。 // 2 番目の変更 document.body.className = "container"; // ログ出力なし コールバック関数は非同期で実行され、最後に実行されるため、最初の変更を含め、ここではログ出力はありません。 setTimeout を使用して最終終了を制御し、コールバックが正常に実行されるようにすることができます。 オブザーバー = 新しい MutationObserver( (mutationRecords) => console.log(mutationRecords) ); オブザーバー.観察(ドキュメント.本文, { 属性: true }); // 最初の変更 document.body.className = "main"; // 終了 setTimeout(() => { オブザーバーを切断します。 // 3 番目の変更、次の変更はコールバックされません document.body.className = "container"; }, 0); // 2 番目の変更 document.body.className = "container"; // ページ出力: // (2) [ミューテーションレコード、ミューテーションレコード] 終了後に再アクティブ化 終了後、再起動することができます。次の例を参照してください。 オブザーバー = 新しい MutationObserver( (mutationRecords) => console.log(mutationRecords) ); オブザーバー.観察(ドキュメント.本文, { 属性: true }); // 最初の変更は、mutationRecords 配列に入力されます。document.body.className = "main"; // 終了 setTimeout(() => { オブザーバーを切断します。 // 2 番目の変更は終了しているため、次の変更は mutationRecords 配列に入力されません。 document.body.className = "container"; }, 0); タイムアウトを設定する(() => { // オブザーバーを再度有効にします。observe(document.body, { 属性: true }); // 本文の属性を変更し、mutationRecords 配列を入力します。document.body.className = "container"; }, 0); // コンソール出力: // [ミューテーションレコード] // [ミューテーションレコード] ここでのコールバック関数は 2 回実行され、2 つの値を出力します。
2 番目の変更では、 4. takeRecordsメソッドは変更されたレコードを取得します
オブザーバー = 新しい MutationObserver( (mutationRecords) => console.log(mutationRecords) ); オブザーバー.観察(ドキュメント.本文, { 属性: true }); // 最初の変更は、mutationRecords 配列に入力されます。document.body.className = "main"; // 2 番目の変更は、mutationRecords 配列に入力されます。document.body.className = "container"; // 3 番目の変更は、mutationRecords 配列に入力されます。document.body.className = "box"; // 変更レコードを取得して処理します let mutationRecords = observer.takeRecords(); コンソールにログを記録します。 // コンソール出力: // (3) [ミューテーションレコード、ミューテーションレコード、ミューテーションレコード] コンソールにログを記録します。 // コンソール出力: // [] //observer.disconnect() を終了します。 2. 複数の要素を聴く上記の監視には1つの要素しかありません。複数の要素を監視したい場合は、 オブザーバー = 新しい MutationObserver( (mutationRecords) => console.log(mutationRecords) ); // div1 要素を作成して listen します。let div1 = document.createElement("div"); オブザーバー.観察(div1, { 属性: true }); div1.id = "ボックス1"; // div2 を作成して listen します。let div2 = document.createElement("div"); オブザーバー.観察(div2, { 属性: true }); div2.id = "ボックス2"; // コンソール出力: // (2) [ミューテーションレコード、ミューテーションレコード] コンソールには次の 2 つの MutationRecord が出力されます。
その他の使用方法は上記と同様です。 3. 監視スコープMutationObserverInitオブジェクト上記の監視は属性を監視するためのものですが、もちろん、テキスト、子ノードなど、他のものも監視できます。 1. プロパティを観察する上記の例はすべて、要素自体の属性を観察します。次に、カスタム属性の別の例を示します。 オブザーバー = 新しい MutationObserver( (mutationRecords) => console.log(mutationRecords) ); オブザーバー.観察(ドキュメント.本文, { 属性: true }); // カスタム属性を変更する document.body.setAttribute("data-id", 1); // コンソール出力: // [ミューテーションレコード] カスタム属性の変更も、 また、 attributeFilter フィルタリング: 指定した属性の変更を監視する場合は、 オブザーバー = 新しい MutationObserver( (mutationRecords) => console.log(mutationRecords) ); オブザーバー.観察(ドキュメント.本文, { 属性: true、 // ホワイトリスト属性を設定するFilter: ["data-id"] }); // ホワイトリスト attributeFilter の属性を変更し、mutationRecords を入力します document.body.setAttribute("データID", 1); // ホワイトリスト attributeFilter に含まれず、mutationRecords に入力されない属性を変更します document.body.setAttribute("class", "main"); // コンソール出力: // [ミューテーションレコード] attributeOldValue は古い値を記録します: 古い値を記録する場合は、 オブザーバー = 新しい MutationObserver( // MutationRecord オブジェクトの oldValue は古い値を表します (mutationRecords) => console.log(mutationRecords.map((x) => x.oldValue)) ); オブザーバー.観察(ドキュメント.本文, { 属性: true、 属性OldValue: true、 }); // 最初の変更。元々値がないので、古い値 oldValue = null document.body.setAttribute("class", "main"); // 2回目の変更。以前に一度変更されているため、古い値 oldValue = main document.body.setAttribute("クラス", "コンテナ"); // コンソール出力: // (2) [null, 'main'] 2. テキストを観察するテキストを観察するには、 次の例を考えてみましょう。 <!-- セクシーな div --> <div id="box">こんにちは</div> <script type="text/javascript"> オブザーバー = 新しい MutationObserver( (mutationRecords) => console.log(mutationRecords) ); // テキストノードを取得します。let textNode = document.getElementById("box").childNodes[0]; オブザーバー.observe(textNode, { //テキストの変更を観察する characterData: true }); // テキストを変更します textNode.textContent = "Hi"; // コンソール出力: // [ミューテーションレコード] </スクリプト> div 要素を直接リッスンすると機能しません。 <!-- セクシーな div --> <div id="box">こんにちは</div> <script type="text/javascript"> オブザーバー = 新しい MutationObserver( (mutationRecords) => console.log(mutationRecords) ); // div をリッスンしても効果はありません let box = document.getElementById("box"); オブザーバー.観察(ボックス, { 文字データ: true }); box.textContent = "こんにちは"; //コンソールに出力なし</script> characterDataOldValue は古い値を記録します。 テキストの古い値を記録する場合は、 <!-- セクシーな div --> <div id="box">こんにちは</div> <script type="text/javascript"> オブザーバー = 新しい MutationObserver( (mutationRecords) => console.log(mutationRecords.map((x) => x.oldValue)) ); // テキストノードを取得します。let textNode = document.getElementById("box").childNodes[0]; オブザーバー.observe(textNode, { //テキストの変更を監視 characterData: true, // 古いデータを保持する characterDataOldValue: true, }); // テキストを 2 回変更します textNode.textContent = "Hi"; textNode.textContent = "いいですね"; // コンソール出力: // (2) ['こんにちは', 'やあ'] </スクリプト> div 内の元のコンテンツは Hello でしたが、最初に Hi に変更され、次に Nice に変更されたため、 2 回の変更後の古い値は Hello と Hi になります。 3. 子ノードを観察する
<!-- セクシーな div --> <div id="box">こんにちは</div> <script type="text/javascript"> オブザーバー = 新しい MutationObserver( (mutationRecords) => console.log(mutationRecords) ); // div を取得する box = document.getElementById("box"); とします。 オブザーバー.観察(ボックス, { //子ノードの変更を観察 childList: true, }); // 要素を追加 let span = document.createElement("span") span.textContent = "世界"; ボックスの子要素を追加します。 // コンソール出力: // [ミューテーションレコード] </スクリプト> ノードを削除するには: <!-- セクシーな div --> <div id="box">こんにちは</div> <script type="text/javascript"> オブザーバー = 新しい MutationObserver( (mutationRecords) => console.log(mutationRecords) ); // div を取得する box = document.getElementById("box"); とします。 オブザーバー.観察(ボックス, { //子ノードの変更を観察 childList: true, }); // 最初の子ノード(Hello テキスト ノード)を削除します。box.removeChild(box.childNodes[0]); // コンソール出力: // [ミューテーションレコード] </スクリプト> モバイルノード: 既存のノードを移動すると、まずノードを削除してから追加するため、2 つの <!-- セクシーな div --> <div id="box">こんにちは世界</span></div> <script type="text/javascript"> オブザーバー = 新しい MutationObserver( (mutationRecords) => console.log(mutationRecords) ); // div を取得する box = document.getElementById("box"); とします。 オブザーバー.観察(ボックス, { //子ノードの変更を観察 childList: true, }); // spanノードをHelloノードの先頭に移動します。box.insertBefore(box.childNodes[1], box.childNodes[0]); // ノードを移動するということは、実際には最初にノードを削除してから追加することを意味します。 // コンソール出力: // (2) [ミューテーションレコード、ミューテーションレコード] </スクリプト> 4. サブツリーを観察する上記で観察されたノードはすべて、現在設定されているターゲット ノードです。たとえば、 <!-- セクシーな div --> <div id="box">こんにちは世界</span></div> <script type="text/javascript"> オブザーバー = 新しい MutationObserver( (mutationRecords) => console.log(mutationRecords) ); box = document.getElementById("box"); とします。 オブザーバー.観察(ボックス, { 属性: true、 //サブツリーの変更を観察する subtree: true }); // span要素のid属性の変更を観察できます box.childNodes[1].id = "text"; // コンソール出力: // [ミューテーションレコード] </スクリプト> 要約:
これで、 以下もご興味があるかもしれません:
|
<<: FlashFXP FTP クライアント ソフトウェア登録クラッキング方法
>>: オブジェクトアニメーションによってブロックされずにオブジェクトに div を表示する方法
今日、CSS の zoom 属性は何のために使用されるのかと尋ねられました。この属性は、フローティン...
目次1. v-text (v-instruction name = "variable&q...
1. マスタースレーブレプリケーションとは何ですか?マスタースレーブレプリケーションは、スレーブデー...
1. CSS変数がもたらす質的変化CSS 変数によってもたらされる改善は、CSS コードの節約や C...
1. はじめにSelenium を使用して Web サイトからデータをスクレイピングしたいのですが、...
1. CSS その他のアイコンアイコンを作成するには 3 つの方法があります。写真css (小さな矢...
mongoイメージを取得する sudo docker pull mongo mongodbサービスを...
dockerをインストールすると、通常はdockerユーザーグループが作成されます。ステップ2: 現...
1. チューニングの必要性 私は、どのように書けばいいのか本当に分からないので、共有するために最適...
Linux touch コマンドの詳細な説明: 1. コマンド機能:ファイルまたはディレクトリの作成...
以下のように表示されます。 XML/HTML コードコンテンツをクリップボードにコピー<!DO...
序文始める前に、ファイル属性とファイル属性を変更する方法について簡単に理解しておく必要があります。 ...
#include <linux/moduleparam.h> 1. モジュールパラメータ...
概要: HBase には、ユーザーに管理、分析、修復、デバッグ機能を提供するための多くの操作および保...
#docker 検索#docker プルポーター1. イメージを取得した後、中国語パッケージをダウン...