I would code it like this: $.fn.showIf = function( show, arg ) { return this[ show ? 'show' : 'hide' ]( arg ); }; $(function() { var $epc = $('#edit-profile-country'); function setVisibility() { var value = $epc.val(); $('#state').showIf( value == 'US' ); $('#province').showIf( value == 'CA' ); } setVisibility(); $epc.change( setVisibility ); });
The one-line .showIf() plugin makes it easy to either show or hide an element depending on a condition. The $epc variable is there merely to avoid repeating that selector in the code. Since the state and province selectors are only used once each, I didn't create variables for them. About the second question, checking for the existence of the state/province dropdowns: With this code (or your original code), there is no need to check whether these exist. If they don't exist on the page, the show/hide/showIf functions will silently do nothing. (Those functions, like most jQuery methods, operate on each of the selected DOM elements - and it's perfectly OK to select zero elements.) If you do want to check whether one of those elements exists, you can do it like this: if( $('#state').length ) { /* exists */ } else { /* missing */ } -Mike > From: John H > > I'm not new to web development or javascript, but am > relatively new to jQuery. I'm wondering if someone would be > willing to quickly review the following code for efficiency > and best practices. The function works as required, but I'd > like to take this as a learning opportunity. > > In a nutshell the code initially hides two divs onload and > then the function shows/hides the state/province divs > depending on the value of the country dropdown. I want to > keep the code readable, but I know it could be tighten up. > > The state/province divs have a style attribute to initially hide them. > Exp. style="display: none;" > > Questions: > > 1) Can the duplicate show/hide methods be reduced? > 2) What about checking for the existence of the > state/province dropdowns? (I know they're always going to be > there because of the context of the page, but want to know > what the best practice is.) > > $(document).ready(function() { > // set default div visibility > if ($('#edit-profile-country').val() == 'US') { > $('#state').show(); > } > if ($('#edit-profile-country').val() == 'CA') { > $('#province').show(); > } > $('#edit-profile-country').change(function() { > $('#state').hide(); > $('#province').hide(); > if ($(this).val() == 'US') { > $('#state').show(); > } > if ($(this).val() == 'CA') { > $('#province').show(); > } > }) > }); >