W3C home > Mailing lists > Public > whatwg@whatwg.org > September 2012

Re: [whatwg] Deferring javascript download and execution until after onload

From: Jonas Sicking <jonas@sicking.cc>
Date: Mon, 17 Sep 2012 23:54:19 -0700
Message-ID: <CA+c2ei8oFUmOtp08w5SXMMfzc79-pMdwgKwK9ZnmWpCOnKmgVQ@mail.gmail.com>
To: Andy Davies <dajdavies@gmail.com>
Cc: WHATWG List <whatwg@whatwg.org>
On Mon, Sep 17, 2012 at 4:19 AM, Andy Davies <dajdavies@gmail.com> wrote:
> The script defer attribute allows us to defer JS until after
> DOMContentLoaded (?) but it will still execute before onLoad
>
> Sometimes there's a quite a bit of content on a page that could be
> deferred until after onLoad, for example suplemental content such as
> social media buttons, feedback forms etc. where they really don't make
> much sense until the page hase loaded.
>
> Currently patterns like the code below are being used to implement
> this type of behaviour but has any thought been given to being able to
> specify as part of the script element that the script could be
> deferred until after onLoad?
>
> <script>
> (function(w, d, s) {
>   function go(){
>     var js, fjs = d.getElementsByTagName(s)[0], load = function(url, id) {
>           if (d.getElementById(id)) {return;}
>           js = d.createElement(s); js.src = url; js.id = id;
>           fjs.parentNode.insertBefore(js, fjs);
>         };
>     load('//connect.facebook.net/en_US/all.js#appId=272697932759946&xfbml=1',
> 'fbjssdk');
>     load('https://apis.google.com/js/plusone.js', 'gplus1js');
>     load('//platform.twitter.com/widgets.js', 'tweetjs');
>   }
>   if (w.addEventListener) { w.addEventListener("load", go, false); }
>   else if (w.attachEvent) { w.attachEvent("onload",go); }
> }(window, document, 'script'));
> </script>
>
> Script was borrowed from
> http://www.aaronpeters.nl/blog/why-loading-third-party-scripts-async-is-not-good-enough

There has been discussions about implementing a "noexec" attribute on
<script> which would just load the script but instead of evaluating it
as soon as it's available, simply fire the "load" event. There would
also be an additional .execute() function on the script which would
permit executing the script after it has been loaded.

This has mostly been discussed in a performance context where people
has expressed interest in loading scripts, while only waiting to
execute it until needed in order to avoid the costs involved in
parsing and executing the script.

So far Hixie hasn't been interested in putting this into the spec
though, due to, as I understand it, not being convinced that it's
needed from a performance point of view.

I'd personally be interested to see it implemented since people
clearly do load scripts dynamically and it would seem common for such
scripts to have dependencies on each other, which means that you have
to be able to execute them in a certain order.

/ Jonas
Received on Tuesday, 18 September 2012 06:55:22 UTC

This archive was generated by hypermail 2.4.0 : Wednesday, 22 January 2020 16:59:45 UTC