Degradable SELECT onChange

By  on  

Whenever I go to Google Analytics I notice a slight flicker in the dropdown list area. I see a button appear for the shortest amount of time and the poof! Gone. What that tells me is that Google is making their site function whether the user has JavaScript or not. The following is a quick explanation of how it works.

The XHTML

<iframe id="site-frame" src="http://<?php echo $_POST['site'] ? $_POST['site'] : 'scriptandstyle.com'; ?>" style="border:1px solid #ccc;float:right;width:700px;height:500px;"></iframe>

<form action="" method="post">
	<select name="site" id="site">
		<option value="">Select a Site</option>
		<option value="github.com/darkwing">GitHub</option>
		<option value="mootools.net">MooTools</option>
		<option value="scriptandstyle.com">Script & Style</option>
		<option value="twitter.com/davidwalshblog">Twitter</option>
	</select>
	<input type="submit" value="Go" class="button" id="submit-button" />
</form>

My example is a dropdown list that manipulates an iFrame. Note that we use a form tag and submit button so that the site functions well without JavaScript.

The JavaScript

//when the window has loaded...
window.onload = function() {
	//hide the button 
	document.getElementById('submit-button').style.display = 'none';
	//our event function
	var handler = function() {
		if(select.value) {
			document.getElementById('site-frame').src = 'http://' + select.value;
		}
	};
	//add the event listener
	var select = document.getElementById('site');
	if(select.addEventListener){
		select.addEventListener('change',handler,false);
	}
	else {
		select.attachEvent('onchange',handler,false);
	}
};

When the window loads, we hide the submit button and add the event listener. If the user doesn't have JavaScript, all of our JavaScript gets ignored. Simple.

This system is very easy to implement and well worth the effort to make your website more accessible.

Recent Features

  • By
    How to Create a RetroPie on Raspberry Pi &#8211; Graphical Guide

    Today we get to play amazing games on our super powered game consoles, PCs, VR headsets, and even mobile devices.  While I enjoy playing new games these days, I do long for the retro gaming systems I had when I was a kid: the original Nintendo...

  • By
    Create a CSS Cube

    CSS cubes really showcase what CSS has become over the years, evolving from simple color and dimension directives to a language capable of creating deep, creative visuals.  Add animation and you've got something really neat.  Unfortunately each CSS cube tutorial I've read is a bit...

Incredible Demos

  • By
    Using jQuery and MooTools Together

    There's yet another reason to master more than one JavaScript library: you can use some of them together! Since MooTools is prototype-based and jQuery is not, jQuery and MooTools may be used together on the same page. The XHTML and JavaScript jQuery is namespaced so the...

  • By
    Full Width Textareas

    Working with textarea widths can be painful if you want the textarea to span 100% width.  Why painful?  Because if the textarea's containing element has padding, your "width:100%" textarea will likely stretch outside of the parent container -- a frustrating prospect to say the least.  Luckily...

Discussion

  1. Even though it is possible to do it this way, I would much rather just wrap the submit button in a noscript tag. Maybe it’s just me, but I think it’s a bit tacky when I see stuff show briefly while loading and then disappear. Are there any issues with using a noscript tag?

  2. Using the “onLoad” event is a bad idea; there’ll be a significant amount of time between the button being visible and it being removed; this flicker isn’t exactly good for the user experience. It’s better to remove it the button as soon as the element exists – you could do this by using one of the psuedo-domReady events present in many of today’s libraries.

  3. @James: My goal was to avoid using a JS lib. I suppose it would be possible to implement a lib-independent DOMREADY function.

  4. Hmmm, given more though, I could simply put the

  5. Might I ask why you are doing this:

    if(select.addEventListener){
    

    Don’t all browsers support it or what?

  6. @Adriaan, only browsers that comply with the W3C event model support addEventListener – IE uses attachEvent. btw, @David, IE doesn’t support event capturing in the same way as other browsers so the third argument ("false") can be removed from select.attachEvent('onchange',handler,false);

  7. why don’t you just move the script bellow the form, this way you are sure you can access the element and don’t have to wait for onLoad

  8. Stephen

    Am I missing something or why do you use getElementById() instead of $()?

  9. @Stephen: because this is framework independent javascript

  10. David, I just want to say that your blog rocks.

Wrap your code in <pre class="{language}"></pre> tags, link to a GitHub gist, JSFiddle fiddle, or CodePen pen to embed!