Creating a Datepicker
I had a project recently where I needed to create a custom datepicker for a HTML form. I will walk through the basics of how I was able to accomplish this.
The CSS
My specific form required the ability for the user to add multiple dates for a specific event up to a maximum of 20. So I knew I needed to hide the unneeded date fields from view. So I created the class hidden to allow for this. The datepicker needed an absolute positioning because I wanted to move it around the page as needed.
.hidden{ display:none; } #datepicker{ background: #ccc; position: absolute; z-index: 50; border: 1px solid #000; padding: 5px; } #closeButton{ float:right; }
The Datepicker
I used select lists to allow the user to select the date and start time. The key here was using php to pull in the current year so that I could dynamically create it. I also used php to create some for loops so that I didn't have to manually go through and type all of the options I wanted in my select lists.
<div id="datepicker" class="hidden"> <table border="0"> <tr> <td colspan="3"><strong>Date:</strong></td> </tr> <tr> <td> <select class="changeDate" id="month" name="month"> <option id="month1" value="1">January</option> <option id="month2" value="2">February</option> <!-- etc... --> </select> </td> <td> <select class="changeDate" id="day" name="day"> <?php for($i=1; $i<32; $i++){ echo '<option id="day'.$i.'" value="'.$i.'">'.$i.'</option>'; } ?> </select> </td> <td> <select class="changeDate" id="year" name="year"> <option selected="selected" value="<?php echo date(Y); ?>"><?php echo date(Y); ?></option> <option value="<?php echo date(Y) + 1; ?>"><?php echo date(Y) + 1; ?></option> <option value="<?php echo date(Y) + 2; ?>"><?php echo date(Y) + 2; ?></option> <option value="<?php echo date(Y) + 3; ?>"><?php echo date(Y) + 3; ?></option> <option value="<?php echo date(Y) + 4; ?>"><?php echo date(Y) + 4; ?></option> </select> </td> </tr> </table> <table border="0"> <tr> <td colspan="3"><strong>Start Time:</strong></td> </tr> <tr> <td> <select class="changeDate" id="hour" name="hour"> <?php for($i=1; $i<13; $i++){ echo '<option id="hour'.$i.'" value="'.$i.'">'.$i.'</option>'; } ?> </select> </td> <td> <select class="changeDate" id="minute" name="minute"> <option id="minute00" value="00">00</option> <option id="minute01" value="01">01</option> <option id="minute02" value="02">02</option> <!-- etc... up to ten --> <?php for($i=10; $i<60; $i++){ echo '<option id="minute'.$i.'" value="'.$i.'">'.$i.'</option>'; } ?> </select> </td> <td> <select class="changeDate" id="ampm" name="ampm"> <option id="am" value="am">am</option> <option id="pm" value="pm">pm</option> </select> </td> </tr> </table> <input id="closeButton" type="button" value="Close"/> </div>
The Javascript
I have condensed my code to just the basics. Please see comments for more specifics.
$(function(){ var globalFocus = 'required-date'; //I used this to see which date field was currently in focus $('#month<?php echo date(n);?>').attr('selected', 'selected'); $('#day<?php echo date(j);?>').attr('selected', 'selected'); $('#hour<?php echo date(g);?>').attr('selected', 'selected'); $('#minute<?php echo date(i);?>').attr('selected', 'selected'); $('#<?php echo date(a);?>').attr('selected', 'selected'); //I used the above code to set up the defaults for the datepicker updateDate(globalFocus);//This sets the focused date field value $('.date').focus(function() { //corresponds to all of the date fields globalFocus = $(this).attr('id'); $('#datepicker').show(); var position = $(this).position(); //Return position of date field to position the date picker right below it var height = $(this).height(); $('#datepicker').css('top', position.top+height); $('#datepicker').css('left', position.left); }); $('.changeDate').change(function(){ updateDate(globalFocus); }); $('#closeButton').click(function(){ $('#datepicker').hide(); }); }); function updateDate(currentFocus){ $('#'+currentFocus).val($('#month').val()+'/'+$('#day').val()+'/'+$('#year').val()+" "+$('#hour').val()+':'+$('#minute').val()+$('#ampm').val()+" - "+$('#hourend').val()+':'+$('#minuteend').val()+$('#ampmend').val()); }
No comments:
Post a Comment