Why is it that services like Google and Facebook use document.createElement('script') instead of just <script>?
The Google Analytics snippet:
<script type="text/javascript">
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
</script>
could be written as just:
<script src="//www.google-analytics.com/ga.js" type="text/javascript"></script>
and Facebook’s like button:
<script>(function(d, s, id) {
var js, fjs = d.getElementsByTagName(s)[0];
if (d.getElementById(id)) return;
js = d.createElement(s); js.id = id;
js.src = "//connect.facebook.net/en_GB/all.js#xfbml=1&appId=xxx";
fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));</script>
could be simplified as just:
<script src="//connect.facebook.net/en_GB/all.js#xfbml=1&appId=xxx"></script>
I know there’s some playing safe in them, but other than that I don’t see why we shouldn’t use the HTML5 ones?
The
<script src=...>blocks the browser whiledocument.createElement('script')loads the JavaScript asynchronously; this is the primary reason.The
<script src=...>tag blocks browser from displaying rest of the page until the script is loaded and executed. This ensures that scripts are executed in correct order and anydocument.write()in that script work as expected. However this creates a laggy browsing experience for the user.When the script is loaded asynchronously, the browser can download the script without blocking the page display. This improves the browsing experience dramatically.
To load the scripts asynchronously one can use HTML markup:
The
asyncattribute was introduced in HTML5 while thedeferattribute can be added as a fallback for older versions of IE. This document describes how async and defer attribute work.Alternately, one can use JavaScript to build a script tag:
JavaScript generated script tags work in most browsers even if they do not understand the
asyncattribute or.async = trueproperty.About schemeless URIs (
//example.com/script.js): schemeless URIs seem to work almost everywhere (see this question).About the Google Analytics example: both old and new code use JavaScript to detect the protocol then load
http://www.orhttps://ssl.which is not possible via HTML markup.