JavaScript Dynamic Loading
Response Time
0

                0.1


                 1


Jakob Nielsen   10
0

                0.1


                 1


Jakob Nielsen   10
Huge JavaScript
91%
75%
Heavy loading   Quick response
JavaScript Dynamic Loading
JavaScript
<html>
 <body>
    :
  <script src=”jQuery.js”></script>
  <script src=”jq-plugin-x.js”></script>
  <script src=”jq-plugin-y.js”></script>
  <script src=”prototype.js”></script>
  <script src=”pt-plugin-x.js”></script>
  <script src=”pt-plugin-y.js”></script>
  <script src=”init-rendering.js”>
  <script src=”facebook-plugin.js”>
  <script src=”twitter-plugin.js”>
 </body>
</html>
<html>
 <head>
  <script src=”loader.js”></script>
  <script>
     document.onload = function() {
       /* do loading */
     };
  </script>
 </head>
</html>
How
XHR + eval

var xhrObj = new XMLHttpRequest();
xhrObj.onreadystatechange =
 function() {
   if ( xhrObj.readyState == 4 ) {
     eval(xhrObj.responseText);
   }
 };
xhrObj.open('GET', 'A.js', true);
xhrObj.send('');
XHR + injection
var xhrObj = new XMLHttpRequest();
xhrObj.onreadystatechange =
 function() {
   if ( xhrObj.readyState == 4 ) {
     var scriptElem = document.createElement('script');
     var headElem = document.getElementsByTagName('head')[0];
     headElem.appendChild(scriptElem);
     scriptElem.text = xhrObj.responseText;
   }
 };
xhrObj.open('GET', 'A.js', true);
xhrObj.send('');
dom element


var scriptElem = document.createElement('script');
scriptElem.type= 'text/javascript';
scriptElem.src = 'http://anydomain.com/A.js';

var headElem = document.getElementsByTagName('head')[0];
headElem.appendChild(scriptElem);
dom element (not execute)


var scriptElem = document.createElement('script');
scriptElem.type= 'text/html';
scriptElem.src = 'http://anydomain.com/A.js';

var headElem = document.getElementsByTagName('head')[0];
headElem.appendChild(scriptElem);
XHR
var xhrObj = new XMLHttpRequest();

xhrObj.onreadystatechange =
 function() {
   if ( xhrObj.readyState == 4 ) {
     /* eval or injection */

        /* JavaScript onload */
    }
  };

xhrObj.open('GET', 'A.js', true);
xhrObj.send('');
dom element


var scriptElem = document.createElement('script');
scriptElem.src = 'http://anydomain.com/A.js';

scriptElem.onload = function() { /* JavaScript onload */ };

document.getElementsByTagName('head').appendChild(scriptElem);
with IE :)
var scriptElem = document.createElement('script');
scriptElem.src = 'http://anydomain.com/A.js';

scriptElem.onload = function() {
  if ( !scriptElem.onloadDone ) {
    scriptElem.onloadDone = true;
    /* JavaScript onload */
  }
};
scriptElem.onreadystatechange = function() { /* for IE */
  if ( xhrObj.readyState == 4 || xhrObj.readyState == 2 ) {
    if ( !scriptElem.onloadDone ) {
      scriptElem.onloadDone = true;
      /* JavaScript onload */
    }
  }
};

document.getElementsByTagName('head').appendChild(scriptElem);
When / What
The three things you should know
1
2
3
UI
Points
One more thing ...
Thunk you
JavaScript Dynamic Loading
JavaScript Dynamic Loading

JavaScript Dynamic Loading

  • 1.
  • 3.
  • 4.
    0 0.1 1 Jakob Nielsen 10
  • 5.
    0 0.1 1 Jakob Nielsen 10
  • 7.
  • 8.
  • 10.
  • 12.
    Heavy loading Quick response
  • 13.
  • 14.
  • 18.
    <html> <body> : <script src=”jQuery.js”></script> <script src=”jq-plugin-x.js”></script> <script src=”jq-plugin-y.js”></script> <script src=”prototype.js”></script> <script src=”pt-plugin-x.js”></script> <script src=”pt-plugin-y.js”></script> <script src=”init-rendering.js”> <script src=”facebook-plugin.js”> <script src=”twitter-plugin.js”> </body> </html>
  • 19.
    <html> <head> <script src=”loader.js”></script> <script> document.onload = function() { /* do loading */ }; </script> </head> </html>
  • 20.
  • 21.
    XHR + eval varxhrObj = new XMLHttpRequest(); xhrObj.onreadystatechange = function() { if ( xhrObj.readyState == 4 ) { eval(xhrObj.responseText); } }; xhrObj.open('GET', 'A.js', true); xhrObj.send('');
  • 22.
    XHR + injection varxhrObj = new XMLHttpRequest(); xhrObj.onreadystatechange = function() { if ( xhrObj.readyState == 4 ) { var scriptElem = document.createElement('script'); var headElem = document.getElementsByTagName('head')[0]; headElem.appendChild(scriptElem); scriptElem.text = xhrObj.responseText; } }; xhrObj.open('GET', 'A.js', true); xhrObj.send('');
  • 23.
    dom element var scriptElem= document.createElement('script'); scriptElem.type= 'text/javascript'; scriptElem.src = 'http://anydomain.com/A.js'; var headElem = document.getElementsByTagName('head')[0]; headElem.appendChild(scriptElem);
  • 24.
    dom element (notexecute) var scriptElem = document.createElement('script'); scriptElem.type= 'text/html'; scriptElem.src = 'http://anydomain.com/A.js'; var headElem = document.getElementsByTagName('head')[0]; headElem.appendChild(scriptElem);
  • 27.
    XHR var xhrObj =new XMLHttpRequest(); xhrObj.onreadystatechange = function() { if ( xhrObj.readyState == 4 ) { /* eval or injection */ /* JavaScript onload */ } }; xhrObj.open('GET', 'A.js', true); xhrObj.send('');
  • 28.
    dom element var scriptElem= document.createElement('script'); scriptElem.src = 'http://anydomain.com/A.js'; scriptElem.onload = function() { /* JavaScript onload */ }; document.getElementsByTagName('head').appendChild(scriptElem);
  • 29.
    with IE :) varscriptElem = document.createElement('script'); scriptElem.src = 'http://anydomain.com/A.js'; scriptElem.onload = function() { if ( !scriptElem.onloadDone ) { scriptElem.onloadDone = true; /* JavaScript onload */ } }; scriptElem.onreadystatechange = function() { /* for IE */ if ( xhrObj.readyState == 4 || xhrObj.readyState == 2 ) { if ( !scriptElem.onloadDone ) { scriptElem.onloadDone = true; /* JavaScript onload */ } } }; document.getElementsByTagName('head').appendChild(scriptElem);
  • 31.
  • 36.
    The three thingsyou should know
  • 37.
  • 39.
  • 41.
  • 43.
  • 44.
  • 46.
  • 50.