I try to optimize my pages by putting some async
attributes on my scripts. It seems to break my javascript since $(document).ready
is executed before the all scripts are loaded!
I saw that I can resolve my problem by putting $(window).load
instead of $(document).ready
but I was wondering if there is a better solution.
This solution trigger 2 problems in my case :
$(document).ready
and tell all the developpers to not use it anymoreDo you have some magic tricks? Maybe putting all scripts at the end? use defer
instead of async
?
After some extensive research, I can definitely say that putting scripts at the end of the page is THE best practice.
Yahoo agrees with me : http://developer.yahoo.com/performance/rules.html#js_bottom
Google don't talk about this practice and seems to prefer async scripts : https://developers.google.com/speed/docs/best-practices/rtt#PreferAsyncResources
IMHO, putting script at the end of the page has several benefits over async/defer:
$(document).ready
or $(window).load
The only drawback that I can see is that the browser won't be able to parallelize the downloads. One good reason to use async/defer instead is when you have a script that is completly independant ( do not need to rely on the execution order) and that don't need to be executed at a specific timing. Example : google analytics.
defer
would definitely help here.
defer
is generally better than async
because it:
async
)async
)async
that executes in parallel when the page is still loading and it actually halts the dom-parsing!)ready
fires after the "deferred" scripts have been loaded (this is what you're asking)This SO answer has a very nice picture illustrating defer/async load order, super-understandable.
If you didn't want to use a script loader, you could use the following approach which would allow you to leave your $(document).ready scripts in place - modified as follows:
$(()=>{
function checkAllDownloads() {
// Ensure your namespace exists.
window.mynamespace = window.mynamespace || {};
// Have each of your scripts setup a variable in your namespace when the download has completed.
// That way you can set async on all your scripts except jquery.
// Use the document ready event - this code - to check if all your scripts have downloaded.
if (window.mynamespace.script1 && window.mynamespace.script2){
// Proceed with page initialisation now that all scripts have been downloaded.
// [ Add your page initialisation code here ].
return;
}
// Not all downloads have completed.
// Schedule another check to give the async downloads time to complete.
setTimeout(checkAllDownloads, 500);
}
// check if it is safe to initialise the page by checking if all downloads have completed.
checkAllDownloads();
})
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With