webForumDet fria alternativet

Uppdatera select nr 2 när man ändrar i select nr 1

JavaScript

11 svar · 1 013 visningar · startad av Melea

Medlem sedan juli 20033 147 inlägg
Frågan#1

Hoy wF!

Jag behöver lite hjälp här nu då jag fortfarande inte riktigt lagt manken till och lärt mig Javascript.
Jag har idag en användartabell med kanske 50 användare. Jag har även en tabell där det ligger underanvändare, som är knutna till en viss användare.

För att göra det enkelt för mig om jag nu vill lägga till dessa underanvändare i en annan tabell vill jag först loopa ut alla användare i en <select>. När man sedan väljer en användare i den <select>en vill jag att det ska finnas en <select> nummer två bredvid som via "onchange" loopar ut alla underanvändare till just den användaren jag valt i <select> nummer 1.

Är detta en bra lösning eller finns det bättre?
Liten början på en kodsnutt skulle vara väldigt uppskattat!

Tack på förhand!

Medlem sedan dec. 20025 483 inlägg
#2

Tja!

Jesper har postat ett skript i skriptavdelningen för JS:
http://www.webforum.nu/showthread.php?t=63304

Det du behöver göra är att mappa användarna så här

kommun[1][0]="Underanv.#1 till anv.#1";
kommun[1][1]="Underanv.#2 till anv.#1";
kommun[2][0]="Underanv.#1 till anv.#2";
kommun[2][1]="Underanv.#2 till anv.#2";

o.s.v.

Sedan kanske du vill döpa om vissa identifierare så att de får en mer passande beskrivning ;)

Medlem sedan juli 20033 147 inlägg
#3

Skitbra! (y)

Frågan är nu hur jag får in "underanvändarid:t".

kommun[1][b][0][/b]="Underanv.#1 till anv.#1";
kommun[1][b][1][/b]="Underanv.#2 till anv.#1";
kommun[2][b][0][/b]="Underanv.#1 till anv.#2";
kommun[2][b][1][/b]="Underanv.#2 till anv.#2";

Det som är fetmarkerat, i "value" i den andra <select>en, samt den sifran som inte är fetmarkerad som value i den första <select>en?

Annars är det precis vad jag var ute efter! Tack PeterS och Jesper!

Medlem sedan juli 20033 147 inlägg
#4

Svaret hur jag får in användarID:t i den första <select>en är ju ganska enkelt kom jag på, men den andra kvarstår fortfarande. :)

Medlem sedan dec. 20025 483 inlägg
#5

För att få med id:t på underanv. kan vi justera Jespers kod till

kommun[1][0] = { id:12,  txt:"underanv.#1 till anv.#1" };
kommun[1][1] = { id:67,  txt:"underanv.#2 till anv.#1" };
kommun[2][0] = { id:3,   txt:"underanv.#1 till anv.#2" };
kommun[2][1] = { id:128, txt:"underanv.#2 till anv.#2" };
function showSubKommun(subCat,selectObj){
	selectObj.length=kommun[subCat].length;
	for(var n=0;n<kommun[subCat].length;n++){
		selectObj[n].text=kommun[subCat][n].txt;
		selectObj[n].value=kommun[subCat][n].id;
	}
}

Till 'id' skriver du alltså underanv.id:t och till 'txt' det som skall synas i <option>HÄR</option>.

Medlem sedan juli 20033 147 inlägg
#6

Alldeles lysande! :)

Stort tack!

Medlem sedan juli 20033 147 inlägg
#7

Upptäckte just en lite grej, som jag inte riktigt kan få koll på.
När jag sorterar användarna i den första <select>en i bokstavsordning så klaffar inte längre den andra <select>en som den ska.

Om vi säger att det är två personer som börjar på B, Britt och Börje.
Om vi säger att Börje har användarID 1 och Britt 49, och Britt hamnar på plats nummer 1 i listan så får Britt, Börjes underanvändare i den andra <select>en.

Medlem sedan dec. 20025 483 inlägg
#8

Ja, det stämmer. Det första indexet i kommun är kopplat till positionen i den första <select>en. Så kommun[1][0]-kommun[1][n] är kopplad till den andra positionen i den första <select>en.

Det enklaste lösningen är alltså att sortera listan innan den skrivs till select numero uno. Jag antar att du loopar ut namnen från en databas? Då bör det gå att fixas med en ORDER BY. :)

Medlem sedan juli 20033 147 inlägg
#9

Ja, jag har testat det, och nu sorterar jag efter ID, för att göra det så enkelt som möjligt, men det blir fortfarande fel.

Om vi säger att Jimmie ID nummer 10, men han ligger på plats nummer 8 i listan, eftersom det inte finns några användare på ID 4 och 5.
Då får jag fram Jimmies underanvändaren om jag väljer användare nummer 10 i listan, vilken kan vara vem som helst, säg Jonas.

Medlem sedan juli 20033 147 inlägg
#10

Antar att det blir enklare att se problemet med lite kod.

$sql = $db->query("
select
	uc.id as char_user_id,
	u.id as user_id,
	uc.nickname
from
	" . TABLE_USER_CHAR . " uc
left join
	" . TABLE_USER . " u on uc.user_id = u.id
order by
	char_user_id
");

$lenght = $sql->size()+1;

echo '
<script language="JavaScript" type="text/javascript">
<!--//
var character = new Array('.$lenght.');

for (var n = 0; n < character.length; n++) {
	character[n] = new Array();
}

character[0][0] = "-- Pick user --";
';

$i = 0;

while($row = $sql->fetch()) {

	if ($row['user_id'] != $session->get('j_user_id')) { $i = 0; }

	echo 'character['.$row[user_id].']['.$i.'] = { id:'.$row[char_user_id].', txt:"'.ucfirst(strtolower($row['nickname'])).'" };
	';

	$session->set('j_user_id', $row[user_id]);

	$i++;

}

echo '
function showSubCharacter(subCat,selectObj) {

	selectObj.length = character[subCat].length;

	for (var n=0; n < character[subCat].length; n++){

		selectObj[n].text = character[subCat][n].txt;
		selectObj[n].value = character[subCat][n].id;

	}

}
</script>
';

$sql = $db->query("
select
	id,
	username
from
	" . TABLE_USER . "
order by
	id
");

...

<select name="user_id" class="select" style="width: 150px;" onChange="showSubCharacter(this.selectedIndex,this.form.char_id);">
<option value="" selected>-- Pick user --</option>
';

while($row = $sql->fetch()) {

	echo '<option value="'.$row[id].'">'.ucfirst(strtolower($row['username'])).'</option>
	';

}

echo '
</select>
<select name="char_id" class="select" style="width: 150px;">
	<option selected>-- Pick character --</option>
</select>

Tabellerna sammankopplas med kolumnen user_id i TABLE_USER_CHAR. Däri finns även nickname.

Medlem sedan dec. 20025 483 inlägg
#11

Du kanske kan göra så här:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Sveriges alla kommuner</title>
</head>
<body>

<script language="JavaScript" type="text/javascript">
<!--//
var kommun = new Array(22);
for(var n=0;n<kommun.length;n++){
	kommun[n] = new Array();
}

kommun["0"] = [
  { id:0, txt:"-- Välj län --" }
];

kommun["10"] = [
  { id:12, txt:"underanv.#1 till anv.#10" },
  { id:25, txt:"underanv.#2 till anv.#10" },
  { id:64, txt:"underanv.#3 till anv.#10" }
];
kommun["37"] = [
  { id:78, txt:"underanv.#1 till anv.#37" }
];
function showSubKommun(subCat,selectObj){
        selectObj.length=kommun[subCat].length;
	for(var n=0;n<kommun[subCat].length;n++){
		selectObj[n].text=kommun[subCat][n].txt;
		selectObj[n].value=kommun[subCat][n].id;
	}
}
</script>

<form>
<select name="lan" onChange="showSubKommun(this.options[this.selectedIndex].value,this.form.underKommun);">
    <option value="0" selected>-- Välj Län --</option>
    <option value="10">Blekinge län</option>
    <option value="37">Dalarnas län</option>
  </select>
<select name="underKommun">
    <option selected>-- V&auml;lj l&auml;n --</option>
  </select>
</form>

</body>
</html>

Nu är option.value i select #1 kopplat till en unik underkategori (kommun["n"]). Den översta, "-- Välj län --", har value = 0. Att sortera om select #1 skall nu inte medföra att fel underkategori visas.

Medlem sedan juli 20033 147 inlägg
#12

Sicken klippa du är. :)

Tack än en gång!

267 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
129 ms — deklarationer (db)
0 ms — hämta statistik (cache)
134 ms — hämta tråd, inlägg och bilagor (db)
123 ms — ändringar (db)