gpt4 book ai didi

javascript - 使用 html 选择和日期的依赖日期选择器有意义

转载 作者:太空狗 更新时间:2023-10-29 13:27:58 26 4
gpt4 key购买 nike

我正在尝试构建自定义开始和结束日期选择器,但不幸的是,由于设计原因,我将无法使用 jquery UI Datepicker,因此我坚持使用将日期拆分为 3 <select> 的老式方法

为了保持这个功能可用,我们发现这个 - 至少 - 复杂的部分:

  • 让每个月的日子都有意义(不要选择 2 月 31 日,..)
  • 设置从 START 到 END 选择器的下一个

所以我认为最好将日期计算委托(delegate)给 javascript Date() 对象,这样至少我可以抽象出那部分。

我快到了

但是一些 Date() 对象如何告诉正确的日期,但是两个选择器都显示前一个日期的每一组天数(例如,前 28 天发生在三月而不是二月)

    $(function(){

months = ['jan','feb','mar','apr','may','jun','jul','ago','sep','oct','nov','dec'];
/* Cachear selects */
var $ld = $('select[name=llegada-dia]');
var $lm = $('select[name=llegada-mes]');
var $ly = $('select[name=llegada-ano]');
var $sd = $('select[name=salida-dia]');
var $sm = $('select[name=salida-mes]');
var $sy = $('select[name=salida-ano]');
var manyDays = function( month, year ){
var fecha = new Date(year, (month) , 0);
return fecha.getDate();
}
var paintCals = function( day, month , year ){
if(day == '') day = 1;
if(month == '') month = 0;
if(year == '' ) year = 2013;
//month = month -1;
var fecha = new Date( year, month , day );
var dia = fecha.getDate();
var mes = fecha.getMonth();
var anyo = fecha.getFullYear();
var dias_mes = manyDays( mes,anyo );
/* Generate next date = fecha + 1 */
var next_fecha = fecha;

next_fecha.setDate(next_fecha.getDate() + 1);
next_fecha.setMonth(fecha.getMonth() + (dia == dias_mes ? 1 : 0) );
next_fecha.setFullYear(fecha.getFullYear() + (mes == 12 ? 1 : 0) );

var next_dia = next_fecha.getDate();
var next_mes = next_fecha.getMonth();
var next_anyo = next_fecha.getFullYear();
var next_dias_mes = manyDays( next_mes, next_anyo ) ;
$ld.empty();
for(var tmpdia = 1; tmpdia <= dias_mes; tmpdia++){
var doption = $('<option>').attr( 'value',tmpdia )
.text( tmpdia );
if(dia == tmpdia && dia != ''){
doption.attr('selected', 'selected');
}
$ld.append(doption);
}
/* Actualizar dias salida */
$sd.empty();
for(var tmpdia = next_dia; tmpdia <= next_dias_mes; tmpdia++){
var doption = $('<option>').attr( 'value' , tmpdia )
.text(tmpdia);
if(next_dia == tmpdia && next_dia != ''){
doption.attr('selected', 'selected');
}
$sd.append(doption);
}
/* Actualizar meses salida */
$sm.empty();
for(var tmpmes = next_mes ; tmpmes < 12; tmpmes++){
var doption = $('<option>').attr('value',tmpmes)
.text(months[tmpmes]);
if(dia == tmpdia && dia != ''){
doption.attr('selected', 'selected');
}
$sm.append(doption);
}
/* Actualizar anyos salida */
$sy.empty();
for(var tmpanyo = next_anyo; tmpanyo <= 2020; tmpanyo++){
var doption = $('<option>').attr('value',tmpanyo)
.text(tmpanyo);
if(next_anyo == tmpanyo && next_anyo != ''){
doption.attr('selected', 'selected');
}
$sy.append(doption);
}
}
$('.arrival select').on('change',function(){
var ldia = $ld.val();
var lmes = $lm.val();
var lano = $ly.val();
var ldias = paintCals(ldia,lmes,lano);
});
})

这里可以修改:

http://jsfiddle.net/96qyH/8/

知道我在这里遗漏了什么吗?

最佳答案

首先: manyDays fn 需要:

var days_in_month = new Date(year, month+1, 0);

否则它会回到上个月。您可以在此处最受欢迎的答案的评论中阅读更多相关信息:Get number days in a specified month using javascript?

第二:我删除了

next_fecha.setMonth(fecha.getMonth() + (dia == dias_mes ? 1 : 0)   );

既然你已经有了

next_fecha.setDate(next_fecha.getDate()+1);

月末自动切换月份。

第三:这部分有dia而不是month:

/* Actualizar meses salida */
$sm.empty();
for(var tmpmes = next_mes ; tmpmes < 12; tmpmes++){
var doption = $('<option>').attr('value',tmpmes).text(months[tmpmes]);
if(next_mes == tmpmes && next_mes != ''){
console.log('fired');
doption.attr('selected', 'selected');
}
$sm.append(doption);
}

---- 已添加 ----

第四:还需要检查 Feb 31 是否存在。如果不是,day 应该是那个月的最后一天。否则 Date 对象不知道如何处理日期并且给出了错误的日期。

只需要添加一个支票:

var check_fecha = new Date( year, month );          
check_mes = check_fecha.getMonth();
check_anyo = check_fecha.getFullYear();
var check_dias_mes = manyDays( check_mes, check_anyo );

if(day > check_dias_mes)
day = check_dias_mes;

希望它能解决问题,请在此处查看:http://jsfiddle.net/96qyH/13/

关于javascript - 使用 html 选择和日期的依赖日期选择器有意义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19434284/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com