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 を表示する方法
構成の序文プロジェクト構築: vue-cli3 をベースに構築、rem 適応には postcss-p...
多くのプログラマーは MySQL に精通していると思います。多くの人が count の使い方と、最適...
ダウンロードダウンロードアドレス: https://dev.mysql.com/downloads/...
目次概要1. バックエンドデータの取得と処理2. インターフェース表示処理概要前回のエッセイ「ステッ...
SQLのlike文では、例えば SELECT * FROM user WHERE username...
目次1. データをバックアップするためのmysqldumpコマンド2. 一般的なmysqldump操...
目次基本的な説明AST 解析レンダリング機能通常コンポーネントと動的コンポーネントの比較ファクトリ関...
この記事では、ダッシュボードの左右スクロール効果を実現するためのスワイパー+echartsの具体的な...
1. スプレッド演算子スプレッド演算子は 3 つのドット ... で、複数の引数 (関数呼び出しなど...
まず使用しているカーネルのバージョンを確認してくださいlin@lin-仮想マシン:~$ uname ...
目次1. binlogの紹介2. Binlog関連のパラメータ3. バイナリログの内容を分析するIV...
この記事の例では、ログインフォームを実装するためのJavaScriptの具体的なコードを参考までに共...
1. 1列を変更する 学生の更新、都市c s.city_name = c.name を設定します こ...
ステップ1: Ubuntuソースを追加するルートに切り替える suルートソフトウェアソースファイルの...
この記事の例では、PC上で写真アップロード機能を実現するためのVueの具体的なコードを参考までに共有...