/ Forside / Teknologi / Udvikling / Java Scripts / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Java Scripts
#NavnPoint
molokyle 5410
Klaudi 2799
smorch 2439
kim 1360
Harlekin 1134
bentjuul 984
gibson 800
severino 695
Random 675
10  konsulent.. 626
tilgå værdien i et assosiativt array?
Fra : Kim Emax


Dato : 02-10-07 22:25

Hey People.

Jeg prøver at få en key fra en række selectbokse lavet som
associativte arrays, men det driller. Prøver jeg med en selectbox, så
er det ikke noget problem:

<select name="products" OnChange=update()>

henter jeg værdien af med:
alert(document.invoiceAdd.products.selectedIndex)

Her echoer fint den key, der vælges i alertboksen. Men laver jeg et
array:

<select name="products[1]" OnChange=update()>
<select name="products[2]" OnChange=update()>

og henter værdien med:
alert(document.invoiceAdd.products[1].selectedIndex)

kommer IE med denne fejl:
document.invoiceAdd.products.1 er null eller ikke et objekt

Hvorfor er [] væk? Og hvordan tilgår jeg værdien i et associativt
array?

mvh
Kim Emax


 
 
Lasse Reichstein Nie~ (02-10-2007)
Kommentar
Fra : Lasse Reichstein Nie~


Dato : 02-10-07 23:08

Kim Emax <kimemax@gmail.com> writes:

> Jeg prøver at få en key fra en række selectbokse lavet som
> associativte arrays, men det driller.

Her må du gerne være mere præcis med hvad det er du forsøger at opnå.
Jeg har en idé ud fra det følgende, men jeg er ikke helt sikker.

> Prøver jeg med en selectbox, så er det ikke noget problem:
>
> <select name="products" OnChange=update()>
>
> henter jeg værdien af med:
> alert(document.invoiceAdd.products.selectedIndex)

Her vil jeg anbefale at bruge:
document.forms["invoiceAdd"].elements["products"].selectedIndex
bl.a., for at gøre det mere klart hvad der er HTML-navne og hvad der er
JavaScript-objekter (og fordi det fanger andre fejl, bl.a., den der
rammer dig her).

> Her echoer fint den key, der vælges i alertboksen.

Forhåbentligt er det nummeret på den valgte option, ikke dens navn.
(Det kan selvfølgelig være at det er det samme :)

> Men laver jeg et array:
>
> <select name="products[1]" OnChange=update()>
> <select name="products[2]" OnChange=update()>

Du laver ikke noget array, eller noget der ligner.

Du laver to select-elementer. De hedder henholdsvis "products[1]" og
"products[2]". De kunne lige så godt have hedder "argle" og "bargle".
Det er bare HTML-navne, og de fortolkes ikke som Javascript.

> og henter værdien med:
> alert(document.invoiceAdd.products[1].selectedIndex)

> kommer IE med denne fejl:
> document.invoiceAdd.products.1 er null eller ikke et objekt

Korrekt sagt af den. Det du forsøger her er at bruge
"document.invoiceAdd.products" som array og tilgå element "1".
Men "document.invoiceAdd.products" er null, fordi du ikke har
nogen elementer i din HTML med navnet "products".

Hvis du bruger den anden notation, og skriver:
document.forms["invoiceAdd"].elements["products[1]"].selectedIndex
så skulle det virke. De giver dig igen ikke noget array.

Hvis du *vil* have et array, så kan du give select'erne *samme*
navn:

<select name="products" ...>
<select name="products" ...>

Så vil browsere (ikke helt standard-mæssigt, men ganske konsekvent)
lave et array, så:
document.forms["invoiceAdd"].elements["products"][0].selectedIndex
er selected-index for den første form-control i formen "invoiceAdd"
med navnet "products".

> Hvorfor er [] væk?

Fordi
objekt["navn"]
og
objekt.navn
er det samme hvis "navn" er et gyldigt variabelnavn.
IE sløser lidt med notationen når den skriver "...products.1", men den
mener "...products[1]", og det fejler, for der er intet element i formen
med navnet "product".

> Og hvordan tilgår jeg værdien i et associativt array?

Her ser det ud til at du er ude efter et helt almindeligt array (altså
indekseret med tal). Det er dog ligegyldigt hvad et array/objekt i
Javascript er indekseret med, man bruger samme måde at slå op:
Med firkantede parenteser, ganske som du gør.

Det svære er at sørge for at der er et array at slå op i :)


Held og lykke
/L
--
Lasse Reichstein Nielsen - lrn@hotpop.com
DHTML Death Colors: <URL:http://www.infimum.dk/HTML/rasterTriangleDOM.html>
'Faith without judgement merely degrades the spirit divine.'

Lasse Reichstein Nie~ (04-10-2007)
Kommentar
Fra : Lasse Reichstein Nie~


Dato : 04-10-07 00:06

Kim Emax <kimemax@gmail.com> writes:

>> Her vil jeg anbefale at bruge:
>> document.forms["invoiceAdd"].elements["products"].selectedIndex
>> bl.a., for at gøre det mere klart hvad der er HTML-navne og hvad der er
>> JavaScript-objekter (og fordi det fanger andre fejl, bl.a., den der
>> rammer dig her).
>
> Jeg får det samme output, det count jeg er nået til. Jeg er
> interesseret i den Key, som products[count] har, når jeg laver en
> "OnChange"
>
>> > Her echoer fint den key, der vælges i alertboksen.
>>
>> Forhåbentligt er det nummeret på den valgte option, ikke dens navn.
>> (Det kan selvfølgelig være at det er det samme :)
>
> jeg har en funktion, der laver en række (<tr></tr>), som kører en
> count og incrementer så hver linie er unik. Laver jeg en:
> alert('<select name="products['+count+']" id="products['+count+']"
> OnChange=update_price('+count+')>')
> printer den:
> <select name="products[1]" id="products[1]" OnChange=update_price(1)>
> næste linie bliver
> <select name="products[2]" id="products[2]" OnChange=update_price(2)>
> osv

(Bemærk at "products[1]" ikke er tilladt som værdi af id-attributten.
Det er begrænset hvilke tegn der må stå i en id, og firkantede parenteser
er ikke blandt dem).

>
>> > Men laver jeg et array:
>>
>> > <select name="products[1]" OnChange=update()>
>> > <select name="products[2]" OnChange=update()>
>>
>> Du laver ikke noget array, eller noget der ligner.
>>
>>
>> Du laver to select-elementer. De hedder henholdsvis "products[1]" og
>> "products[2]". De kunne lige så godt have hedder "argle" og "bargle".
>> Det er bare HTML-navne, og de fortolkes ikke som Javascript.
>
> Jeg tror ikke jeg forstår dig her? Siger du at javascript ikke ser
> products[2] som et array, der hedder products og at dette er key nr.2?

Ikke når det er navnet på en HTML form-control.

> For når jeg har lavet 3 linier, så hiver jeg dem pænt ud via php, når
> jeg submitter med en foreach:

Ah, men PHP fortolker det browseren sender.

Browseren sender faktisk en værdi for en form-control med navnent
"products[2]", uden at det betyder andet for den end en sekvens af
tegn. Internt i PHP bliver den værdi gjort tilgængelig som indgang 2
i et array der hedder "products", men det er PHP's magi, ikke andet.

Det sker ikke i Javascript på browseren. Der har man adgang til
select-elementet, som har en attribut ved navn "name" med værdi
"products[2]". Ingen magi der.

> Iflg dette eksempel så burde jeg kunne gøre hvad jeg vil:
> http://www.pageresource.com/jscript/jarray2.htm

Det er ganske rigtigt også måden man bruger Javascript-arrays på, men
det er ligegyldigt, for navnet på et select-element bliver ikke
fortolket som Javascript. Det er *meget* vigtigt at holde
Javascript-kode og HTML-navne adskilt, ellers bliver man hurtigt
forvirret.

....
>> Så vil browsere (ikke helt standard-mæssigt, men ganske konsekvent)
>> lave et array, så:
>> document.forms["invoiceAdd"].elements["products"][0].selectedIndex
>> er selected-index for den første form-control i formen "invoiceAdd"
>> med navnet "products".
>
> Næh, den giver mig "undefined" i det øjeblik jeg har 2 linier og
> vælger en værdi i selectboxen, fordi begge linier nu indeholder
> "products", og ikke længere er unik

En hurtig test:
<form action="" onsubmit="
var f1 = this.elements['foo'][0];
var f2 = this.elements['foo'][1];
alert([f1.options[f1.selectedIndex].value,
f2.options[f2.selectedIndex].value]);
return false;">
<select name="foo">
<option value="A">1.1</option>
<option value="B">1.2</option>
</select>
<select name="foo">
<option value="C">2.1</option>
<option value="D">2.2</option>
</select>
<input type="submit" value="Test">
</form>

Virker umiddelbart i IE, Firefox og Opera.
Det fejler nok til gengæld i PHP.


Hvis man gerne vil gøre noget ved et element når det skifter,
så er det ofte smart at sende elementet selv med også.

Som et helt eksempel:

<script type="text/javascript">
function doSomething(select,rowNum) {
var index = select.selectedIndex;
var option = select.options[index];
var value = option.value;
var text = option.text;
select.form.elements[ "text["+rowNum+"]" ].value = text;
}
</script>
<form action="">
<table>
<tr><td><select name="foo[1]" onchange="doSomething(this,1)">
<option value="A">1.1</option>
<option value="B">1.2</option>
</td><td><input type="text" name="text[1]"></td></tr>
<tr><td><select name="foo[1]" onchange="doSomething(this,2)">
<option value="C">2.1</option>
<option value="D">2.2</option>
</td><td><input type="text" name="text[2]"></td></tr>
</table>
</form>


>> Her ser det ud til at du er ude efter et helt almindeligt array (altså
>> indekseret med tal). Det er dog ligegyldigt hvad et array/objekt i
>> Javascript er indekseret med, man bruger samme måde at slå op:
>> Med firkantede parenteser, ganske som du gør.
>
> Din snak om at det ikke er et array og nu at det er et almindeligt
> array forvirrer mig lidt?

Jeg står ved at der ikke var noget array. Her kommenterer jeg at du
kalder det du ønskede at have for et associativt array, men du vil
kun bruge det til at slå op på tal, så du har kun brug for et
(almindeligt) array.

/L
--
Lasse Reichstein Nielsen - lrn@hotpop.com
DHTML Death Colors: <URL:http://www.infimum.dk/HTML/rasterTriangleDOM.html>
'Faith without judgement merely degrades the spirit divine.'

Martin (02-10-2007)
Kommentar
Fra : Martin


Dato : 02-10-07 23:33

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Kim Emax wrote:
> Hey People.
>
> Jeg prøver at få en key fra en række selectbokse lavet som
> associativte arrays, men det driller. Prøver jeg med en selectbox, så
> er det ikke noget problem:
>
> <select name="products" OnChange=update()>
>
> henter jeg værdien af med:
> alert(document.invoiceAdd.products.selectedIndex)
>
> Her echoer fint den key, der vælges i alertboksen. Men laver jeg et
> array:
>
> <select name="products[1]" OnChange=update()>
> <select name="products[2]" OnChange=update()>
>
> og henter værdien med:
> alert(document.invoiceAdd.products[1].selectedIndex)

Bare brug prototype (www.prototypejs.com)
Så skal man bare hente det via

$F('products');

Det gør jo alting meget nemmere..... og sjovere!!!
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.6 (GNU/Linux)

iD8DBQFHAscYVzYiijaapJ0RAhmCAJ4juSpH3I1g/aqdtlJTcpSwakVroQCgw0AG
HhB1kTFHlPDNm2fSUegjwRE=
=fWad
-----END PGP SIGNATURE-----

Martin (03-10-2007)
Kommentar
Fra : Martin


Dato : 03-10-07 18:41

Martin wrote:
> Bare brug prototype (www.prototypejs.com)

Skriver altid linket forkert...
http://www.prototypejs.org/

Kim Emax (03-10-2007)
Kommentar
Fra : Kim Emax


Dato : 03-10-07 19:18

Hej Lasse

On 3 Okt., 00:07, Lasse Reichstein Nielsen <l...@hotpop.com> wrote:
> Kim Emax <kime...@gmail.com> writes:
> > Jeg prøver at få en key fra en række selectbokse lavet som
> > associativte arrays, men det driller.
>
> Her må du gerne være mere præcis med hvad det er du forsøger at opnå.
> Jeg har en idé ud fra det følgende, men jeg er ikke helt sikker.

Jeg præciserer nedenfor...

> > Prøver jeg med en selectbox, så er det ikke noget problem:
>
> > <select name="products" OnChange=update()>
>
> > henter jeg værdien af med:
> > alert(document.invoiceAdd.products.selectedIndex)
>
> Her vil jeg anbefale at bruge:
> document.forms["invoiceAdd"].elements["products"].selectedIndex
> bl.a., for at gøre det mere klart hvad der er HTML-navne og hvad der er
> JavaScript-objekter (og fordi det fanger andre fejl, bl.a., den der
> rammer dig her).

Jeg får det samme output, det count jeg er nået til. Jeg er
interesseret i den Key, som products[count] har, når jeg laver en
"OnChange"

> > Her echoer fint den key, der vælges i alertboksen.
>
> Forhåbentligt er det nummeret på den valgte option, ikke dens navn.
> (Det kan selvfølgelig være at det er det samme :)

jeg har en funktion, der laver en række (<tr></tr>), som kører en
count og incrementer så hver linie er unik. Laver jeg en:
alert('<select name="products['+count+']" id="products['+count+']"
OnChange=update_price('+count+')>')
printer den:
<select name="products[1]" id="products[1]" OnChange=update_price(1)>
næste linie bliver
<select name="products[2]" id="products[2]" OnChange=update_price(2)>
osv

> > Men laver jeg et array:
>
> > <select name="products[1]" OnChange=update()>
> > <select name="products[2]" OnChange=update()>
>
> Du laver ikke noget array, eller noget der ligner.
>
>
> Du laver to select-elementer. De hedder henholdsvis "products[1]" og
> "products[2]". De kunne lige så godt have hedder "argle" og "bargle".
> Det er bare HTML-navne, og de fortolkes ikke som Javascript.

Jeg tror ikke jeg forstår dig her? Siger du at javascript ikke ser
products[2] som et array, der hedder products og at dette er key nr.2?
For når jeg har lavet 3 linier, så hiver jeg dem pænt ud via php, når
jeg submitter med en foreach:

foreach($_REQUEST[productline] AS $key => $amount) {
if($DEBUG)
print "$key: antal $amount " . $_REQUEST[products][$key] . " -
rabat: " . $_REQUEST[discount][$key] ." - text:" . $_REQUEST[text]
[$key] . "<br>";

Så jeg ser og behandler det nu som et array Der er intet i vejen
for at du laver en side, der hedder test.php:

<?
if($_POST['bestil']) {
foreach($_POST['beer'] as $key => $val) { // her render vi arrayet
igennem
print "$key - $val<br>";
}
}
?>
<form action="test.php" method="post" name="array_test">
<input type="text" name="beer[1]">
<input type="text" name="beer[2]">
<input type="text" name="beer[3]">
<input type="submit" name="bestil" value="bestil">
</form>

Prøv selv. det jeg så gerne ville kunne var at hente værdien i f.eks.
beer[1] og bruge den, f.eks. til at skrive ud i en div, eller som i
mit tilfælde, til at skrive prisen på et produkt i et andet input
felt.

Iflg dette eksempel så burde jeg kunne gøre hvad jeg vil:
http://www.pageresource.com/jscript/jarray2.htm

> > og henter værdien med:
> > alert(document.invoiceAdd.products[1].selectedIndex)
> > kommer IE med denne fejl:
> > document.invoiceAdd.products.1 er null eller ikke et objekt
>
> Korrekt sagt af den. Det du forsøger her er at bruge
> "document.invoiceAdd.products" som array og tilgå element "1".
> Men "document.invoiceAdd.products" er null, fordi du ikke har
> nogen elementer i din HTML med navnet "products".
>
> Hvis du bruger den anden notation, og skriver:
> document.forms["invoiceAdd"].elements["products[1]"].selectedIndex
> så skulle det virke. De giver dig igen ikke noget array.
>
> Hvis du *vil* have et array, så kan du give select'erne *samme*
> navn:
>
> <select name="products" ...>
> <select name="products" ...>
>
> Så vil browsere (ikke helt standard-mæssigt, men ganske konsekvent)
> lave et array, så:
> document.forms["invoiceAdd"].elements["products"][0].selectedIndex
> er selected-index for den første form-control i formen "invoiceAdd"
> med navnet "products".

Næh, den giver mig "undefined" i det øjeblik jeg har 2 linier og
vælger en værdi i selectboxen, fordi begge linier nu indeholder
"products", og ikke længere er unik

> > Hvorfor er [] væk?
>
> Fordi objekt["navn"] og objekt.navn
> er det samme hvis "navn" er et gyldigt variabelnavn.
> IE sløser lidt med notationen når den skriver "...products.1", men den
> mener "...products[1]", og det fejler, for der er intet element i formen
> med navnet "product".

Ahh... IE... vores allesammens ven. Jeg bruger normalt kun FF, men
funktionen virker ikke deri, såee... jeg må fikse den del først...
eller lave en statisk side at teste på...for at eliminere fejlkilder
også... Værdierne kommer som sagt ud med PHP efterfølgende...

> > Og hvordan tilgår jeg værdien i et associativt array?
>
> Her ser det ud til at du er ude efter et helt almindeligt array (altså
> indekseret med tal). Det er dog ligegyldigt hvad et array/objekt i
> Javascript er indekseret med, man bruger samme måde at slå op:
> Med firkantede parenteser, ganske som du gør.

Din snak om at det ikke er et array og nu at det er et almindeligt
array forvirrer mig lidt?

> Det svære er at sørge for at der er et array at slå op i :)

hehe

/Kim


Kim Emax (03-10-2007)
Kommentar
Fra : Kim Emax


Dato : 03-10-07 19:56

On 3 Okt., 20:18, Kim Emax <kime...@gmail.com> wrote:

> Ahh... IE... vores allesammens ven. Jeg bruger normalt kun FF, men
> funktionen virker ikke deri, såee... jeg må fikse den del først...
> eller lave en statisk side at teste på...for at eliminere fejlkilder

Jeg har lavet en testside her, der nemt skulle illustere, hvad det er
jeg vil:

http://www.emax.dk/javascript/array_test.php

Mvh
Kim Emax


Kim Emax (03-10-2007)
Kommentar
Fra : Kim Emax


Dato : 03-10-07 21:50

On 3 Okt., 20:56, Kim Emax <kime...@gmail.com> wrote:

> Jeg har lavet en testside her, der nemt skulle illustere, hvad det er
> jeg vil:
>
> http://www.emax.dk/javascript/array_test.php

og nu virker det, fik en snak med en gl. kollega.

mvh
Kim Emax



Søg
Reklame
Statistik
Spørgsmål : 177580
Tips : 31968
Nyheder : 719565
Indlæg : 6409076
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste