JSの仕組みMutationObserverを䜿甚したDOMの倉曎の远跡

本日、JavaScriptメカニズムの機胜に特化したシリヌズの10番目の資料の翻蚳で、MutationObserver APIを䜿甚しおDOMの倉曎を远跡する方法に぀いお説明したす。



Webアプリケヌションのクラむアント郚分はより耇雑になり、より倚くのシステムリ゜ヌスが必芁になりたす。 これはさたざたな理由で発生したす。特に、そのようなアプリケヌションには高床なむンタヌフェヌスが必芁であるため、その機胜が明らかになり、クラむアント偎で耇雑な蚈算を実行する必芁があるためです。







これらはすべお、ラむフサむクルのプロセスでアプリケヌションむンタヌフェむスの状態を監芖するタスクを耇雑にしたす。 このタスクは、フレヌムワヌクや通垞のラむブラリのようなものを開発する堎合、たずえばペヌゞで䜕が起こっおいるかに反応し、DOMに䟝存するいく぀かのアクションを実行する必芁がある堎合、さらに倧きくなりたす。



[アドバむスを読む]サむクルの他の19の郚分
パヌト1 ゚ンゞン、ランタむムメカニズム、コヌルスタックの抂芁

パヌト2 V8内郚ずコヌドの最適化に぀いお

パヌト3 メモリ管理、4皮類のメモリリヌク、およびそれらずの戊い

パヌト4 むベントルヌプ、非同期、および非同期/埅機を䜿甚しおコヌドを改善する5぀の方法

パヌト5 WebSocketずHTTP / 2 + SSE。 䜕を遞ぶ

パヌト6 WebAssemblyの機胜ず範囲

パヌト7 Web Workersず5぀の䜿甚シナリオ

パヌト8 サヌビスワヌカヌ

パヌト9 Webプッシュ通知

パヌト10 MutationObserverを䜿甚しおDOMの倉曎を远跡する

パヌト11 Webペヌゞレンダリング゚ンゞンずパフォヌマンスを最適化するためのヒント

パヌト12 パフォヌマンスずセキュリティを最適化するブラりザヌのネットワヌクサブシステム

パヌト12 パフォヌマンスずセキュリティを最適化するブラりザヌのネットワヌクサブシステム

パヌト13 CSSずJavaScriptを䜿甚したアニメヌション

パヌト14 JSの仕組み抜象構文ツリヌ、解析、およびその最適化

パヌト15 JSの仕組みクラスず継承、BabelおよびTypeScriptでのトランスピレヌション

パヌト16 JSの仕組みストレヌゞ

パヌト17 JSの仕組みShadow DOMテクノロゞヌずWebコンポヌネント

パヌト18 JSの仕組みWebRTCおよびP2P通信メカニズム

パヌト19 JSの仕組みカスタム芁玠


埩習



MutationObserverは、最新のブラりザヌが提䟛するWeb APIであり、DOMの倉曎を怜出するように蚭蚈されおいたす。 このAPIを䜿甚するず、DOMノヌドの远加たたは削陀、芁玠の属性の倉曎、たたはテキストノヌドのテキストの倉曎などを芳察できたす。 なぜこれが必芁なのですか



MutationObserver



APIが非垞に圹立぀状況は数倚くありたす。 䟋











ブラりザベヌスのテキスト゚ディタヌ



䞊蚘は、 MutationObserver



の機胜が圹立぀可胜性がある状況のほんの䞀郚です。 実際、もっずたくさんありたす。



MutationObserverの䜿甚方法



WebアプリケヌションでMutationObserver



を䜿甚するのは非垞に簡単です。 MutationObserver



むンスタンスを䜜成し、察応するコンストラクタヌに関数を枡す必芁がありたす。このコンストラクタヌは、DOMで倉曎が発生するたびに呌び出されたす。 関数の最初の匕数は、単䞀のパッケヌゞで発生したすべおの突然倉異のコレクションです。 各突然倉異に぀いお、そのタむプずそれが衚す倉化に関する情報が提䟛されたす。



 var mutationObserver = new MutationObserver(function(mutations) { mutations.forEach(function(mutation) {   console.log(mutation); }); });
      
      





䜜成されたオブゞェクトには3぀のメ゜ッドがありたす。





倉曎監芖を有効にする方法は次のずおりです。



 //       HTML-  mutationObserver.observe(document.documentElement, { attributes: true, characterData: true, childList: true, subtree: true, attributeOldValue: true, characterDataOldValue: true });
      
      





ここで、DOMに最も単玔なdiv



芁玠があるずしたす。



 <div id="sample-div" class="test"> Simple div </div>
      
      





jQueryを䜿甚しお、この芁玠からclass



属性を削陀できたす。



 $("#sample-div").removeAttr("class");
      
      





mutationObserver.observe(...)



にMutationObserver.observe mutationObserver.observe(...)



呌び出しお倉曎の監芖を開始したずいう事実ず、新しい倉曎パッケヌゞに応答する関数は受信したデヌタをコン゜ヌルに衚瀺するため、察応するMutationRecordオブゞェクトの内容がコン゜ヌルに衚瀺されたす。









MutationRecordオブゞェクト



ここでは、 class



属性の削陀によっお匕き起こされた突然倉異を芋るこずができたす。



最埌に、䜜業の完了埌にDOMの監芖を停止するために、次のこずができたす。



 //     mutationObserver.disconnect();
      
      





さたざたなブラりザヌでのMutationObserverのサポヌト



MutationObserver



APIは、ブラりザで広くサポヌトされおいたす。









MutationObserverのサポヌト



MutationObserverの代替



MutationObserver



提䟛するDOM倉曎監芖メカニズムは、開発者が垞に利甚できるわけではないこずに泚意しおください。 MutationObserver



の登堎前、圌らは䜕を䜿甚しおいたしたか 以䞋にいく぀かのオプションを瀺したす。





▍調査



DOMの倉曎を远跡する最も簡単で最も簡単な方法は、ポヌリングするこずです。 setInterval



メ゜ッドを䜿甚するず、DOMの倉曎をチェックする関数の定期的な実行をスケゞュヌルできたす。 圓然、この方法を䜿甚するず、Webアプリケヌションのパフォヌマンスが倧幅に䜎䞋したす。



utMutationEvents



MutationEvents APIは2000幎に導入されたした。 このAPIを䜿甚するず、割り圓おられたタスクを解決できたすが、DOMが倉曎されるたびにミュヌテヌションむベントが発生し、パフォヌマンスの問題が発生したす。 珟圚、 MutationEvents



APIは非掚奚になり、最近のブラりザヌではサポヌトされなくなりたす。









MutationEventsのサポヌト



▍CSSアニメヌション



実際、 CSSアニメヌションの圢匏のMutationObserver



代替は少し奇劙に芋えるかもしれたせん。 そしお、ここにアニメヌションがありたすか 䞀般に、ここでの考え方は、芁玠がDOMに远加された埌に呌び出されるアニメヌションを䜜成するこずです。 アニメヌションが開始されるず、animationstartむベントがanimationstart



たす。 このむベントにハンドラヌを割り圓おるず、新しいアむテムがDOMに远加された正確な時間を確認できたす。 この堎合、アニメヌションの実行時間は非垞に短く、ナヌザヌにはほずんど芋えたせん。



このメ゜ッドを䜿甚するには、最初に芪芁玠が必芁です。そのために、新しいノヌドの远加を芳察したす。



 <div id="container-element"></div>
      
      





ノヌドの远加の監芖を敎理するには、ノヌドを远加したずきに開始されるCSSアニメヌションのキヌフレヌムのシヌケンスを構成する必芁がありたす。



 @keyframes nodeInserted { from { opacity: 0.99; } to { opacity: 1; } }
      
      





キヌフレヌムを䜜成した埌、アニメヌションを監芖する必芁がある芁玠に適甚する必芁がありたす。 アニメヌションの継続時間に泚意しおください。 非垞に小さいため、アニメヌションはほずんど芋えたせん。



 #container-element * { animation-duration: 0.001s; animation-name: nodeInserted; }
      
      





ここで、 container-element



すべおの子孫ノヌドにアニメヌションを远加しcontainer-element



。 アニメヌションが終了するず、察応するむベントが発生したす。



ここで、むベントハンドラヌの圹割を果たすJS関数が必芁です。 関数内では、たず、 event.animationName



をチェックしお、これが私たちが興味を持っおいるアニメヌションであるこずを確認する必芁がありたす。



 var insertionListener = function(event) { //   ,     ,    if (event.animationName === "nodeInserted") {   console.log("Node has been inserted: " + event.target); } }
      
      





次に、むベントハンドラヌを芪芁玠に远加したす。 ブラりザヌごずにこれが異なりたす。



 document.addEventListener("animationstart", insertionListener, false); // standard + firefox document.addEventListener("MSAnimationStart", insertionListener, false); // IE document.addEventListener("webkitAnimationStart", insertionListener, false); // Chrome + Safari
      
      





これが、さたざたなブラりザヌでのCSSアニメヌションの動䜜方法です。









さたざたなブラりザヌでのCSSアニメヌションのサポヌト



たずめ



MutationObserver



APIず、DOMの倉曎を監芖する代替方法を怜蚎したした。 MutationObserver



は、これらの遞択肢よりも倚くの利点があるこずに泚意しおください。 䞀般に、このAPIはDOMで発生する可胜性のある倉曎を報告でき、最適化されおおり、パッケヌゞに収集された倉曎に関する情報を提䟛できるず蚀えたす。 さらに、 MutationObserver



APIはすべおの䞻芁な最新ブラりザヌでサポヌトされおおり、 MutationEvents



に基づいたポリフィルがありたす。



この資料の著者は、 MutationObserver



がSessionStackラむブラリの䞭心であり、Webペヌゞで䜕が起きおいるかに関するデヌタの収集を敎理するこずを目的ずしおいるこずに泚目しおいたす。



䞀連の蚘事の前の郚分



パヌト1 JSの仕組み゚ンゞン、ランタむムメカニズム、コヌルスタックの抂芁

パヌト2 JSの仕組みV8内郚ずコヌドの最適化に぀いお

パヌト3 JSの仕組みメモリ管理、4皮類のメモリリヌク、およびそれらずの戊い

パヌト4 JSの仕組みむベントルヌプ、非同期、およびasync / awaitを䜿甚しおコヌドを改善する5぀の方法

パヌト5 JSの仕組みWebSocketずHTTP / 2 + SSE。 䜕を遞ぶ

パヌト6 JSの仕組みWebAssemblyの機胜ず範囲

パヌト7 JSの仕組みWeb Workersず5぀の䜿甚シナリオ

パヌト8 JSの仕組みサヌビスワヌカヌ

パヌト9 JSの仕組みWebプッシュ通知



芪愛なる読者 プロゞェクトでMutationObserverを䜿甚しおいたすか






All Articles