æçš¿è ïŒã¢ã³ãã³ã»ã¬ã€ããŒ
ç§ã®ãŠã§ãããŒã«åºã¥ããèšäºã®æåã®éšåã§ã¯ããã©ãŠã¶ã®äžè¬çãªååã«æ³šç®ããŸããã 2ã€ç®ã¯ãéèŠãªã€ãã³ãã§ãããªãã€ã³ããšãªãããŒã«çŠç¹ãåœãŠãã€ãã³ãã«ãŒããã©ã®ããã«æ©èœãããã«æ³šç®ããŸããã
ãªãã€ã³ããšãªãããŒ
ããŒãžãããŒããããšãã«ã空ã§ãªãå Žåãå°ãªããšã1ã€ã®ãªãããŒãšåãã€ã³ããåžžã«å®è¡ãããŸãã ããã«ããããã®ã€ãã³ãã¯æ¬¡ã®å Žåã«çºçããŸãã
1.衚瀺ããªãŒã®äžéšãåèšç®ããå¿ èŠããããŸããã€ãŸããäžéšã®ããŒãã§ã¯ãå¹ ãé«ãããŸãã¯åº§æšãå€æŽãããŠããŸãã ãªãããŒã€ãã³ããçºçããŸãã
2.å€æŽã®çµæã衚瀺ãããã³ã³ãã³ãã®äžéšãæŽæ°ãããŸãã ããã¯äž»ã«ã¹ã¿ã€ã«ã®ããããã£ã«é¢ãããã®ã§ãïŒèæ¯è²ãååŸãªã©ãåæç»ã€ãã³ããçºçããŸãã
ãªãããŒãåŒã³åºãããå Žåããã®åŸã«ãªãã€ã³ããåŒã³åºãããŸãã ããããéã¯åœãŠã¯ãŸããŸããããªãããŒã«é¢ä¿ãªããrepaintãåŒã³åºãããšãã§ããŸãã
ãªãããŒããã³/ãŸãã¯åãã€ã³ããåŒãèµ·ããã¢ã¯ã·ã§ã³
1ïŒDOMããŒãã®è¿œå ãæŽæ°ãåé€ã ãããã®ã€ãã³ãã§ã¯ã衚瀺ããªãŒãåèšç®ããå¿ èŠãããããã§ãã
æ©èœïŒ
insertAdjacentHTMLïŒïŒãappendChildïŒïŒãinsertBeforeïŒïŒãremoveChildïŒïŒãreplaceChildïŒïŒãremoveïŒïŒãappendïŒïŒ/ prependïŒïŒãafterïŒïŒ/ beforeïŒïŒãreplaceWithïŒïŒ
DOMããŒãã®ããããã£ã®å€æŽïŒ
innerHTMLãinnerTextãå¹ ãé«ããoffsetTopãoffsetLeftãoffsetWidthãoffsetHeightãscrollTop / Left / Width / HeightãclientTop / Left / Width / Height
DOMããŒãã®ããããã£ã®ãªã¯ãšã¹ãïŒå€æŽãªãïŒïŒ
ïŒoffsetTopãoffsetLeftãoffsetWidthãoffsetHeightãscrollTop / Left / Width / HeightãclientTop / Left / Width / Height
é¢æ°ãåŒã³åºããŠDOMããŒããå€æŽãããšããªãããŒãçºçããã ãã§ãªããäžéšã®ããããã£ïŒç¹ã«ãã¹ãŠã®ãªãã»ããããããã£ãå«ãïŒã«å¯ŸããåçŽãªãªã¯ãšã¹ããçºçããå¯èœæ§ããããŸãã ãã®ã¬ã€ã¢ãŠããå¿ èŠãªçç±ã¯ãåŸã§èª¬æããŸãã
2ïŒ ãã£ã¹ãã¬ã€ã䜿çšããŠDOMããŒããé 衚瀺ïŒãªã ïŒãªãããŒããã³åæç»ïŒãŸãã¯å¯èŠæ§ïŒé衚瀺 ïŒå¹ŸäœåŠçãªå€æŽããªãããåæç»ã®ã¿ïŒã
3ïŒç§»åããDOMããŒããã¢ãã¡ãŒã·ã§ã³åããŸãã
衚瀺ããªãŒã®ã¢ãã¡ãŒã·ã§ã³åãããããŒãã®åº§æšãå€åããŸããããã«ãããä»ã®ããŒãã®ãµã€ãºå€æŽãçºçããå¯èœæ§ããããŸãã
4ïŒCSSã®è¿œå /å€æŽ
å·Šãäžãå³ãäžãå¹ ãé«ã
ãããã®cssããããã£ãå€æŽããå Žåãããã¯ãªãããŒãåŒã³åºããŸãã
5ïŒãŠãŒã¶ãŒã¢ã¯ã·ã§ã³ïŒãŠã£ã³ããŠã®ãµã€ãºå€æŽããã©ã³ãã®å€æŽãã¹ã¯ããŒã«ããã©ãã°ã¢ã³ãããããã
6ïŒãã®ä»
-JSã¹ã¯ããŒã« ïŒã¹ã¯ãªãããšããã«å¯Ÿå¿ããããããã£ãã¹ã¯ããŒã«ããŸãã
scrollByLinesïŒïŒãscrollByPagesïŒïŒãscrollHeightãscrollIntoViewïŒïŒãscrollIntoViewIfNeededïŒïŒãscrollLeftãscrollTopãscrollWidth
-ãŠã£ã³ããŠãªããžã§ã¯ãã®ã°ããŒãã«ã¡ãœãããšã€ãã³ãïŒ
getComputedStyleïŒïŒãscrollByïŒïŒãscrollToïŒïŒãscrollXãscrollY
-SVGã§ã®äœæ¥
äŸ
var bstyle = document.body.style; // cache bstyle.padding = "20px"; // reflow, repaint bstyle.border = "10px solid red"; // another reflow and a repaint bstyle.color = "blue"; // repaint only, no dimensions changed bstyle.backgroundColor = "#fad"; // repaint bstyle.fontSize = "2em"; // reflow, repaint // new DOM element - reflow, repaint document.body.appendChild(document.createTextNode('dude!'));
ãã®ã¹ã¯ãªããã®äŸã䜿çšãããšãããã£ã³ã°ãå€æŽãããšãé·æ¹åœ¢ã®å¯žæ³ãåèšç®ããå¿ èŠãããããšãããããŸãã ãããã£ãŠããªãããŒãšåãã€ã³ããåŒã³åºãããŸãã å¢çç·ãå€æŽãããšãæ°ããå¹ ãäžããããããããªãããŒãšåæç»ãåŒã³åºãããŸãã ãããŠãå¢çç·ãèæ¯ããŸãã¯ããã¹ãã®è²ãå€æŽããå Žåãåæç»ã®ã¿ãåŒã³åºãããŸãã ãã©ã³ããµã€ãºãå€æŽããŸã-ãªãããŒãšåãã€ã³ãã
ãã©ãŠã¶ãŒã¯ãããã€ãã®ãªãããŒããã³åãã€ã³ãèŠæ±ããŸãšããŠäžåºŠå®è¡ããäœæ¥ãæé©åããŸãã ãã ããäžéšã®ã¢ã¯ã·ã§ã³ã¯ããã©ãŠã¶ãŒã«ãããã®ã€ãã³ããããã«å®è¡ãããã
ããããã£ïŒ
1. offsetTopãoffsetLeftãoffsetWidthãoffsetHeight
2. scrollTop /å·Š/å¹ /é«ã
3.clientTop /å·Š/å¹ /é«ã
4. getComputedStyleïŒïŒããŸãã¯IEã®currentStyle
ãããã®ããããã£ããªã¯ãšã¹ãããå Žåããã©ãŠã¶ã¯é¢é£æ å ±ãè¿ãå¿ èŠããããããããã«åæ§ç¯ããå¿ èŠããããŸãã ãããã£ãŠããããã®ããããã£ãèŠæ±ãããã³ã«ããªãããŒãšåãã€ã³ããçºçããŸãã
ãªãã€ã³ãããã³ãªãããŒã¢ã«ãŠã³ãã£ã³ã°ã®ã³ãŒãæé©åã®ãã³ã
I.ã³ãŒãå ã§èŠçŽ ã®ã¹ã¿ã€ã«ãçŽæ¥å€æŽãããcssã¯ã©ã¹ã䜿çšããŠèŠçŽ ã®å€èŠ³ãåãæ¿ããŸãã ãŸãã¯ãcssTextããããã£ã䜿çšããŸãã
// bad var left = 10, top = 10; el.style.left = left + "px"; el.style.top = top + "px"; // better el.className += " theclassname"; // or when top and left are calculated dynamically... // better el.style.cssText += "; left: " + left + "px; top: " + top + "px;";
æ¹æ³ïŒ
1. CSSã¯ã©ã¹ãåãæ¿ããŸãã å€ãã®å Žåããããã¯ã®å€èŠ³ãŸãã¯ãã®ç¶æ ã¯ãã¯ã©ã¹ã䜿çšããŠå€æŽã§ããŸãã ãã®ãªãã·ã§ã³ã¯ãã¹ã¿ã€ã«ãçŽæ¥æäœãããããåªããŠããŸããå°ãªããšããªãããŒãšåãã€ã³ãã¯1åããçºçããªãããã§ãã ããšãã°ããã®å Žåãæåã®äŸã§ã¯ãå·Šã€ãã³ããå€æŽããããšãªãããŒãšåãã€ã³ããçºçããäžéšã€ãã³ããå€æŽããããšå¥ã®ãªãããŒãšåãã€ã³ããçºçããŸãã ãã ããããã¯ã©ã¹ã®cssããããã£ã«leftãštopãèšè¿°ããå Žåããã®ã¯ã©ã¹ãè¿œå ãããšãã«ã2ã€ã§ã¯ãªã1ã€ã®ãªãããŒãšåãã€ã³ããè¡ãããŸãã
2. cssTextããããã£ã«ã€ããŠãåæ§ã§ãã ãã®ããã¹ãã§å¿ èŠãªãã¹ãŠã®ããããã£ãåçãªããããã£ã«çœ®ãæãããšã1ã€ã®ãªãããŒãšåãã€ã³ããè¡ãããŸãã
IIã æäœãDOMãšçµã¿åãããDOMã®æŽæ°ãšã¯å¥ã«å®è¡ããŸãã
ãããè¡ãã«ã¯ãããã€ãã®æ¹æ³ããããŸãã
â¢DOMããŒãã§ã®äœæ¥ãæé©åããããã«èšèšãããdocumentFragmentã䜿çšããŸãã
â¢DOMããŒãã®ã¯ããŒã³ãäœæããŠæäœããæåŸã«å ã®DOMããŒããããã«çœ®ãæããŸãã ãŸãããªãããŒãšåãã€ã³ãã®éãæé©åããŸãã
â¢ãã£ã¹ãã¬ã€ã®äœ¿çšïŒãªãïŒ1ãªãããŒãåæç»ïŒã100åã®å€æŽããã£ã¹ãã¬ã€ã®åŸ©å ïŒ1ãªãããŒãåæç»ïŒã ããã¯ã100ã®å€æŽããšã«1ã€ã®ãªãããŒãåŒã³åºããããåªããŠããŸãã
IIIã èšç®ãããã¹ã¿ã€ã«ãããŸãé »ç¹ã«èŠæ±ããªãã§ãã ããã ããã«ããããã©ãŠã¶ã¯åŒ·å¶çã«ãªãããŒãšåæç»ãè¡ããŸãã ãã®å Žåã®ã³ãŒãã®æé©åæ¹æ³ã®äŸã瀺ããŸãã ãããã䜿çšããå¿ èŠãããå Žåã¯ãäžåºŠååŸããå€æ°ã«ãã£ãã·ã¥ããŸãïŒç¹å®ã®ãµã€ã¯ã«ãããå Žåã¯ãæ¯åããããã£ãååŸãããããå€æ°ã䜿çšããæ¹ãé©åã§ãïŒã
// no-no! for(big; loop; here) { el.style.left = el.offsetLeft + 10 + "px"; el.style.top = el.offsetTop + 10 + "px"; } // better var left = el.offsetLeft, top = el.offsetTop esty = el.style; for(big; loop; here) { left += 10; top += 10; esty.left = left + "px"; esty.top = top + "px"; }
IVã 衚瀺ããªãŒã«ã€ããŠèããŠã衚瀺ããªãŒã§è¡ã£ãŠããå€æŽã®æ°ãç解ããŠãã ããã
ã¬ã€ã¢ãŠããç°ãªãããããã®ç¹ã«ã€ããŠè©³ãã説æããŸãã ãããŠã1ã€ã®ã¬ã€ã¢ãŠãïŒãªãããŒ-誰ããå¿ããå ŽåïŒã¯ãå¥ã®ã¬ã€ã¢ãŠããããããªãåŽåéçŽçã§ãã ãã®äŸãèããŠã¿ãŸãããã
<div class="five red"> <div class="four yellow"> <div class="three green"> <div class="two blue"> <div class="one purple"> </div> </div> </div> </div> </div>
ããã¯å°ããªHTMLã¹ããããã§ãã äœããã®çš®é¡ã®DOMããŒãããããã¯1ã«æ¿å ¥ãããšããŸãã
ããã¯äœã«ã€ãªãããŸããïŒ ãŸãããããã¯1ã¯ãµã€ãºãåèšç®ããå¿ èŠããããŸããããã¯ãæ°ãããã©ã°ã€ã³DOMããŒãã®ãµã€ãºãããããªãããã§ãã ãããã¯1ã®ãµã€ãºãå€æŽãããšããããã¯2ã®åé 眮ãå¿ èŠã«ãªããŸããããã«ããããããã¯3ã4ãããã³5ã®åé 眮ãçºçããŸããã€ãŸããæäœã«æéããããããšãããããŸãã ãã ããããšãã°4çªç®ã®DOMããŒãã®åŸã«ââDOMããŒããæ¿å ¥ãããšããã¹ãŠãç°ãªããŸãã
ãã®å Žåã5çªç®ã®DOMããŒãã®ã¿ãæŽæ°ããããã®æ¹æ³ã§ã®ã¬ã€ã¢ãŠãã¯ã¯ããã«é«éã§ãã
å¥ã®è¯ãäŸã¯ãã¢ãã¡ãŒã·ã§ã³ã®æäœã§ãã ãããã¯1ã®åãã200ãã¯ã»ã«å³ã«ã¢ãã¡ãŒã·ã§ã³åãããšããŸãã ãããã¯1ã®äœçœ®ãstaticã§ããå Žåãã€ãŸããæšæºã¬ã€ã¢ãŠãã¹ããªãŒã å ã«ãããä»ã®ãããã¯ã§èæ ®ãããŠããå Žåããã®åº§æšãå€æŽãããšããã¹ãŠã®ç¥å ãåæ§æãããŸãã ãããã¯1ã«positionïŒabsoluteãããå Žåãæšæºã¬ã€ã¢ãŠãã¹ããªãŒã ãçµäºããŸãã ãã®å Žåã座æšã®å€æŽã«ã¯ãåã ã®ç¥å ã®ã¿ã®åé 眮ãå¿ èŠã«ãªããŸãã é·æ¹åœ¢5ã«positionïŒrelativeããããé·æ¹åœ¢1ããããã¯çªå·5ã«å¯ŸããŠçžå¯Ÿçã«é 眮ããããšããŸãããã次ã«ããã®åº§æšã®ãããã¯1ãå€æŽãããšã5çªç®ã®DOMããŒãã®ã¿ãã¬ã€ã¢ãŠããããŸãã
ã€ãã³ãã«ãŒã
ç§ã®æèŠã§ã¯ãå€ãã®å Žå誀解ãæããããéåæã€ãã³ããšã€ãã³ãã«ãŒãã®ãããã¯ãæ€èšããŠãã ããã
ã
ã€ãã³ãã«ãŒããšã¯äœã§ããïŒ ããã¯ç¡éã«ãŒãã§ãããJSãšã³ãžã³ïŒV8ãJavaScriptCoreãªã©ïŒã«ãã£ãŠå®è£ ãããç¹ã«éåæã€ãã³ããªã©ã®ã¹ã¯ãªããã®æ£ããå®è¡ãç®çãšããŠããŸãã JSãšã³ãžã³ã¯ãWebkitãGeckoãå«ããã©ãŠã¶ãŒãšã³ãžã³ãšæ··åããªãã§ãã ããã ãŸããã€ãã³ãã«ãŒããšãã©ãŠã¶ãµã€ã¯ã«ãæ··åããªãã§ãã ããã
ã¯ã©ã€ã¢ã³ãåŽã«ã¯3ã€ã®ã¿ã€ãã®éåæã¢ã¯ã·ã§ã³ããããŸãã
1.ã¿ã€ããŒã
setTimeout(function timerFn(){ console.log('timerFn'); },100)
2. Ajax
$.ajax({ url: 'someUrl', success: function ajaxFn(data) { console.log('ajaxFn') } });
3.ãŠãŒã¶ãŒã¢ã¯ã·ã§ã³ã
$('something').on('click', function clickFn(){ console.log('clickFn') } )
ãããã®éåæã€ãã³ãã¯ãã¹ãŠãã³ãŒã«ããã¯ãåŠçããŸãã ã³ãŒã«ããã¯ã¡ã«ããºã ã¯ãéåæã€ãã³ãã®æ£ããåäœãä¿èšŒããŸãã å°ããªã³ãŒããèŠãŠã¿ãŸãããã ã³ãŒã«ããã¯ClickFnïŒïŒããããŸãã somethingèŠçŽ ãã¯ãªãã¯ãããšå®è¡ãããŸãã ãã®æç¹ã§ãã³ãŒã«ã¹ã¿ãã¯ã§éåžžã«å€§ããªã³ãŒããå®è¡ãããŠãããšããŸãã clickFnã¯ã³ãŒã«ããã¯ãã¥ãŒã«ç§»åããé çªãåŸ ã¡ãŸãã
ãµãŒããŒããã®æ¬¡ã®å¿çãè¿ããããšããŸããã-察å¿ããã³ãŒã«ããã¯ajaxFnãé çªã«ç«ã¡äžãããŸãã ãã®åŸãã¿ã€ããŒãããªã¬ãŒããã圌ã®ã³ãŒã«ããã¯ããã®ãã¥ãŒã«é 眮ãããŸãã ã¡ãªã¿ã«ãéçºè ã¯ãã¿ã€ããŒã®é 延ãšããŠç€ºãããæéãããããããªç§ã§ããããšãç解ããå¿ èŠããããŸãã ãã©ãŠã¶ã¯ãã§ã«ã³ãŒã«ããã¯ãã¥ãŒã«ãããã¹ãŠã®ã³ãŒã«ããã¯ãèæ ®ããå¿ èŠãããããã§ãã ããšãã°ãã³ãŒã«ããã¯clickFnããã³ajaxFnãããããããªç§åäœã§å®è¡ãããå Žåãã¿ã€ããŒã®ã³ãŒã«ããã¯ã¯ãã¹ã¯ãªããã«èšèŒãããŠããããã«100ããªç§åŸã«ã§ã¯ãªãã102åŸã«å®è¡ãããŸãã
ãããã£ãŠã次ã®è¡ããããŸãã
ã³ãŒã«ã¹ã¿ãã¯ã®ã³ãŒãã®å®è¡ãåæ¢ãããšããã©ãŠã¶ã¯ã³ãŒã«ããã¯ãã¥ãŒããæåã®ã³ãŒã«ããã¯ã³ãŒããå®è¡ã§ããŸãã å®éã«ã¯ãclickFnãå®è¡ãããŸãã å®äºãããšã座åžã¯ç©ºã«ãªããŸãã ãã®èåŸã§ã次ã®ã³ãŒã«ããã¯ãå®è¡ãããŸã-ajaxFnã次ã«-timerFnããããŠãã¥ãŒã¯ç©ºã§ãã ããã¯ãã€ãã³ãã«ãŒãã®ç°¡ç¥åãããã¹ããŒã ã§ãã
ã³ãŒã«ããã¯ãã¥ãŒã䜿çšãããšããããã䞊åã§ã¯ãªããé çªã«å®è¡ã§ããŸãã ã³ãŒã«ããã¯ã§ã¯ãåãå€æ°ãåãDOMããŒãã§äœæ¥ã§ããããããããã®äžŠåãã€ãŸãéåæå®è¡ã¯ç«¶åãåŒãèµ·ãããŸãã ãã®å Žåããã©ãŠã¶ã¯äœãããå¿ èŠãããããæ£ç¢ºã«ææ¡ã§ããŸããã
次ã«èå³æ·±ãç¹ã¯ãJavaScriptãéåæã€ãã³ããèš±å¯ããŠããã«ãããããããããããã³ã°èšèªã§ã¯ãªããšããããšã§ãã AJAXãå®è¡ããŠããå Žåãããã«ç¶ãã³ãŒãã¯åŒãç¶ãå®è¡ãããŸã-ãµãŒããŒããã®å¿çãåŸ æ©ããŸããã ãã¡ãããã¢ã©ãŒããŸãã¯åæAJAXã€ãã³ãã®åœ¢ã§äŸå€ãååšããå ŽåããããŸããããåç¥ã®ããã«ãããã¯ãã¹ããã©ã¯ãã£ã¹ã§ã¯ãããŸããã
ãããŒã«ã€ããŠãåãããšãèšããŸãã JavaScriptã¯ãDOMãšé£åããåäžã®ã¹ã¬ããã§å®è¡ãããŸãã æŠããŠãè€æ°ã®äžŠåã¹ã¬ãããäœæããŠãæå³ããããŸãããããããååšãããšãããã«æ··ä¹±ãçããDOMã§ã®äœæ¥ãé£ãããªããŸãã ãã ããã¹ã¯ãªããã®äžŠåã¹ã¬ãããæŽçããæ¹æ³ã¯ãŸã ååšããŸããhtml5æšæºã«ç»å Žãããã¯ãããžã§ããWeb Workerã䜿çšããŠãã ããã 1ã€ã®å¶éããããŸã-Web Workerã¯DOMãçŽæ¥æäœã§ãããã¡ãã»ãŒãžã³ã°ãéããŠã¡ã€ã³ã¹ã¬ãããšå¯Ÿè©±ããå¿ èŠããããŸãã
ãœãŒã¹ïŒ
1. http://www.html5rocks.com/en/tutorials/internals/howbrowserswork/
2. http://www.phpied.com/rendering-repaint-reflowrelayout-restyle/
3. http://2014.jsconf.eu/speakers/philip-roberts-what-the-heck-is-the-event-loop-anyway.html