【问题标题】:JQuery Datetime picker - Need to pick month and year onlyJQuery 日期时间选择器 - 只需要选择月份和年份
【发布时间】:2011-05-04 00:46:25
【问题描述】:

我浏览了这篇 jQuery UI DatePicker to show month year only 的帖子,这对我很有帮助,可以破解日期时间选择器 UI 以适应我的情况。

但由于我在同一个表单上有多个日期时间选择器,所以会发生这种情况。 css display:none 旨在“隐藏”不显示的日期。但是,如果我在同一个表单上有多个日期时间选择器,但我希望将其中一个设为月选择器,我该如何实现呢?使用 thw css,它会使所有日期时间日历 UI 上的所有天都消失,因为 css 将更改 .ui-datepicker-calendar 的属性。欢迎提出任何建议。

【问题讨论】:

    标签: jquery datetime datepicker


    【解决方案1】:

    目前,datepicker 每页仅创建 1 个所有“datepicker”输入共享的元素,因此链接问题的答案不起作用。 beforeShow 事件不允许使用 .addClass() 或 .css() 编辑 datepicker 元素(因为元素结构在显示时会从 datepicker 脚本中刷新。)

    为了解决这个问题,我发现输入元素的焦点事件似乎在显示日期选择器后运行代码。这是解决令人沮丧的问题的简单解决方法。

    这是我的代码:

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
    <head>
        <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.js"></script>
        <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js"></script>
        <link rel="stylesheet" type="text/css" media="screen" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css">
    <script type="text/javascript">
    $(function() {
        $('.month-picker').datepicker( {
            changeMonth: true,
            changeYear: true,
            showButtonPanel: true,
            dateFormat: 'MM yy',
            onClose: function(dateText, inst) { 
                var month = $("#ui-datepicker-div .ui-datepicker-month :selected").val();
                var year = $("#ui-datepicker-div .ui-datepicker-year :selected").val();
                $(this).datepicker('setDate', new Date(year, month, 1));
            },
            beforeShow : function(input, inst) {
                if ((datestr = $(this).val()).length > 0) {
                    year = datestr.substring(datestr.length-4, datestr.length);
                    month = jQuery.inArray(datestr.substring(0, datestr.length-5), $(this).datepicker('option', 'monthNames'));
                    $(this).datepicker('option', 'defaultDate', new Date(year, month, 1));
                    $(this).datepicker('setDate', new Date(year, month, 1));
                }
            }
        });
        $('.date-picker').datepicker();
        $('.month-picker').focus(function () {
            $('.ui-datepicker-calendar').addClass('hideDates');
        });
    });
    </script>
    <style>
    .hideDates {
        display: none;
    }
    </style>
    </head>
    <body>
        <label for="startDate">Date:</label>
        <input name="startDate" id="startDate" class="date-picker" />
        <label for="endMonth">End Month:</label>
        <input name="endMonth" id="endMonth" class="month-picker" />
    </body>
    </html>
    

    【讨论】:

    • 用空参数调用日期选择器的行是什么?它有什么作用?
    • @Nassign - 此页面上有两个日期选择器。带空参数的 datepicker 调用仅用于创建具有默认功能的第二个 datepicker。
    • 谢谢。我找到了一个将自定义按钮添加到按钮面板的网站。但是每次更改月份并且更改“现在”按钮时,该按钮都会消失。有什么建议吗?这是网站链接:csharptechies.blogspot.com/2010/12/…
    • @Nassign - 如果您创建一个新问题,您可能会得到更快更好的答案。
    • 效果很好,但是当日期选择器尝试出现在输入上方时,我遇到了 css 定位问题。我在这里提出了一个新问题:stackoverflow.com/questions/5816749/…
    【解决方案2】:

    我使用了 Ben 发布的代码版本略有不同。 而不是依赖我添加的焦点事件

    inst.dpDiv.addClass('monthonly');
    

    进入 beforeShow 方法和

    inst.dpDiv.removeClass('monthonly');
    

    进入onClose。这会在所有 datepicker 小部件使用的公共 div 上添加和删除一个类。然后可以使用

    在 css 中定位日期日历 div
    .monthonly#ui-datepicker-div .ui-datepicker-calendar
    {
        display: none;
    }
    

    【讨论】:

    【解决方案3】:

    以前的解决方案不适用于不同的格式。 setDate 也不会在 beforeShow 中执行任何操作。正确的做法是:

    beforeShow: function(input, inst) {
        var dateString = $(this).val();
        var options = new Object();
        if (dateString.length > 0) {
            options.defaultDate = $.datepicker.parseDate("dd-" + $(this).datepicker("option", "dateFormat"), "01-" + dateString);
        }
        inst.dpDiv.addClass("ui-monthpicker");
        return options;
    },
    onClose: function(dateText, inst) {
        var month = inst.dpDiv.find(".ui-datepicker-month").val();
        var year = inst.dpDiv.find(".ui-datepicker-year").val();
        $(this).datepicker("setDate", new Date(year, month, 1));
        inst.dpDiv.removeClass("ui-monthpicker");
    }
    

    我使用 datepicker 中的 parseDate 来处理不同的日期格式,并从字段中返回日期作为 defaultDate 选项。

    必需的 CSS:

    #ui-datepicker-div.ui-monthpicker {
        padding: 0.2em;
    }
    #ui-datepicker-div.ui-monthpicker .ui-datepicker-calendar {
        display: none;
    }
    

    【讨论】:

    • 我在删除 ui-monthpicker 类时添加了超时,否则日历会在日期选择器隐藏之前“闪烁”。 setTimeout(function () { inst.dpDiv.removeClass("ui-monthpicker"); }, 200);
    【解决方案4】:

    我还有另一个基于上述改进的解决方案。在我的 HTML 中,我通过添加这个来隐藏日期选择器,因为页面上只有一个:

    <style>
        .ui-datepicker-calendar {
            display: none;
        }
    </style>
    

    然后我像其他人一样初始化我的日期选择器,并向 onChangeMonthYear 事件添加一些代码:

    $n(this).datepicker({
        defaultDate: 0,
        changeMonth: true,
        changeYear: true,
        onChangeMonthYear: function(year, month, inst) {
            $(this).datepicker('setDate', new Date(year, month - 1, 1));
        }
    });
    

    注意:

    月 - 1

    如果你不添加这个,你会得到一个堆栈溢出,因为这个函数接收一个基于 1 的索引月份,但 setDate 使用一个正常的基于 0 的月份。

    【讨论】:

      【解决方案5】:

      我做了类似的事情,但是做了一个单独的 datepicker 脚本的“版本”,并称之为monthpicker,它有自己的 CSS 选择器和 CSS 文件。这意味着您可以在同一页面上使用其中一个或两个。

      【讨论】:

      • 您好感谢您的友好回复,可以进一步解释它,好吧我从 jquery.ui.datetimepicker.js 复制另一个 .js 文件调用monthpicker.js,那么下一步应该解释什么你“拥有自己的 CSS 选择器和 CSS 文件”?
      • @Darren - 您需要挑选代码并查看脚本如何将选择器/ID 分配给它创建的项目,并将它们更改为使用“monthpicker”而不是“datepicker”。然后,您需要复制 CSS 文件并在那里进行匹配的更改。
      • 好吧,只是想知道我是否可以使用css继承来选择属于我在中唯一的日期选择器的类.ui-datepicker-calendar ?
      【解决方案6】:

      Ben 的解决方案效果很好,只是做了一个小改动,我使用了 onChangeMonthYear 而不是 onClose:

      onChangeMonthYear: function(year, month, inst) {
        var date = new Date(year, month - 1, 1);
        $(this).val($.datepicker.formatDate(format, date));
        $(this).datepicker('setDate', date);
      }
      

      【讨论】:

        【解决方案7】:

        这个code 对我来说完美无缺:

        $(document).ready(function()
        {   
            $(".monthPicker").datepicker({
                dateFormat: 'MM yy,
                changeMonth: true,
                changeYear: true,
                showButtonPanel: true,
        
                onClose: function(dateText, inst) {
                    var month = $("#ui-datepicker-div .ui-datepicker-month :selected").val();
                    var year = $("#ui-datepicker-div .ui-datepicker-year :selected").val();
                    $(this).val($.datepicker.formatDate('MM yy', new Date(year, month, 1)));
                }
            });
        
            $(".monthPicker").focus(function () {
                $(".ui-datepicker-calendar").hide();
                $("#ui-datepicker-div").position({
                    my: "center top",
                    at: "center bottom",
                    of: $(this)
                });
            });
        });
        
        <label for="month">Month: </label>
        <input type="text" id="month" name="month" class="monthPicker" />
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-01-08
          • 2020-09-06
          • 1970-01-01
          • 2021-12-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多