Coding with Jesse

JavaScript Speed Detection

December 14th, 2005

This question came up on the css-discuss mailing list today (asked by Howard 'duke' Holtz):

I would like to include a Flash header on the homepage, but switch to a standard gif header for viewers with slow connections. I was hoping that there is a way to maybe have two “includes”, and use one or the other – but first I need some kind of 'conditional switch' or 'logic switch'.

This is a great question. I don't think any website has addressed this issue through scripting. We've all seen websites that start off with "Click here for Flash, Click here for slow connections" pages. But what about using JavaScript to test the speed of a connection?

I started experimenting with JavaScript and came up with a fairly simple, clean solution. It is all based on the onload event of an image. What we will do is time how long it takes to load an image. If the time is below our threshold for "high speed", we will display the flash content. Otherwise, we will do nothing and display the default content.

<script type="text/javascript">
var start = (new Date()).getTime();
var THRESHOLD = 2500; // a number we will calculate below

function speedTest() {
    var duration = (new Date()).getTime() - start;
    if (duration < THRESHOLD) {
        // fast connection (display flash)
    } else {
        // slow connection (do nothing?)
    }
}
</script>
<img src="some-image.jpg" onload="speedTest()">

The onload event can go on any image on the page, preferably the largest image to give us a better estimate. Let's say we only want users downloading faster than 10k/s to get the flash code. We check the size of our some-image.jpg, and see that it is 25kb. We can easily calculate the THRESHOLD value like so: (25kb) / (10k/s) = 2.5s. Converting this to milliseconds gives us 2500, so this is what we will use for the THRESHOLD.

If you're using Bobby VanDerSluis' Unobtrusive Flash Objects 2.0, you can put the UFO code to load Flash in the block for users with a fast connection. You can then do nothing for users with a slow connection and just let them see the default content on the page.

I have thought of one problem with this solution: if the image is in the user's cache, the number will be very low. This will cause the flash to be loaded if they come back later. To avoid this, you could add a no-cache rule on the webserver for this image. Or, instead of using an image on the page, you could load an image in the background with JavaScript using a random URL like so:

var testImage = new Image();
testImage.onload = speedTest;
testImage.src = "some-image.jpg?random=" + Math.random();

Of course, if you are using PHP or another scripting language on the server, you could generate the random URL a number of different ways. This fix also has the downside that the visitor must download this extra image every time. You'll have to balance these factors in your solution to come up with one that fits.

Good luck! I'd love to hear your comments, suggestions and questions about this. Let me know how it goes on your own web sites!


Interested in web development? Subscribe to my newsletter!

Comments

1 . Mikhail Bozgounov at 2005-12-15T13:01:30.000Z

Mikhail Bozgounov

...should try it one of these days.

Could this be done through PHP too?

Just an idea...

And thx for sharing this! :-)

2 . Jesse Skinner at 2005-12-15T17:18:02.000Z

Jesse Skinner

Ya, it should totally be possible with PHP. I guess it would work more or less the same way.. sending a file, checking how long it takes, and perhaps setting a SESSION variable with the viewing-mode.

I'm just packing to go back to Canada for the holidays, so somebody else will have to write up the PHP solution :)

Happy Holidays,
Jesse

3 . haribol at 2007-11-28T23:23:08.000Z

haribol

tahank you for this script

4 . Damien at 2008-01-10T16:40:44.000Z

Damien

Nice idea!

5 . Rob at 2008-02-21T20:28:29.000Z

Rob

Does image size matter?

6 . nG at 2008-04-20T02:33:49.000Z

nG

I have been thinking about this as well. The only issue is using an image. The user has to load the image... that is the only major problem I see with this. Adding a timeout would help make it better, but I still cringe at the thought of making them load a file to test the speed.

7 . Rob at 2008-04-21T14:44:14.000Z

Rob

I think using an image for the test is standard, but I'm no expert. I know that sites like pcpitstop.com uses images to test the speed. My boss uses a service that detects connection speeds, I wonder how they work...?

8 . Alex Le at 2008-04-22T06:52:07.000Z

Alex Le

Based on this article, I wrote a more completed solution to use javascript for speed detection on my blog

http://alexle.net/archives/257

Cheers!

Alex

9 . MooCow at 2008-05-07T14:20:14.000Z

MooCow

I have a high-speed connection and I still don't want to see anything that's made in Flash. In fact I browse with disabled plug-ins because Flash is an annoyance in 99.9999999% of cases.

Don't assume that high-speed = Flash and low-speed = HTML/CSS.

10 . Rob at 2008-05-07T14:24:29.000Z

Rob

MooCow...I somewhat agree with you. Being a frequent visitor of sites like espn.go.com, they WAY over do it with flash, but with a high-speed connection, I can't see how that can be such an annoyance. Nonetheless, you're right. I never believed in the thought of having a high-speed version of a site as well as a low-speed. That's just too much.

11 . Jesse Skinner at 2008-05-07T14:28:47.000Z

Jesse Skinner

@MooCow, @Rob - I agree as well. In a perfect world, all sites would be low-speed, and people would click specifically to see large things (videos, games, etc.)

The worse thing is, most Flash sites don't even give a choice, because they don't even have a non-Flash version. Say goodbye to search engine optimization and accessibility!

12 . Steve Barett at 2009-04-22T03:36:13.000Z

Steve Barett

At least the last three posts were over a year ago since they smell of typical neanderthal ignorance.

13 . Steve Barett at 2009-04-22T03:37:09.000Z

Steve Barett

btw Jesse, thanks for your work on this, really useful.

14 . Rob at 2009-04-22T13:41:50.000Z

Rob

"At least the last three posts were over a year ago since they smell of typical neanderthal ignorance."

Does anyone else find it ironic how ignorant this statement is? Sounds like someone is masking their intelligence (or lack thereof) by saying "typical neanderthal ignorance". Steve, can you even explain what that means? Is "typical neanderthal ignorance" a fancy way of saying "someone who is stuck in their ways"? If so, how exactly do they fit under that description?

I (Rob) was merely saying that too much flash can impede someone as they are trying to view a webpage. Particulary on sites, like espn, where if you accidentally hover over an ad it drops down over other content and selections or if you click on a link before the page is completely loaded and the link you want to click on drops lower, so the browser registers your link click on something else.

Steve, when calling someone ignorant, generally, you should try to avoid being ignorant yourself, in the same breathe.

15 . Flithost at 2010-07-14T04:04:21.000Z

Flithost

What is best way to do? javascript or php ?