JavaScript in <head> or just before </body>?

25,524

Solution 1

I think a lot of developers run JavaScript just before the </body> so that it is run after all the elements have been rendered.

However, if you organise your code correctly, the position on the page doesn't matter.

For example, when using jQuery, you can ensure the code isn't run until the page and its elements are fully rendered by doing the following:

$(document).ready(function(){
   //Code here
});

Then the script reference can be put in the head tag.


Script tags should be referenced just before </body>. This prevents render blocking while the scripts load and is much better for site perception speed.

No obtrusive JavaScript should be used when using this technique.

Solution 2

JavaScript code should be placed at the end of the document so that it doesn't delay the parallel loading of page elements. This does then require that the JavaScript code is written in a specific way, but it does improve the speed of page loads.

Also, ideally you could host references like this under a different (sub)domain. References to jQuery should be pointed to Google's CDN too.

See Best Practices for Speeding Up Your Web Site for more information.

Solution 3

One of the reasons you'd want to put scripts before the </body> is if they manipulate the DOM without user interaction, so you'll need the DOM to be loaded in order to be manipulated. Another way to do that is to add an event listener and run the scripts when the page has loaded, but this will require additional code, which might get complicated if you have a lot of scripts, especially ones you haven't written yourself. Putting them at the end of the page also will speed up page load, though in the case of DOM manipulating scripts you might get some not-so-pretty results from that.

Solution 4

I'd say that's perfectly sensible. As you said, as long as you don't move essential scripts (e.g. jQuery, Modernizr, etc., etc.) out from the <head>, you shouldn't have problems.

Moving non-essential scripts to the bottom of the page should help with the perceived loading speed (that and minimizing / concatenating scripts).

Solution 5

It all depends on what you mean by "essential for UX". I agree with having Modernizr appear early for example, but not everything needs to load straight away. If you're trying to avoid a flash of unstyled text (FOUT), that's a good reason. Similarly, if you have scripts that affect how the page looks before the user does anything, you should load those early.

Don't forget though, speed is part of UX. There's no advantage in having some jQuery interaction ready to run when the user can't see the content it applies to yet. The difference between loading the scripts at the start of the end is a matter of seconds. If you let the page load first, the user will be using those seconds to take the page in, allowing you to load scripts unobtrusively.

Your page will load faster if you move scripts to the bottom of the page, and that makes a difference to your pagerank these days.

Also, some versions of Internet Explorer will throw errors if you try to run a script before the element it refers to has loaded.

Like Ed says, your scripts should be stored in a separate file, and in as few files as possible.

Share:
25,524

Related videos on Youtube

timkl
Author by

timkl

Web Designer &amp; Junglist

Updated on July 09, 2022

Comments

  • timkl
    timkl almost 2 years

    I am about to embark on a new web project and I plan to put some JavaScripts in the <head> and also some before </body>, using the following scheme:

    1. Scripts that are essential for the UX of the page: in the <head>. As I've picked up perusing the web - scripts in the <head> is loaded before the page loads, so it would make sense to put scripts that are essential to the user experience there.

    2. Scripts that are non-essential to the design and UX (Google Analytics scripts etc.): before the </body>.

    Is this a sensible approach?

    Another approach would be to put all the scripts in the <head> and add defer attributes to the non-essential scripts. However, I read that older versions of Firefox don't pick up the defer attribute.

    • Bojangles
      Bojangles over 12 years
      I think that's a perfectly acceptable approach. I read somewhere that defer doesn't work on a lot of browsers, but I could be hopelessly wrong.
    • ikromm
      ikromm over 12 years
      I suppose it's all about taste. I personally add them before the body tag (in the head) and also add small snippets where needed inside the page.
    • Conan
      Conan over 12 years
      just noticed this looks like a dupe of stackoverflow.com/questions/1013112/….
    • Frias
      Frias over 12 years
      I think I can look at this answer: stackoverflow.com/questions/436411/… It may help you
    • Rudy
      Rudy over 12 years
      website performance rule : put all css in the beginning(head) and put all javascript in the end of the page.
    • Peter Mortensen
      Peter Mortensen over 2 years
  • daveyfaherty
    daveyfaherty over 12 years
    Don't forget, content loads faster when you move scripts to the bottom. Assuming that ajax isn't being used to load the pages default content.
  • Lapple
    Lapple over 12 years
    Position is extremely important, even when using DOMReady. A lot of developers put javascript tags just before the </body> because all scripts are loaded and executed synchronously. When they are in the <head>, the page rendering stops to download → parse → execute each script.
  • kingdango
    kingdango over 12 years
    (Piling on...) The primary reason for putting SCRIPTs at the bottom of the page is less about making sure the DOM is loaded (albeit an important reason) and more about making the page appear RESPONSIVE. If you load scripts at the top of the page the browser downloads them first and your content waits until they're downloaded -- this can make the page APPEAR to load slower, making users unhappy.
  • Hemant Tank
    Hemant Tank over 12 years
    But what happens if the user starts playing with the page. Suppose I've an AJAX dropdown which will start loading after the page has appeared to the user but while it is loading, the user clicks it! And what if a 'really impatient' user submits the form?
  • naught101
    naught101 about 10 years
    You need to put backticks (``) around the <body> tag in your answer.
  • ivanleoncz
    ivanleoncz over 5 years
    That doesn't seem to be a good idea. Plenty resources (a lot described here) have mentions to put JavaScript (external or declared script), always before </body> tag. Here, I quote W3Schools: Placing scripts at the bottom of the <body> element improves the display speed, because script compilation slows down the display. But regarding the point of organizing JavaScripts on external sources: there's no doubt that this is a good practice, indeed, regarding code readability, for example.