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ã®ä»çµã¿ïŒã«ã¹ã¿ã èŠçŽ
ããŒã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ãéåžžã«åœ¹ç«ã€ç¶æ³ã¯æ°å€ããããŸãã äŸïŒ
- Webã¢ããªã±ãŒã·ã§ã³ã®ãŠãŒã¶ãŒã«ãäœæ¥äžã®ããŒãžã§äœããã®å€æŽãçºçããããšãéç¥ããå¿ èŠããããŸãã
- DOMã®å€æŽã«åºã¥ããŠJavaScriptã¢ãžã¥ãŒã«ãåçã«ããŒããããæ°ããèå³æ·±ãJSãã¬ãŒã ã¯ãŒã¯ã«åãçµãã§ããŸãã
- ãããããWYSIWYGãšãã£ã¿ãŒã§äœæ¥ããŠãããå
ã«æ»ãæ©èœãšããçŽãæ©èœãå®è£
ããããšããŠããŸãã API
MutationObserver
ã䜿çšãããšãããŒãžã§ã©ã®ãããªå€æŽãçºçãããããã€ã§ãç¥ãããšãã§ããŸããã€ãŸããç°¡åã«å ã«æ»ãããšãã§ããŸãã
ãã©ãŠã¶ããŒã¹ã®ããã¹ããšãã£ã¿ãŒ
äžèšã¯ã
MutationObserver
ã®æ©èœã圹ç«ã€å¯èœæ§ãããç¶æ³ã®ã»ãã®äžéšã§ãã å®éããã£ãšãããããããŸãã
MutationObserverã®äœ¿çšæ¹æ³
Webã¢ããªã±ãŒã·ã§ã³ã§
MutationObserver
ã䜿çšããã®ã¯éåžžã«ç°¡åã§ãã
MutationObserver
ã€ã³ã¹ã¿ã³ã¹ãäœæãã察å¿ããã³ã³ã¹ãã©ã¯ã¿ãŒã«é¢æ°ãæž¡ãå¿ èŠããããŸãããã®ã³ã³ã¹ãã©ã¯ã¿ãŒã¯ãDOMã§å€æŽãçºçãããã³ã«åŒã³åºãããŸãã é¢æ°ã®æåã®åŒæ°ã¯ãåäžã®ããã±ãŒãžã§çºçãããã¹ãŠã®çªç¶å€ç°ã®ã³ã¬ã¯ã·ã§ã³ã§ãã åçªç¶å€ç°ã«ã€ããŠããã®ã¿ã€ããšãããè¡šãå€åã«é¢ããæ å ±ãæäŸãããŸãã
var mutationObserver = new MutationObserver(function(mutations) { mutations.forEach(function(mutation) { console.log(mutation); }); });
äœæããããªããžã§ã¯ãã«ã¯3ã€ã®ã¡ãœããããããŸãã
-
observe
ã¡ãœããã¯ãDOMå€æŽè¿œè·¡ããã»ã¹ãéå§ããŸãã ç£èŠããDOMããŒããšãã©ã¡ãŒã¿ãŒãæã€ãªããžã§ã¯ãã®2ã€ã®åŒæ°ãåããŸãã -
disconnect
æ¹æ³ã¯ãå€æŽã®ç£èŠãåæ¢ããŸãã -
takeRecords
ã¡ãœããã¯MutationObserver
ã€ã³ã¹ã¿ã³ã¹ã®çŸåšã®ãã¥ãŒãè¿ãããããã¯ãªã¢ããŸãã
å€æŽç£èŠãæå¹ã«ããæ¹æ³ã¯æ¬¡ã®ãšããã§ãã
// 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
ã®ç»å Žåã圌ãã¯äœã䜿çšããŠããŸãããïŒ ä»¥äžã«ããã€ãã®ãªãã·ã§ã³ã瀺ããŸãã
- ããŒãªã³ã°ã
-
MutationEvents
ã¡ã«ããºã ã - CSSã¢ãã¡ãŒã·ã§ã³ã
â調æ»
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ã䜿çšããŠããŸããïŒ