【问题标题】:Why December month only not loading when choosing option 12 in month drop down?为什么在月份下拉菜单中选择选项 12 时仅不加载 12 月份?
【发布时间】:2019-08-15 13:14:32
【问题描述】:

我正在处理完整的日历。 在从互联网上获得参考后,我手动添加了月份下拉列表。 到目前为止它工作正常。 问题是,到 9 月为止,它运行良好。 但是当我选择十月时,它只显示九月,然后对于十一月,它显示十月,而对于十二月,它只显示十一月。十二月在此下拉列表和日历中不起作用。

我的代码如下:

$(".fc-right").append('<select class="select_month"><option value="">Select Month</option><option value="1">Jan</option><option value="2">Feb</option><option value="3">Mrch</option><option value="4">Aprl</option><option value="5">May</option><option value="6">June</option><option value="7">July</option><option value="8">Aug</option><option value="9">Sep</option><option value="10">Oct</option><option value="11">Nov</option><option value="12">Dec</option></select>');

$(".select_month").on("change", function (event) {
    $('#calendar_full').fullCalendar('changeView', 'month', this.value);
    $('#calendar_full').fullCalendar('gotoDate', y + '-' + this.value + '-1');
}); // y assigned as selected year.

如果我将 10 月 11 日、11 月 12 日和 12 月 13 日的选项值更改为 10 月和 11 月恢复正常,12 月仍然无法正常工作。

如何解决。请帮忙。

【问题讨论】:

  • 您是否有理由使用自己的下拉菜单来选择月份,而不是使用 FullCalendar 提供的控件?
  • 如果没有工作示例,我假设您可能没有向插件传递 changeViewgotoDate 方法的正确/兼容日期/值。
  • 如果我没记错的话,changeView takes the view as the first parameter ('month'), and a Date or equivalent string as the second。您正在传递一个数字(作为字符串)。尝试传入 '2019-' + ('00' + this.value).slice(-2) + '-01' 之类的内容。
  • @Barmar 也许吧?在这种情况下,OP 可以尝试为gotoDate 调用传递相同的值。我认为重点是使用格式正确的日期。
  • changeViewgotoDate 可能都不需要。

标签: javascript date fullcalendar momentjs fullcalendar-3


【解决方案1】:

您没有创建有效的日期字符串来传递给 fullCalendar 函数。

1) this.value 将是一个数字。 changeView 希望您提供完整的日期(请参阅 documentation)。

2) y + '-' + this.value + '-1' 将生成像 2019-1-12019-10-1 这样的日期,它们不是有效的 RFC2822 或 ISO 日期格式,因为月份和日期部分中的单个数字值。

当您尝试将这些值用作日期时,您会在控制台(由 momentJS 生成)中看到警告,因为它无法保证它们是否会被正确解释。显然,在您的情况下,存在一些不正确的解释,导致您的问题。 momentJS documentation 为您提供了支持的日期格式的清晰列表。另见相关fullCalendar v3 dates documentation

另外,在这里同时使用changeView goToDate 是多余的。如果要确保选择“月”视图,请使用changeView,并传递一个日期。如果您只想更改日期而不关心视图类型,请使用goToDate。对于这个例子,我假设你想要changeView

修复很简单:

1) 确保所有下拉选项都有 2 位数的值

2) 将硬编码的日期字符串也设置为两位数 01

3) 将完整的日期字符串传递给 fullCalendar 函数。

$(".fc-right").append('<select class="select_month"><option value="">Select Month</option><option value="01">Jan</option><option value="02">Feb</option><option value="03">Mrch</option><option value="04">Aprl</option><option value="05">May</option><option value="06">June</option><option value="07">July</option><option value="08">Aug</option><option value="09">Sep</option><option value="10">Oct</option><option value="11">Nov</option><option value="12">Dec</option></select>');

$(".select_month").on("change", function(event) {
  var dateStr = y + '-' + this.value + '-01';
  console.log(dateStr);
  $('#calendar_full').fullCalendar('changeView', 'month', dateStr);
});

工作演示:http://jsfiddle.net/f362m5du/2/

【讨论】:

  • 为什么它适用于2019-3-1,但它与2019-10-1 相差1?他们都有一个个位数的日部分。它对第一个起作用是偶然的吗?
  • @Barmar 我想是的。如果 JS Date 构造函数无法识别格式,那么它会尽最大努力提供给它的任何东西。结果无法保证。行为甚至可能在不同的浏览器引擎之间有所不同。它这样做而不是仅仅抛出一个错误,恕我直言有点愚蠢。
  • 我以为它使用了 moment.js 解析器,而不是原生的 JS 解析器。
  • fullCalendar 确实使用了 momentJS,但是如果您使用错误的日期字符串,您在浏览器中看到的来自 momentJS 的完整警告显示:"弃用警告:提供的值不在公认的 RFC2822 或 ISO 中格式。moment 构造回退到 js Date(),这在所有浏览器和版本中并不可靠。不鼓励使用非 RFC2822/ISO 日期格式,并将在即将发布的主要版本中删除。有关更多信息,请参阅 momentjs.com/guides/#/warnings/js-date。 " 所以基本上,momentJS 无法读取它并警告你。 JS Date 也不能总是读取它,但不会警告你。
  • 这是有道理的。还有很多其他关于原生 Date 解析器的奇怪结果的问题。
猜你喜欢
  • 2014-01-24
  • 2017-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多