Where should I put `. Are you able to explain why? I thought I need to have the async tag in for performance—per the accepted answer—so my page can load even while jQuery is still loading]. Thanks! – elbowlobstercowstand Aug 06 '15 at 08:10

  • 3
    @elbow 99% of times ` – Salman A Aug 06 '15 at 09:12
  • 1
    @SalmanA Thank you! Yes, I fall in that 99%. I first need `jquery` lib to load, *then* my remaining `.js` scripts. When I declare `async` or `defer` on the `jquery` lib script tag, my `.js` scripts don't work. I thought `$(function(){ ... })`protected that—guess not. **Current solution:** I don't add `defer` or `async` on `jquery` lib script, but I do add `async` on my follow up `.js` scripts. Note: the reason I'm doing *any* of this is to make Google Page Speed happy. Thx again for the help! Any other advice is welcome. (Or a link to your previous answer). :) – elbowlobstercowstand Aug 06 '15 at 21:22
  • @elbow See http://stackoverflow.com/a/21013975/87015, it will only give you an idea but not the complete solution. You could instead search for "jquery async loader libraries". – Salman A Aug 07 '15 at 05:40
  • 40

    The standard advice, promoted by the Yahoo! Exceptional Performance team, is to put the <script> tags at the end of the document body so they don't block rendering of the page.

    But there are some newer approaches that offer better performance, as described in this answer about the load time of the Google Analytics JavaScript file:

    There are some great slides by Steve Souders (client-side performance expert) about:

    • Different techniques to load external JavaScript files in parallel
    • their effect on loading time and page rendering
    • what kind of "in progress" indicators the browser displays (e.g. 'loading' in the status bar, hourglass mouse cursor).
    Rory O'Kane
    • 25,436
    • 11
    • 86
    • 123
    orip
    • 66,082
    • 20
    • 111
    • 144
    25

    If you are using JQuery then put the javascript wherever you find it best and use $(document).ready() to ensure that things are loaded properly before executing any functions.

    On a side note: I like all my script tags in the <head> section as that seems to be the cleanest place.

    Andrew Hare
    • 320,708
    • 66
    • 621
    • 623
    • 14
      in the head...er? `
      `?
      – Dan Lugg Jan 20 '13 at 17:43
    • 7
      Note that using `$(document).ready()` doesn’t mean you can put your JavaScript *anywhere* you like – you still have to put it after the ` – Rory O'Kane Jul 10 '13 at 15:42
    • 2
      It is not optimal to put script tags in the section - this will delay display of the visible part of the page until the scripts are loaded. – CyberMonk Oct 14 '13 at 00:33
    • No, @Dan, a `header` element is part of the the HTML document content, and should occur one or more times within the `body` element`. The `head` tag is for meta-data and non-content data for the document. It is, these days, with `defer` and `async` an ideal place for script tags. `header` elements should only contain information that describes the section of the document that follows it. – ProfK Mar 29 '17 at 13:59
    • 1
      @ProfK, Dan was referring to the original unedited question when he posted this over 4 years ago. As you can see, the question was edited a year later. – kojow7 May 11 '17 at 16:51
    21

    The modern approach in 2019 is using ES6 module type scripts.

    <script type="module" src="..."></script>
    

    By default, modules are loaded asynchronously and defered. i.e. you can place them anywhere and they will load in parallel and execute when the page finishes loading.

    The differences between a script and a module are described here:

    https://stackoverflow.com/a/53821485/731548

    The execution of a module compared to a script is described here:

    https://developers.google.com/web/fundamentals/primers/modules#defer

    Support is shown here:

    https://caniuse.com/#feat=es6-module

    cquezel
    • 2,567
    • 22
    • 27
    • nice info to add to the knowledge base – Sagar Apr 29 '19 at 05:18
    • 2
      Just a note that this will not work if you're just trying stuff out on your local filesystem with no server. At lest on Chrome you get a cross-origin error trying to load the js from the HTML even though they both have the same origin, your filesystem. – hippietrail Sep 10 '19 at 06:26
    14
    <script src="myjs.js"></script>
    </body>
    

    script tag should be use always before body close or Bottom in HTML file.

    Page will load with html and css and later js will load.

    check this if require : http://stevesouders.com/hpws/rule-js-bottom.php

    AmanKumar
    • 1,155
    • 1
    • 17
    • 33
    • 3
      This actually answered the question. I was wondering nearly all the examples posted never gave the proper visual context of "end of the page" – Ken Ingram Dec 16 '16 at 01:23
    • 2
      This answer is very misleading and most probably wrong. The articles in [Google](https://developers.google.com/speed/docs/insights/BlockingJS) and in [MDN](https://developer.mozilla.org/en-US/docs/Web/Events/DOMContentLoaded) suggests that synchronous JS (which is the case here) always blocks DOM construction and parsing which will result in delayed first-render. Therefore, you cannot see the content of the page until the JS file is fetched and finishes executing regardless of where you place your JS file in the HTML document as long as it is synchronous – Lingaraju E V Oct 26 '17 at 06:31
    • It also references points made in 2009 and no longer relevant. – toxaq Oct 30 '17 at 01:37
    • did you actually mean "otherwise you'll be able to see the content before loading the js file and that's bad?" – ahnbizcad Sep 10 '20 at 23:27
    • It is good practice not to put script tags at the end of the body or html code. Just like other declarative or meta information this should go in the head section reducing clutter of none content related information all over the place. Get used to using async or even better defer. Word Press can be a bit tricky, though. It puts the JavaScript in the wp_head but without the defer. https://stackoverflow.com/questions/18944027/how-do-i-defer-or-async-this-wordpress-javascript-snippet-to-load-lastly-for-fas/20672324#20672324 – theking2 Apr 28 '21 at 15:51
    11

    XHTML Won't Validate if the script is anywhere other than within the head element. turns out it can be everywhere.

    You can defer the execution with something like jQuery so it doesn't matter where it's placed (except for a small performance hit during parsing).

    Allain Lalonde
    • 85,857
    • 67
    • 175
    • 234
    • 1
      XHTML will validate with script tags in the body, both strict and transitional. Style tags however may only be in the head. – I.devries Jan 12 '09 at 18:43
    10

    The best place to put <script> tag is before closing </body> tag, so the downloading and executing it doesn't block the browser to parse the html in document,

    Also loading the js files externally has it's own advantages like it will be cached by browsers and can speed up page load times, it separates the HTML and JavaScript code and help to manage the code base better.

    but modern browsers also support some other optimal ways like async and defer to load external javascript files.

    Async and Defer

    Normally HTML page execution starts line by line. When an external JavaScript element is encountered, HTML parsing is stopped until a JavaScript is download and ready for execution. This normal page execution can be changed using defer and async attribute.

    Defer

    When a defer attribute is used, JavaScript is downloaded parallelly with HTML parsing but will be execute only after full HTML parsing is done.

    <script src="/local-js-path/myScript.js" defer></script>
    

    Async

    When async attribute is used, JavaScript is downloaded as soon as the script is encountered and after the download, it will be executed asynchronously (parallelly) along with HTML parsing.

    <script src="/local-js-path/myScript.js" async></script>
    

    When to use which attributes

    • If your script is independent of other scripts and is modular, use async.
    • If you are loading script1 and script2 with async, both will run
      parallelly along with HTML parsing, as soon as they are downloaded
      and available.
    • If your script depends on another script then use defer for both:
    • When script1 and script2 are loaded in that order with defer, then script1 is guaranteed to execute first,
    • Then script2 will execute after script1 is fully executed.
    • Must do this if script2 depends on script1.
    • If your script is small enough and is depended by another script of type async then use your script with no attributes and place it above all the async scripts.

    reference:knowledgehills.com

    Haritsinh Gohil
    • 3,299
    • 26
    • 33
    7

    The conventional (and widely accepted) answer is "at the bottom", because then the entire DOM will have been loaded before anything can start executing.

    There are dissenters, for various reasons, starting with the available practice to intentionally begin execution with a page onload event.

    dkretz
    • 36,502
    • 13
    • 76
    • 133
    3

    Depends, if you are loading a script that's necessary to style your page / using actions in your page (like click of a button) then you better place it on the top. If your styling is 100% CSS and you have all fallback options for the button actions then you can place it in the bottom.

    Or best thing (if that's not a concern) is you can make a modal loading box, place your javascript at the bottom of your page and make it disappear when the last line of your script gets loaded. This way you can avoid users using actions in your page before the scripts are loaded. And also avoid the improper styling.

    ahmedmzl
    • 353
    • 2
    • 3
    • 14
    3

    Including scripts at the end is mainly used where the content/ styles of the website is to be shown first.

    including the scripts in the head loads the scripts early and can be used before the loading of the whole web site.

    if the scripts are entered at last the validation will happen only after the loading of the entire styles and design which is not appreciated for fast responsive websites.

    Sanjeev S
    • 913
    • 1
    • 12
    • 26
    2
    • If you still care a lot about support and performance in IE<10, it's best to ALWAYS make your script tags the last tags of your HTML body. That way, you're certain that the rest of the DOM has been loaded and you won't block and rendering.

    • If you don't care too much anymore about IE<10, you might want to put your scripts in the head of your document and use defer to ensure they only run after your DOM has been loaded (<script type="text/javascript" src="path/to/script1.js" defer></script>). If you still want your code to work in IE<10, don't forget to wrap your code in a window.onload even, though!

    • In the accepted answer, this is refered to as the “antiquated recommendation”. If you still mean it, you probably should produce some reference to back it. – dakab Jan 20 '16 at 20:10
    2

    Depending on the script and its usage the best possible (in terms of page load and rendering time) may be to not use a conventional <script>-tag per se, but to dynamically trigger the loading of the script asynchronously.

    There are some different techniques, but the most straight forward is to use document.createElement("script") when the window.onload event is triggered. Then the script is loaded first when the page itself has rendered, thus not impacting the time the user has to wait for the page to appear.

    This naturally requires that the script itself is not needed for the rendering of the page.

    For more information, see the post Coupling async scripts by Steve Souders (creator of YSlow but now at Google).

    stpe
    • 3,491
    • 3
    • 29
    • 37
    1

    Script blocks DOM load untill it's loaded and executed.

    If you place scripts at the end of <body> all of DOM has chance to load and render (page will "display" faster). <script> will have access to all of those DOM elements.

    In other hand placing it after <body> start or above will execute script (where there's still no DOM elements).

    You are including jQuery which means you can place it wherever you wish and use .ready()

    Szymon Toda
    • 3,887
    • 11
    • 35
    • 59
    1

    I think it depends on the webpage execution. If the page that you want to display can not displayed properly without loading JavaScript first then you should include JavaScript file first. But If you can display/render a webpage without initially download JavaScript file, then you should put JavaScript code at the bottom of the page. Because it will emulate a speedy page load, and from an user's point of view it would seems like that page is loading faster.

    Amit Mhaske
    • 351
    • 1
    • 8
    1

    You can place most of <script> references at the end of <body>,
    But If there are active components on your page which are using external scripts,
    then their dependency (js files) should come before that (ideally in head tag).

    Tech AG
    • 46
    • 3
    1

    The best place to write your JavaScript code is at the end of the document after or right before the </body> tag to load the document first and then execute js code.

    <script> ... your code here ... </script>
    </body>
    

    And if you write in JQuery the following can be in the head document and it will execute after the document loads:

    <script>
    $(document).ready(function(){
       //your code here...
    });
    </script>
    
    Paul Carlton
    • 2,487
    • 1
    • 21
    • 35
    nada diaa
    • 119
    • 10
    0

    You can add JavaScript code in an HTML document by employing the dedicated HTML tag <script> that wraps around JavaScript code.

    The <script> tag can be placed in the <head> section of your HTML, in the <body> section, or after the </body> close tag, depending on when you want the JavaScript to load.

    Generally, JavaScript code can go inside of the document <head> section in order to keep them contained and out of the main content of your HTML document.

    However, if your script needs to run at a certain point within a page’s layout — like when using document.write to generate content — you should put it at the point where it should be called, usually within the <body> section.

    Nitesh Singh
    • 227
    • 1
    • 1
    • 12
    -1

    It makes more sense to me to include the script after the HTML. Because most of the time I need the Dom to load before I execute my script. I could put it in the head tag but I don't like all the Document loading listener overhead. I want my code to be short and sweet and easy to read.

    I've heard old versions of safari was quarky when adding your script outside of the head tag but I say who cares. I don't know anybody using that old crap do you.

    Good question by the way.

    zachdyer
    • 579
    • 1
    • 7
    • 16