webForumDet fria alternativet

Sortera i select

JavaScript

7 svar · 310 visningar · startad av Glitter

Medlem sedan juli 2003465 inlägg
Frågan#1

Jag försöker sortera i en select men det funkar inte riktigt som jag vill...

borde inte detta funka?

<script language="jscript">
	function Sort(){
		var a, b, c, d, l;
		var coll = sel;
		a = new Array;
		c = new Array;
		d = new Array;
		
		
		if (coll.length > 0) {
			for (i = 1; i < coll.length; i++){
				a[i] = coll.options(i).text;
				d[i] = coll.options(i).value;
				coll.options.remove(i);
			}
		}
		
		b = a.sort();
		
		for (i=0; i<b.length; i++){
			var oOption = document.createElement("OPTION");
			oOption.innertext = d[i];
			oOption.value = b[i];
			coll.options.add(oOption);
		}
	}
</script>

det som händer är att den tar bort några poster på selecten och lägger till poster utan namn och med värde...
någon som vet varför?
jag får inget felmess...

Medlem sedan maj 200010 687 inlägg
#2

Många fel...

Du börjar på 1 när du går igenom selecten. 0 är ju första indexet. Och bort med if-satsen. Helt onödig och ger en ful kod.

Du börjar ta bort ur select-listan, men indexen ändras ju medans du flyttar om, därför blir det fel där. Börja bakifrån istället.

Sen så använder du dig av d *vilket är fel eftersom att d inte har blivit sorterad och därför stämmer inte d:s index överens med b:s.

Och sen så använder du d för innertext när du lägger in det samtidigt som du tog d från value när du hämtade ut det.
Och varför innertext och inte bara text?

Sen är jag inte säker vad som gäller om paranteser vs hakparanteser när man fixar med options. Kanske är IE som är snäll eller så är det korrekt. Men standard är ju i alla fall att man kör med hakparanteser.

Men jobba på med det. Jag tror det är helt rätt att köra med inbyggda sort funktionen.*

Medlem sedan juli 2003465 inlägg
#3

Erik Juhlin skrev:

Du börjar på 1 när du går igenom selecten. 0 är ju första indexet.

jag vill inte ha med första posten på selecten..

Erik Juhlin skrev:

Sen så använder du dig av d vilket är fel eftersom att d inte har blivit sorterad och därför stämmer inte d:s index överens med b:s.

hur skall man få dem att stämma överens då?
för det går la inte att skapa en 2D array och sortera den?

Erik Juhlin skrev:

Och sen så använder du d för innertext när du lägger in det samtidigt som du tog d från value när du hämtade ut det.
Och varför innertext och inte bara text?

Innertext är la value?
hittade insättningen på msdn så det skall la vara rätt...

Medlem sedan juli 2003465 inlägg
#4
function Sort(){
	var a, d, i;
	var coll = sel;
	a = new Array
	d = new Array

	for (i = coll.length-2; i >= 1; i--){
		a[i] = coll.options(i).text;
		d[i] = coll.options(i).value;
		coll.options.remove(i);
	}

	a.sort();
	d.sort();					

	for (i = 0; i < a.length; i++){
		var oOption = document.createElement("OPTION");
		oOption.text = a[i];
		oOption.value = d[i];
		coll.options.add(oOption);
		oOption = "";
	}
}

denna funkar bra förutom att jag får en "undefined" fattar inte varför...

Medlem sedan maj 200010 687 inlägg
#5

Var får du undefined?

Denna förlitar sig på att value och text är detsamma. Annars kommer a och d sorteras olika.

Och varför oOption = "";?

Och vill du varken ha första eller sista i selecten?

Medlem sedan juli 2003465 inlägg
#6

undefined får jag på första posten
alla options innehåller ett värde...

a & d sorteras som det skall...

Och varför oOption = "";?

det var när det blev knas så jag plockar bort den

Medlem sedan dec. 20025 483 inlägg
#7

1. options är en samling, ej en funktion, så access till medlemmarna fås genom option**[n]**

2. I den första loopen initialiserar du a och d till och med position 1 istället för 0.

3. remove() är ingen funktion som appliceras på en samling objekt. Den hör till select-elementet.

4. Samma gäller för add(); det är en medlemsfunktion för select-elementet. Dessutom tar den två in-parametrar: ett option-element som skall läggas till samt det option-element det skall läggas till efter.

:)

Medlem sedan juli 2003465 inlägg
#8

Peter S skrev:

1. options är en samling, ej en funktion, så access till medlemmarna fås genom option**[n]**

testade att skriva option[ i ] men det blev fel...

Peter S skrev:

2. I den första loopen initialiserar du a och d till och med position 1 istället för 0.

ändrade till

a[i-1] = coll.options(i).text;
d[i-1] = coll.options(i).value;

så funkade det kannon :)

263 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
129 ms — deklarationer (db)
0 ms — hämta statistik (cache)
131 ms — hämta tråd, inlägg och bilagor (db)
127 ms — ändringar (db)