> It seems bizzare to me are still using vanilla JS methods to 
> select dom
> nodes/elements.
> speed your code up with.

It may be more expressive, shorter, more elegant, more maintainable,
etc., but _speedier_ it ain't. ;-)  You're suggesting two things:

A) That he bypass what is in most cases a built-in compiled
optimisation of a common selector use case (find by class name) in
favor of using something interpreted and via the notoriously slow DOM


B) That he introduce several completely unnecessary function calls
(#each and its callbacks).

That will not speed up his code.

For instance, on Firefox 3 for Windows, $$ is more than an order of
magnitude (!) slower than getElementsByClassName (both and
1.6.1; the latter surprised me) for the one use case where
getElementsByClassName is useful; in my ad hoc tests between 12x and
25x slower.  Even on IE7 (where getElementsByClassName is not native,
it's supplied by Prototype), $$ is somewhere between slightly slower
and twice as slow because it has to deal with a lot more complexity.

Separately, #each is appropriate only for looping small enumerations
(which, granted, this one probably is), or where time isn't critical
(and given that JavaScript has only one thread, time is pretty much
always critical).  They may not be l33t, but the fastest way *by far*
to loop through an array is a boring old-fashioned for loop.  I mean,
again, we're into orders of magnitude here, 20-25x slower.  This will
continue to be the case at least until #each is directly supported by
the JavaScript interpreter (which is coming!), and even then only if
its JIT compiling can factor out the function call on each iteration
(which in many cases we can expect it will).

Now, if browsers were way fast, it wouldn't matter much.  But the fact
is, right now, we're dealing with a slow environment, hugely slow in
the case of the majority browser, IE.  The freakishly fast Chrome is
helping set the stage for that to change, but as we know, these things
change slowly.

So...let's not tell him to "speed up" his code in ways that will
demonstrably slow it down, eh? ;-)  There are lots of reasons to use $
$ (not least almost complete support for CSS3!), and separately for
using #each (more expressive IMV, less error-prone), but speed isn't
on either list.

Happy coding,
T.J. Crowder
tj / crowder software / com
Independent Software Engineer, consulting services available

On Aug 14, 11:03 am, "Alex McAuley" <>
> Nizmo...
> It seems bizzare to me that you are using Draggables (which relies on
> prototypejs) yet you are still using vanilla JS methods to select dom
> nodes/elements.
> speed your code up with.
> $$('.box').each(function(element) {
> new Draggable(element, {ghosting:true})
> });
> //
> Alex Mcauley
> ----- Original Message -----
> From: "nimzo" <>
> To: "Prototype &" <>
> Sent: Thursday, August 13, 2009 9:36 PM
> Subject: [Proto-Scripty] How to disable draggables in
> > Hi-
> > I'm trying to make a group of objects draggable as you can see below -
> > easy enough. But I'd like to configure things so that at the very
> > moment any one of these items is dragged, the others automatically
> > cease to be draggable. Does anyone know how to do this?
> >    var products = document.getElementsByClassName('box');
> >    for (var i = 0; i < products.length; i++) {
> >        new Draggable(products[i].id, {ghosting:true})
> >    }
> > Thanks very much.
You received this message because you are subscribed to the Google Groups 
"Prototype &" group.
To post to this group, send email to
To unsubscribe from this group, send email to
For more options, visit this group at

Reply via email to