O julgamento do mês envolve muitas condições de julgamento, se reduzir muito o desempenho. Recomenda -se usar a sintaxe do interruptor
O código é o seguinte:
A cópia do código é a seguinte:
GetDays: function (ano, mês) {
// var aday = [31,28 | 29,31,30,31,30,31,31,31,30,30,31];
// Processamento de dados do dia de fevereiro
var fedDays = ano%4 == 0? 29: 28,
returnDays = '';
var mês = mês <10? mês = '0'+mês: mês.toString ();
Switch (mês) {
Caso '01':
Caso '03':
Caso '05':
Caso '07':
Caso '08':
Caso '10':
case '12': retorno dia = 31; quebra;
Caso '04':
Caso '06':
Caso '09':
case '11': retorno dia = 30; quebra;
case '02': returnDays = FedDays; quebra;
}
retorno de retorno;
}
Código fonte completo:
A cópia do código é a seguinte:
/* Autor: Laoguoyong
--------------------------------
Link de três níveis de datas, seleção de faixas
--------------------------------
parâmetro
* [String] metas: '#ano,#mês,#dia'; Id do ano, mês, dia
* [String] intervalo: '2013-02-03,2019-09-21'; intervalo, formato correto é xxxx-xx-xx
--- Para salvar o código, passe no parâmetro de intervalo de data correto
---- Demonstração de erros:
(1) Faixa: '2013-02-03,2019-9-21' está errado, preste atenção ao formato da data
(2) Faixa: '2013-02-03' está errado, digite o valor completo do intervalo
(3) Faixa: '2013-02-03,2016-02-30' está errado, não há 30 dias em fevereiro
(3) Faixa: '2013-02-03,2011-02-30' está errado, o intervalo está incorreto
*
*/
função gysetdate (opt) {
// elem
var metas = opt.targets.split (',');
this.eyear = this.getId (alvos [0] .Slice (1));
this.emonth = this.getId (alvos [1] .Slice (1));
this.eday = this.getId (alvos [2] .Slice (1));
if (! this.eyear ||! this.emonth ||! this.eday) retorne;
// Valor da faixa
var r = opt.range.indexof (','),
astarts = opt.range.slice (0, r) .split ('-'), // converter para: ['2013', '05', '20']
aENDs = opt.range.slice (r+1, opt.range.length) .split ('-'); // converter para: ['2018', '08', '20']
// Tipo de número
this.startyear = parseint (astarts [0], 10);
this.startmonth = parseint (astarts [1], 10);
this.startday = parseint (Astarts [2], 10);
this.endyear = parseint (AENDS [0], 10);
this.endmonth = parseint (AENDS [1], 10);
this.endDay = parseint (AENDS [2], 10);
this.init ();
}
Gysetdate.prototype = {
init: function () {
var _That = this;
// Data de inicialização
this.setYears ({'start': this.startyear, 'end': this.endyear});
this.setmonths ({'start': this.startmonth});
this.setDays ({'ano': this.startyear, 'mês': this.startmonth, 'start': this.startday});
// Escolha do ano
this.eyear.onchange = function () {
var ano = parseint (this.value);
Switch (true) {
caso (ano == _athat.startyear): {
_athat.setmonths ({'start': _ that.startmonth});
_athat.setDays ({'ano': _ that.startyear, 'mês': _ that.startmonth, 'start': _ that.startday});
};quebrar;
case (ano == _athat.endyear): {
_athat.setmonths ({'start': 1, 'end': _ that.endmonth});
if (_that.endmonth> 1) {
_athat.setDays ({'ano': _ that.endyear, 'mês': 1, 'start': 1});
}outro{
_athat.setDays ({'ano': _ that.endyear, 'mês': 1, 'start': 1, 'end': _ that.endday});
}
};quebrar;
padrão:{
_athat.setmonths ({'start': 1});
_that.setDays ({'start': 1, 'ano': ano, 'mês': 1});
}
}
}
// Seleção mensal
this.emonth.onchange = function () {
var ano = parseint (_athat.eyear.options [_athat.eear.selectedIndex] .Value),
mês = parseint (this.value);
Switch (true) {
case (ano == _ that.endyear && me mês == _ that.endmonth): {
_athat.setDays ({'start': 1, 'ano': ano, 'mês': mês, 'fim': _ that.endday});
};quebrar;
case (ano == _ that.startyear && me mês == _ that.startmonth): {
_athat.setDays ({'ano': _ that.startyear, 'mês': _ that.startmonth, 'start': _ that.startday});
};quebrar;
padrão:{
_athat.setDays ({'start': 1, 'ano': ano, 'mês': mês});
}
}
}
},
/*Definido ano, mês, dia
------------------------------------
Todos os valores de parâmetros são do tipo de número
*/
// parâmetros {'start': xx, 'end': xxx}
SetYears: function (opt) {
this.eyear.innerhtml = '';
for (var n = opt.start; n <= opt.end; n ++) {
this.eyear.add (nova opção (n, n));
}
},
// parâmetros {'start': xx, 'end': xxx}
// O parâmetro 'end' é opcional, ignore -o e começa até dezembro
setmonths: function (opt) {
this.emonth.innerhtml = '';
var meses = opt.end || 12;
for (var n = opt.start; n <= meses; n ++) {
if (n <10) n = '0'+n;
this.emonth.add (nova opção (n, n));
}
},
// parâmetros {'start': xx, 'ano': xxx, 'mês': xx, 'estrela': xx, 'end': xxx}
// O parâmetro 'end' é opcional, ignore -o e começa até o final deste mês (julgado com base no mês)
SetDays: function (opt) {
this.eday.innerhtml = '';
var dias = opt.end || this.getDays (opt.year, opt.month);
for (var n = opt.start; n <= dias; n ++) {
if (n <10) n = '0'+n;
this.eday.add (nova opção (n, n));
}
},
/* De acordo com o ano e o mês, retorne o número correto de dias, como 2016-2, o retorno é de 29 dias (ano de execução)
------------------------------------------------------------------
Todos os valores de parâmetros são do tipo de número
*/
GetDays: function (ano, mês) {
// var aday = [31,28 | 29,31,30,31,30,31,31,31,30,30,31];
// Processamento de dados do dia de fevereiro
var fedDays = ano%4 == 0? 29: 28,
returnDays = '';
var mês = mês <10? mês = '0'+mês: mês.toString ();
Switch (mês) {
Caso '01':
Caso '03':
Caso '05':
Caso '07':
Caso '08':
Caso '10':
case '12': retorno dia = 31; quebra;
Caso '04':
Caso '06':
Caso '09':
case '11': retorno dia = 30; quebra;
case '02': returnDays = FedDays; quebra;
}
retorno de retorno;
},
/* Função auxiliar de ferramenta
------------------------------------
*/
getId: function (id) {
retornar document.getElementById (id);
}
}
Efeito Exibir imagem:
O efeito é muito bom. Amigos, por favor, embeleza você mesmo e use -o em seu próprio projeto.