webForumDet fria alternativet

"dynamiska menyer"

28 svar · 1 425 visningar · startad av civilpolisen

civilpolisenMedlem sedan dec. 2009816 inlägg
#1

Detta har säkert frågats om tidigare, men jag vet inte vad jag ska leta efter. Inte heller vad det egentligen heter...

När jag registrerar mig till en webbplats frågas efter region/län och kommun/stad.

När jag väljer Västra Götaland så hoppar alla dom städerna upp i valet för stad.

Jag tror ni fattar. Hur gör jag detta med minsta möjliga ansträngning...?

civilpolisenMedlem sedan dec. 2009816 inlägg
#2

http://www.w3schools.com/htmldom/dom_examples.asp

Jag studerar dessa exempel och tycker det är svårt att följa... Det finns inget riktigt bra exempel om just detta.

civilpolisenMedlem sedan dec. 2009816 inlägg
#3

http://www.google.se/search?q=dynamic+dropdownlist+javascript&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:sv-SE:official&client=firefox-a

Efter denna sökning kom jag till sida fyra:
http://javascript.about.com/library/bldydrop1.htm

Här är det jag vill. Ska testa senare idag.

Skriver detta för mig själv men även för andra som undrar! :-)

noshorninMedlem sedan aug. 2008662 inlägg
#4

Det jobbig är väll att lägga in alla städer. Men här kommer ett tips på hur det kan se ut:

head:

<script language="Javascript">
var arrayCounty = new Array("Blekinge", "Dalarna", "Gotland");
var arrayBlekinge = new Array("stad1 i blekinge", "stad2 i blekinge");
var arrayDalarna = new Array("stad1 i dalarna");
var arrayGotland = new Array("stad i Gotland");

function newCounty(c){
	var selbox = document.myform.opttwo;
	var c = c;

	switch(c.value)
	{
	case "Blekinge":
		for(i=0; i < arrayBlekinge.length; i++){
			selbox.options[i] = new Option(arrayBlekinge[i],arrayBlekinge[i]);
		}
	break;
	case "Dalarna":
		for(i=0; i < arrayDalarna.length; i++){
			selbox.options[i] = new Option(arrayDalarna[i],arrayDalarna[i]);
		}
	break;
	case "Gotland":
		for(i=0; i < arrayGotland.length; i++){
			selbox.options[i] = new Option(arrayGotland[i],arrayGotland[i]);
		}
	break;
	}
}
</script>

body:

<form name="myform">
<select onchange="javascript: newCounty(this)">
<script language="Javascript">
for(i=0; i < arrayCounty.length; i++){
	document.write("<option value='" +  arrayCounty[i] + "'>" + arrayCounty[i] + "</option>");
}
</script>
</select>
</br>
<select name="opttwo">
</select>
</form>

Det enda du behöver göra med denna kod är att lägga till alla län som fattas i arrayen: "arrayCounty", skapa en array för varje län med alla städer i det länet i och ändra switch satsen så ska allt funka. Det finns över 100 städer i sverige och 21 län så jag orkade inte skriva in allt!

civilpolisenMedlem sedan dec. 2009816 inlägg
#5

Oj! Man tackar! Det var seriöst arbetat!!

Precis som du skriver, det finns många städer. Men dom läser jag från databas så dom tänkte jag inte skriva in i alla fall.

Hmmm... Det är lördag kväll och plikten kallar. Man har en del "spaningsuppdrag" att ta sig ann... Jag ska studera din kod i morgon!
Tusen tack för engagemang!

Jag har även funderat på någon form av öppen, central, grejja som jag, men även andra, kan använda... Kommer tid kommer råd!! Det blir oavsett vilket inget med det just i kväll!! :-)

Skål!!

civilpolisenMedlem sedan dec. 2009816 inlägg
#6

Det fungerar halvbra... eller egentligen inte alls om jag ska vara ärlig.

Men jag har en teori om att mellanslag och svenska tecken kan fungera dåligt i javascript?

voigtann1Medlem sedan juni 20018 810 inlägg
#7

Kom med din kod, så bli det betydligt enklare att felsöka, men variabler bör inte ha å, ä, ö i huvudtaget då det inte fungera bra. Sen måste jag säga att skapa en array per stad känns lite gammal modigt, jag hade haft ett objekt med alla län och dess städer kopplade på objektet, på så sätt så slipper du göra en switch sats på det sätt du behöver göra nu.

Såg ett problem med noshornin kod, det är att alla städer/län måste ha exakt lika många värden, annars kommer de inte skriva över dom, gjorde om koden:

<script language="Javascript">
var countrys = [
	{
		name: "Blekinge",
		citys: [
			"Karlshamn",
			"Karlskrona",
			"Olofström",
			"Ronneby",
			"Sölvesborg"
		]
	},
	{
		name: "Dalarna",
		citys: [
			"stad1",
			"stad2"
		]
	},
	{
		name: "Gotland",
		citys: [
			"stad3",
			"stad4"
		]
	},
];

function loadCountrys(el) {
	var html = "";
	for(var i=0;i<countrys.length;i++) {
		var country = countrys[i];
		html+="<option>" + country.name + "</option>";
	}
	el.innerHTML = html;
}

function newCounty(el) {
	var citys = countrys[el.selectedIndex].citys;
	var selbox = document.getElementById("citys");
	html = "";
	for(var i=0;i<citys.length;i++) {
		var city = citys[i];
		html+='<option value="' + city + '">' + city + '</option>';
	}
	selbox.innerHTML = html;
}
</script>

<form name="myform">
	<select onchange="javascript: newCounty(this)" id="districts"></select>
	<br />
	<select name="opttwo" id="citys"></select>
</form>

<script type="text/javascript">
	var dropdowndistricts = document.getElementById("districts")
	loadCountrys(dropdowndistricts); //Fill in all the countrys
	newCounty(dropdowndistricts); //Load citys by default
</script>
civilpolisenMedlem sedan dec. 2009816 inlägg
#8

Tack!
För din information!
Jag undanhåller ingen kod! Jag har bara skrivit samma sak som redan finns på denna sidan, fast med ASP och från databas i stället. Resultatet är samma som redan finns postad på denna sidan... Fast med alla län utskrivna.

Jag får göra om i databasen nu så det är olika namn, även för denna funktion.

Sen ska jag testa med den kod du skriver ovan.

Återkommer...

voigtann1Medlem sedan juni 20018 810 inlägg
#9

civilpolisen skrev:

Tack!
Jag undanhåller ingen kod! Jag har bara skrivit samma sak som redan finns på denna sidan, fast med ASP och från databas i stället. Resultatet är samma som redan finns postad på denna sidan... Fast med alla län utskrivna.

Jag får göra om i databasen nu så det är olika namn, även för denna funktion.

Sen ska jag testa med den kod du skriver ovan.

Återkommer...

Men jag har en teori om att mellanslag och svenska tecken kan fungera dåligt i javascript?

Vad är det för fel med å ä ö och mellanslag då? Är det på variabler du har det eller i strängarna?

civilpolisenMedlem sedan dec. 2009816 inlägg
#10

OK, vad du var nyfiken! :-) Jag ger dig kod, inga problem!!

strName = Västra Götalands län
strName2 = Västra Götaland
strJSName = VastraGotaland

strJSName = replace(strName2, " " , "")
strJSName = replace(strJSName, "Å" , "A")
strJSName = replace(strJSName, "Ä" , "A")
strJSName = replace(strJSName, "Ö" , "O")
strJSName = replace(strJSName, "å" , "a")
strJSName = replace(strJSName, "ä" , "a")
strJSName = replace(strJSName, "ö" , "o")

Detta utskrivet blir:

var arrayCounty = new Array("Välj län", "Blekinge", "Dalarna", "Gävleborg", "Halland", 
"Jämtland", "Jönköping", "Kalmar", "Kronoberg", "Norrbotten", "Skåne", "Stockholm", 
"Södermanland", "Uppsala", "Värmland", "Västerbotten", "Västernorrland", "Västmanland", 
"Västra Götaland", "Örebro", "Östergötland");

var arrayBlekinge = new Array("Karlskrona");
var arrayDalarna = new Array("Skriv in ny stad för Dalarna");
var arrayGavleborg = new Array("Skriv in ny stad för Gävleborg");
var arrayHalland = new Array("Skriv in ny stad för Halland");
var arrayJamtland = new Array("Skriv in ny stad för Jämtland");
var arrayJonkoping = new Array("Arneby", "Eksjö", "Nässjö", "Vetlanda", "Värnamo");
var arrayKalmar = new Array("Kalmar");
var arrayKronoberg = new Array("Skriv in ny stad för Kronoberg");
var arrayNorrbotten = new Array("Skriv in ny stad för Norrbotten");
var arraySkane = new Array("Lund", "Malmö");
var arrayStockholm = new Array("Skriv in ny stad för Stockholm");
var arraySodermanland = new Array("Skriv in ny stad för Södermanland");
var arrayUppsala = new Array("Skriv in ny stad för Uppsala");
var arrayVarmland = new Array("Skriv in ny stad för Värmland");
var arrayVasterbotten = new Array("Skriv in ny stad för Västerbotten");
var arrayVasternorrland = new Array("Skriv in ny stad för Västernorrland");
var arrayVastmanland = new Array("Hallstahammar");
var arrayVastraGotaland = new Array("Skriv in ny stad för Västra Götaland");
var arrayOrebro = new Array("Skriv in ny stad för Örebro");
var arrayOstergotland = new Array("Linköping", "Mjölby", "Motala", "Norrköping", "Vadstena", "Ödeshög");

Detta är en spännande blandning av ASP och Javascript...
Detta fungerar nu. Nu ska rätt städer under rätt län uppdateras i den andra listan. Det fixar jag! :-)

Tack för kompetent assistans!!

voigtann1Medlem sedan juni 20018 810 inlägg
#11
strName = Västra Götalands län
strName2 = Västra Götaland
strJSName = VastraGotaland

Även i ASP så vet du att detta inte fungera, strName bli samma som variablen västra, vilket inte gå, om du skall använda strängar så är det:

strName = "Västra Götalands län";
strName2 = "Västra Götaland";
strJSName = "VastraGotaland";

som gäller.

Det är väl kanske en smaksak men:
new Array() korta ner det till [] istället (sen är det ju 9tecken mindre)

civilpolisenMedlem sedan dec. 2009816 inlägg
#12

OK, nu kommer vi in på saker som är j*vligt oväsentliga...

strName        = trimVars("strName")
strName2       = trimVars("strName2")

***
> new Array() korta ner det till [] istället (sen är det ju 9tecken mindre)

Detta känner jag inte till. Tack för tipset!

voigtann1Medlem sedan juni 20018 810 inlägg
#13

Vet inte vad trimVars gör, men jag gissar på att det är:
strName = trimvars(strName) du är ute efter i ASP.

civilpolisenMedlem sedan dec. 2009816 inlägg
#14
' ## TRIM VARS
FUNCTION trimVars(myVar)
	tmp = request(myVar)
	tmp = replace(tmp, "|", "")
	tmp = replace(tmp, "'", "''")
	trimVars = tmp
END FUNCTION

ASP koden kommer från det administrativa gränssnittet. Det är redan fixat och klart.

***
Jag gillar din kod!!

Men lite grejer som jag håller på att ändra:
Man vill ju skicka ID värdet på både stad och region. Inte själva namnet...
Det råder en viss blandning av begreppen "county" och "country" i din kod. Om man inte rör det så är det i sin ordning.

Själv skriver jag "region"... Men det är bara kosmetika! :-)

Jag håller på att fixa detta nu!

civilpolisenMedlem sedan dec. 2009816 inlägg
#15
	intRegionID: "6",
	name: "Jonkoping",
	name2: "Jönköpings län",
	citys: ["Arneby", "Eksjö", "Nässjö", "Vetlanda", "Värnamo"],
	intCityID: ["4", "2", "3", "1", "5"]

Ska jag skriva på detta sättet eller ska jag skriva sakerna efter varandra? Men det blir ju krångligt det med...

ID värdena på städerna fungerar inte riktigt. Det jag har prövat vill sig inte.

voigtann1Medlem sedan juni 20018 810 inlägg
#16

jag hade hellre kört:

	intRegionID: "6",
	name: "Jonkoping",
	name2: "Jönköpings län",
	citys: [{name:"Arneby", ID: "4"},{name:"Eksjö", ID: "2"},...]

För att få en korrekt struktur, intCityId säger inte direkt att det är mot citys den menar, men det är kanske en smaksak.

civilpolisenMedlem sedan dec. 2009816 inlägg
#17
Min databas ser ut så här:
[users]
intID
...
intRegionID
intCityID

[region]
intID

[city]
intID

På detta viset kan man lätt sammanställa olika typer av information/statistik med väldigt lite kod. Men visst, det är en smaksak!

Tack för tips! jag ska studera ditt exempel!

voigtann1Medlem sedan juni 20018 810 inlägg
#18

Varför behöver du name och name2 ? vad skall du använda det till?

civilpolisenMedlem sedan dec. 2009816 inlägg
#19

Du har en poäng... tror jag. Det var till den andra koden, som jag inte använder mer. Men nu när jag skickar ID-nummer borde jag kunna rationalisera bort den. Absolut!

Återkommer...

(Får be om ursäkt för den långsamma återkopplingen här... Men det är annat som drar också, så att säga!!)

civilpolisenMedlem sedan dec. 2009816 inlägg
#20
function newCounty(el) {
	var citys = countrys[el.selectedIndex].citys;
	var selbox = document.getElementById("citys");
	html = "";
	for(var i=0;i<citys.length;i++) {
		var city = citys[i];
		[b]var intID = citys[i];[/b]
		html+='<option value="' + [b]intID[/b] + '">' + city + '</option>';
	}
	selbox.innerHTML = html;
}

Allt fungerar bra, men i denna koden ovan har jag försökt massa olika alternativ och inte prickat rätt...

Vad är det jag inte ser!? (Det är alltså ID på staden som inte fungerar.)

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