JQuery 日期时间选择器 - 只需要选择月份和年份

Posted

技术标签:

【中文标题】JQuery 日期时间选择器 - 只需要选择月份和年份【英文标题】:JQuery Datetime picker - Need to pick month and year only 【发布时间】: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 的属性。欢迎提出任何建议。

【问题讨论】:

【参考方案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 定位问题。我在这里提出了一个新问题:***.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;

【讨论】:

希望我读过这篇文章。这种方法可以防止日历出现在输入上方时的定位错误。 (见:***.com/questions/5816749/…)【参考方案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" />

【讨论】:

以上是关于JQuery 日期时间选择器 - 只需要选择月份和年份的主要内容,如果未能解决你的问题,请参考以下文章

如何将 jQuery 日期选择器转换为仅选择月份和年份?

android有月份选择器吗?或者怎么让日期选择器的日期不显示,只显示年份和月份

没有日期选择的角度日期选择器(只有月份和年份)

uniapp时间日期选择器 - 只选择月份 - 月份选择器picker

具有多个月份的引导日期选择器

如何仅在月份、日期和年份中更改我的日期选择器显示