实际项目中,在用户的个人中心,编辑用户资料时经常会遇到选择生日选项的问题。

因为我项目工程中没有使用如jQuery UI的插件性下拉列表,所以选择select + option的原生方式,实现选择器。

能够准确计算闰年的年月日,方便表单处理。

实际效果如下图,式样略粗糙

HTML

生日中的年月日以<select>下拉方式,我们给每个select加个rel的属性,当已知用户生日时,直接通过rel属性标注,插件会将rel属性的数值转换成select的值。

jQuery

$.date_picker({

YearSelector:  "#date-sel-year",

MonthSelector: "#date-sel-month",

DaySelector:   "#date-sel-day"

});

$.ms_DatePicker();

******

实际使用,最终提交时,需要获得用户输入的生日,直接 $('#date-sel-year').val() 可以获得select的内容,

有时页面逻辑是,显示生日,用户点击 [编辑] 按钮后,初始化select的内容,此时用 $('#date-sel-year').val(year) 可以完成赋值的操作。

这时候,需要注意的是,很多生日显示时,会显示为,2015-09-01,但是直接赋值 09 给date-sel-month,是不能正确显示的。

需要判断如果变量第一个字符是0,要将第二位的字符赋值给select。

******

以下是插件的具体代码:

(function($){  
        $.extend({  
            date_picker: function(options){  
                var defaults = {  
                    YearSelector: "#sel_year",  
                    MonthSelector: "#sel_month",  
                    DaySelector: "#sel_day",  
                    FirstText: "--",  
                    FirstValue: 0  
                };  
                var opts = $.extend({}, defaults, options);  
                var $YearSelector = $(opts.YearSelector);  
                var $MonthSelector = $(opts.MonthSelector);  
                var $DaySelector = $(opts.DaySelector);  
                var FirstText = opts.FirstText;  
                var FirstValue = opts.FirstValue;  
          
                // 初始化  
                var str = "<option value=\"" + FirstValue + "\">" + FirstText + "</option>";  
                $YearSelector.html(str);  
                $MonthSelector.html(str);  
                $DaySelector.html(str);  
          
                // 年份列表  
                var yearNow = new Date().getFullYear();  
                var yearSel = $YearSelector.attr("rel");  
                for (var i = yearNow; i >= 1900; i--) {  
                    var sed = yearSel==i?"selected":"";  
                    var yearStr = "<option value=\"" + i + "\" " + sed+">" + i + "</option>";  
                    $YearSelector.append(yearStr);  
                }  
          
                // 月份列表  
                var monthSel = $MonthSelector.attr("rel");  
                for (var i = 1; i <= 12; i++) {  
                    var sed = monthSel==i?"selected":"";  
                    var monthStr = "<option value=\"" + i + "\" "+sed+">" + i + "</option>";  
                    $MonthSelector.append(monthStr);  
                }  
          
                // 日列表(仅当选择了年月)  
                function BuildDay() {  
                    if ($YearSelector.val() == 0 || $MonthSelector.val() == 0) {  
                        // 未选择年份或者月份  
                        $DaySelector.html(str);  
                    } else {  
                        $DaySelector.html(str);  
                        var year = parseInt($YearSelector.val());  
                        var month = parseInt($MonthSelector.val());  
                        var dayCount = 0;  
                        switch (month) {  
                            case 1:  
                            case 3:  
                            case 5:  
                            case 7:  
                            case 8:  
                            case 10:  
                            case 12:  
                                dayCount = 31;  
                                break;  
                            case 4:  
                            case 6:  
                            case 9:  
                            case 11:  
                                dayCount = 30;  
                                break;  
                            case 2:  
                                dayCount = 28;  
                                if ((year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0)) {  
                                    dayCount = 29;  
                                }  
                                break;  
                            default:  
                                break;  
                        }  
                          
                        var daySel = $DaySelector.attr("rel");  
                        for (var i = 1; i <= dayCount; i++) {  
                            var sed = daySel==i?"selected":"";  
                            var dayStr = "<option value=\"" + i + "\" "+sed+">" + i + "</option>";  
                            $DaySelector.append(dayStr);  
                        }  
                    }  
                }  
                $MonthSelector.change(function () {  
                    BuildDay();  
                });  
                $YearSelector.change(function () {  
                    BuildDay();  
                });  
                if($DaySelector.attr("rel")!=""){  
                    BuildDay();  
                }  
            }  
        });  
    })(jQuery);

jQuery select年月日(生日)选择器的更多相关文章

  1. jQuery入门(1)jQuery中万能的选择器

    jQuery入门(1)jQuery中万能的选择器 jQuery入门(2)使用jQuery操作元素的属性与样式 jQuery入门(3)事件与事件对象 jQuery入门(4)jQuery中的Ajax()应 ...

  2. 从零开始学习jQuery (二) 万能的选择器

    本系列文章导航 从零开始学习jQuery (二) 万能的选择器 一.摘要 本章讲解jQuery最重要的选择器部分的知识. 有了jQuery的选择器我们几乎可以获取页面上任意的一个或一组对象, 可以明显 ...

  3. 前端基础-jQuery的内容之选择器

    阅读目录 ID选择器 类选择器 元素选择器 通配符选择器 层级选择器 基本筛选器 内容筛选器 可见性筛选器 属性筛选器 子元素筛选器 表单元素筛选器 表单对象筛选器 this和$(this) 一.jQ ...

  4. 第一百六十八节,jQuery,表单选择器

    jQuery,表单选择器 学习要点: 1.常规选择器 2.表单选择器 3.表单过滤器 表单作为 HTML 中一种特殊的元素,操作方法较为多样性和特殊性,开发者不但可以 使用之前的常规选择器或过滤器,也 ...

  5. jQuery中的:input选择器

    jQuery中的:input选择器 jQuery中的:input选择器包含input, textarea, select 和 button这些标签. <!DOCTYPE html> < ...

  6. Jquery | 基础 | 使用 jQuery 表单过滤选择器

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. jquery select取值,赋值操作

    select">jquery select取值,赋值操作 一.获取Select 获取select 选中的 text : $("#ddlRegType").find( ...

  8. jquery笔记之属性选择器 查找以某种条件开头的页面元素

    jquery笔记之属性选择器 查找以某种条件开头的页面元素 转载:http://www.blogbus.com/amyqiong-logs/78340326.html $("div[id]& ...

  9. jquery select选中表单特效三级联动

    好久没发帖了,今天发一个jquery select的表单三级联动,希望能对有需要的朋友有点帮助. js代码,当然还要加上jquery的包,应该都有的,这里就不发了. <script type=& ...

随机推荐

  1. NOI 2015 滞后赛解题报告

    报同步赛的时候出了些意外.于是仅仅能做一做"滞后赛"了2333 DAY1 T1离线+离散化搞,对于相等的部分直接并查集,不等部分查看是否在同一并查集中就可以,code: #incl ...

  2. linux入门基础——linux软件管理RPM

    由于linux入门基础是基于CentOS解说的,讲的是CentOS上的软件包管理.ubuntu的软件包管理有这些:ubuntu软件包管理,包管理指南,ubuntu软件包管理. linux软件管理:RP ...

  3. udhcp源码详解(三) 下 之配置信息的读取

    上节讲解了read_config函数,读取配置信息到server_config的相应成员变量里,但read_config函数只负责把配置信息重文件里读出来,具体怎么把信息填写到指定的地址内,是调用ke ...

  4. 訪问的网页自己主动打开QQ对话

    今天訪问中国论文网,自己主动就弹出与QQ的对话框,非常是好奇.于是查看网页源码发现例如以下可疑处: <script type="text/javascript"> fu ...

  5. 2016/4/1 jquery 与javascript关系 ①取元素 ②操作内容 ③操作属性 ④操作 样式 ⑤ 事件 点击变色

    jQuery的min版本和原版功能是一样的,min版主要应用于已经开发成的网页中,而非min版 的文件比较大,里面有整洁的代码书写规范和注释,主要应用于脚本开发过程当中. JQuery是继protot ...

  6. 2016/3/27 分页 共X条数据 本页x条 本页从x-y条 x/y页 首页 上一页 123456 下一页 末页 pagego echo $page->fpage(7,6,5,4,3,2,1,0);

    显示效果: fpage.class.php <?php /** file: page.class.php 完美分页类 Page */ class Page { private $total; / ...

  7. POI异步导入Excel兼容xsl和xlsx

    项目架构:spring+struts2+hibernate4+oracle 需求:用户导入excel文件,导入到相应的数据表中,要求提供导入模板,支持xls和xlsx文件 思路分析: 1.提供一个下载 ...

  8. 设计模式-(9)中介者模式(swift)

    在对象去耦合的模式中,有两种模式:中介者模式,观察者模式 一,概念 用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 这个 ...

  9. XMU 1605 nc与数列 【动态规划】

    1605: nc与数列 Time Limit: 2000 MS  Memory Limit: 64 MBSubmit: 84  Solved: 13[Submit][Status][Web Board ...

  10. HDU2121 Ice_cream’s world II —— 最小树形图 + 不定根 + 超级点

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2121 Ice_cream’s world II Time Limit: 3000/1000 MS (J ...