Unobtrusive JavaScript: <script> at the top or the bottom of the HTML code?

61,343

Solution 1

There are two possibilities for truly unobtrusive scripts:

  • including an external script file via a script tag in the head section
  • including an external script file via a script tag at the bottom of the body (before </body></html>)

The second one can be faster as the original Yahoo research showed some browsers try to load script files when they hit the script tag and therefore don't load the rest of the page until they have finished. However, if your script has a 'ready' portion which must execute as soon as the DOM is ready you may need to have it in the head. Another issue is layout - if your script is going to change the page layout you want it loaded as early as possible so your page does not spend a long time redrawing itself in front of your users.

If the external script site is on another domain (like external widgets) it may be worth putting it at the bottom to avoid it delaying loading of the page.

And for any performance issues do your own benchmarks - what may be true at one time when a study is done might change with your own local setup or changes in browsers.

Solution 2

It's never so cut and dry - Yahoo recommends putting the scripts just before the closing </body> tag, which will create the illusion that the page loads faster on an empty cache (since the scripts won't block downloading the rest of the document). However, if you have some code you want to run on page load, it will only start executing after the entire page has loaded. If you put the scripts in the <head> tag, they would start executing before - so on a primed cache the page would actually appear to load faster.

Also, the privilege of putting scripts at the bottom of the page is not always available. If you need to include inline scripts in your views that depend on a library or some other JavaScript code being loaded before, you must load those dependencies in the <head> tag.

All in all Yahoo's recommendations are interesting but not always applicable and should be considered on a case-by-case basis.

Solution 3

As others have said, place it before the closing body html tags.

The other day we had numerous calls from clients complaining their sites were extremely slow. We visited them locally and found they took 20-30 seconds to load a single page. Thinking it was the servers performing badly, we logged on - but both web and sql servers were ~0% activity.

After a few minutes, we realised an external site was down, which we were linking to for Javascript tracking tags. This meant browsers were hitting the script tag in the head section of the site and waiting to download the script file.

So, for 3rd party/external scripts at least, I'd recommend putting them as the last thing on the page. Then if they were unavailable, the browser would at least load the page up until that point - and the user would be oblivious to it.

Solution 4

To summarize, based on the suggestions above:

  1. For external scripts (Google analytics, 3rd party marketing trackers, etc.) place them before the </body> tag.
  2. For scripts that affect page layout, place in head.
  3. For scripts that rely on 'dom ready' (like jquery), consider placing before </body> unless you have an edge-case reason to place scripts in head.
  4. If there are inline scripts with dependencies, place the required scripts in head.

Solution 5

If you want to tinker with the position of your scripts, YSlow is a great tool for giving you a flavour if it's going to improve or hurt performance. Putting javascript in certain document positions can really kill page load times.

http://developer.yahoo.com/yslow/

Share:
61,343
e-satis
Author by

e-satis

French Python/Django freelance dev. I love training people all around the world. You can contact me for a session via Formations Python. Got some famous answers about Python decorators, metaclasses and yield, and this :

Updated on January 28, 2020

Comments

  • e-satis
    e-satis over 4 years

    I've recently read the Yahoo manifesto Best Practices for Speeding Up Your Web Site. They recommend to put the JavaScript inclusion at the bottom of the HTML code when we can.

    But where exactly and when?

    Should we put it before closing </html> or after ? And above all, when should we still put it in the <head> section?

  • Lomithrani
    Lomithrani over 15 years
    You know, if you're really concerned with speed then there will be no </body> or </html> - the closing tags for these element types are optional. Put the <script> at the very end, and forget about using </body> and </html> altogether.
  • matt lohkamp
    matt lohkamp over 15 years
    Hopefully Jim is being sarcastic - at any rate, do not take his advice. Well-formed XHTML requires closing tags for every element, including the body and html tags. If your code isn't valid XML, you're doing it wrong.
  • Lomithrani
    Lomithrani over 15 years
    No, I'm not being sarcastic. Take a look at the question. It specifies HTML, not XHTML. It's true that valid XHTML requires these things, but valid HTML does not. There is absolutely nothing wrong with choosing HTML and omitting the closing tags for these element types.
  • Ruan Mendes
    Ruan Mendes over 13 years
    Regarding the script having a 'ready' portion. Putting that script at the bottom of the body guarantees the DOM is ready to be manipulated, if you put it in the head, you have to wrap it so that it waits for the DOMReady(or similar) event
  • Ruan Mendes
    Ruan Mendes over 13 years
    If you have unobtrusive javscript, you won't have inline snippets, the question specifically mentioned unobtrusive.
  • user271608
    user271608 over 13 years
    Cool story bro :) But seriously, this is the most compelling argument I've seen for placing script tags at the bottom of the page.
  • Eran Galperin
    Eran Galperin almost 13 years
    inline <script> tags does not imply obtrusive javascript.
  • Ruan Mendes
    Ruan Mendes almost 13 years
    @Eric Galperin: What is a good use of inline script tags that is not obtrusive?
  • Eran Galperin
    Eran Galperin almost 13 years
    @Juan obstrusive Javascript means that the UI is broken without it, or that it is embedded in the markup. <script> tags are separate from the markup and can be used with code that enhances the interface but is not required. So there is nothing inherently obtrusive about inline <script> tags.
  • Ruan Mendes
    Ruan Mendes almost 13 years
    @Eric: You didn't answer the question, if your script is unobtrusive, there's no need for it to be interlaced within your HTML in the body tag, except for performance optimization.
  • Eran Galperin
    Eran Galperin almost 13 years
    1. My name is Eran not Eric, 2. When you want to pass data to Javascript from a server-side language, in a loop if items for example, you might use <script> tags to encode those values into javascript variables, for use perhaps with inline editing or other similar behavior.
  • Ruan Mendes
    Ruan Mendes almost 13 years
    T@Eran: my bad. The unobtrusive approach separates data and content and provides data as JSON instead of generating while rendering the view.
  • hexalys
    hexalys almost 11 years
    @Juan Yes is does, but by placing the script at the bottom, you are delaying the DOMReady event by the amount of time needed for the browser to parse the document and process the head elements (200-500ms), before it requests that script. Mainly on the first page load (assuming it can be cached from there). Whereas if you place it in the head. It's likely to be ready much faster. So with HTML5 in mind, if the script has to modify the layout when the DOM is ready, you are now better off with an "async" or "defer" script in the head.