webForumDet fria alternativet

SELECT JavaScript och PHP

10 svar · 557 visningar · startad av westman

westmanMedlem sedan aug. 2004279 inlägg
#1

Jag har en sida med 3st SELECT-boxar: År, Månad, Dag. Antalet dagar en viss månad beräknar jag med php:s date() - inga problem. Problemet ligger i att få antalet valbara dagar att ändras då man byter år och/eller månad (ex. februari vid skottår). Jag har lyckats koda en lösning på detta (med onChange och $_GET...), men sidan behöver då laddas om och all övrig data (i andra fält) går förlorad...

Kan någon hjälpa mig med någon lösning som inte kräver "omladdning".
Är ingen hejare på JS...:OO

westmanMedlem sedan aug. 2004279 inlägg
#2

Hjälp

Detta funkar ju (tar dock inte hänsyn till skottår..)

<SCRIPT type="text/JavaScript">

// Antal dagar i månaden

var days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];

function fillDays(daysObj, month) {
	// Ta bort dagar
	while(daysObj.options[0])
		daysObj.options[0] = null;

	// Lägg till de nya dagarna
	if(month) {
		daysObj.length = days[month-1];
		var i = 0;
		while(i < days[month-1])
			daysObj.options[i] =  new Option(++i);
	} else {
		daysObj.length = 1;
		daysObj.options[0] = new Option("--");
	}
}
</script>

Anrop i månad-SELECT:

onChange="fillDays(this.form.dag, this.selectedIndex)"

Dag-SELECT:

<select name="dag">
	<option>--</option>
</select>

Men nu vill jag att ett visst datum skall vara markerat, "selected" (ibland dagens och ibland ett annnat). Detta datum ligger i $markedDate

nitro2k01Medlem sedan aug. 20037 630 inlägg
#3

Lösning på skottårsfrågan:

 var days = [31, (year%4)?28:29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
westmanMedlem sedan aug. 2004279 inlägg
#4

tackar! kanske du kan hjälpa mig med selected date oxå? :)

@ndersMedlem sedan juni 200026 914 inlägg
#5

OT: nitros skottårslösning är inte helt komplett. Årtal som är jämnt delbart med 100 är inte skottår, om det inte samtidigt är jämnt delbart med 400.

Mvh

nitro2k01Medlem sedan aug. 20037 630 inlägg
#6

Jo jag vet, jag vet, och det är enkelt fixat, men nu var jag bara ute efter att göra enkel och funktionell som kod som fungerar i 395 år framåt.

var days = [31, (year%4)?28:((year%100)?29:((year%400)?28:29)), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];

Edit...

westmanMedlem sedan aug. 2004279 inlägg
#7

Just, jag tänkte att applikationen kanske inte ser likadan ut om 400år.

$markedDate-grejen då? Ingen som har en finurlig lösning

westmanMedlem sedan aug. 2004279 inlägg
#8

Vore supernice ifall ngn kan hjälpa mig med detta problem..!

JojoxxMedlem sedan juni 20004 306 inlägg
#9

Jag var tvungen att skriva ett litet script för det. Det är skrivet för att kunna spara ner objektet dateSelect i en extern .js-fil om du vill. Datumet som skall markeras anger du som ett date-objekt i dateSelect.date.

Lite overkill, men kan vara bra att ha någon gång kanske. Anm. använder du date-objektet i JS så behöver du inte hålla reda på vad som är skottår eller inte.

<script type="text/javascript">
var dateSelect={
	yearFieldName:"year",
	monthFieldName:"month",
	dateFieldName:"date",
	date:new Date(),
	updateDate:function(obj){
		obj[this.dateFieldName].length=0;
		for(var i=1;i<=new Date(obj[this.yearFieldName][obj[this.yearFieldName].selectedIndex].value,obj[this.monthFieldName].selectedIndex+1,0).getDate();i++){
			obj[this.dateFieldName][i-1]=new Option(((i<10)?"0":"")+i,((i<10)?"0":"")+i);
		}
	},
	insertYearList:function(){
		document.write("<select name=\""+this.yearFieldName+"\" onchange=\"dateSelect.updateDate(this.form);\">");
		for(var i=this.date.getFullYear()-10;i<this.date.getFullYear()+10;i++){
			document.write("<option value=\""+i+"\" "+((this.date.getFullYear()==i)?"selected=\"selected\"":"")+">"+i+"</option>");
		}
		document.write("</select>");
	},
	insertMonthList:function(){
		document.write("<select name=\""+this.monthFieldName+"\" onchange=\"dateSelect.updateDate(this.form);\">");
		for(var i=1;i<=12;i++){
			document.write("<option value=\""+((i<10)?"0":"")+i+"\" "+((this.date.getMonth()+1==i)?"selected=\"selected\"":"")+">"+((i<10)?"0":"")+i+"</option>");
		}
		document.write("</select>");
	},
	insertDateList:function(){
		document.write("<select name=\""+this.dateFieldName+"\">");
		for(var i=1;i<=new Date(this.date.getFullYear(),this.date.getMonth()+1,0).getDate();i++){
			document.write("<option value=\""+((i<10)?"0":"")+i+"\" "+((this.date.getDate()==i)?"selected=\"selected\"":"")+">"+((i<10)?"0":"")+i+"</option>");
		}
		document.write("</select>");
	}
}
dateSelect.date=new Date(2005,11,24); // Julafton 
</script>

<form>
<script type="text/javascript">dateSelect.insertYearList();</script>
<script type="text/javascript">dateSelect.insertMonthList();</script>
<script type="text/javascript">dateSelect.insertDateList();</script>
</form>
westmanMedlem sedan aug. 2004279 inlägg
#10

man tackar! lite overkill ja, men rätt ska vara rätt! ;)

tantenMedlem sedan nov. 20051 658 inlägg
#11

Tar upp en gammal tråd...
Jag håller på med en kalender och den visar bara 26 dagar i februari, 28 dagar på adminsidan oavsett om det är skottår eller inte. Finns det någon som kan kolla om detta är rätt i jsscriptet.

function setDays(month,year,objectid){
	var monthdays 	= new Array(31,0,31,30,31,30,31,31,30,31,30,31);
	monthdays[1]	= (year%4 == 0) ? 29 : 28;
	var d 			= document;
	var _id			= d.getElementById(objectid);
	var _tag		= _id.getElementsByTagName('option');
	if(_tag.length != monthdays[month-1]){
		for(a=_tag.length-1;a>-1;a--){
			_tag[a].removeChild(_tag[a].firstChild);
			_id.removeChild(_tag[a]);
		}
for(a=0;a<monthdays[month-1];a++){
			e_option 	= d.createElement('option');
			label		= (a<9) ? '0' + (a+1) : a+1;
			e_label		= d.createTextNode(label);
			_id.appendChild(e_option);
			_tag[a].setAttribute('value',a+1);
			_tag[a].appendChild(e_label);
		}

Jag skulle bli väldigt tacksam för hjälp... så jag kan utesluta detta om det är rätt :)

Genererad på 392 ms · cache AV · v20260730165559-full.f96bc7eb