Avatar billede webblaster Nybegynder
18. juli 2007 - 14:10 Der er 22 kommentarer

Fra string til Array

Hej Eksperter jeg har et lille problem med at komme en string ind i et array. Stringen indeholder værdien fra ti form tjek bokse.

her er min form
<form action="testform.asp" method="post" name="test">
<input name="v1" type="checkbox" value="d1" />
<input name="v1" type="checkbox" value="d2" />
<input name="v1" type="checkbox" value="d3" />
<input name="v1" type="checkbox" value="d4" />
<input name="v1" type="checkbox" value="d5" />
<input name="v1" type="checkbox" value="d6" />
<input name="v1" type="checkbox" value="d7" />
<input name="v1" type="checkbox" value="d8" />
<input name="v1" type="checkbox" value="d9" />
<input name="v1" type="checkbox" value="d10" />
<input name="" type="submit" />

</form>

og her er mig javascript
var v1 = Request.Form("v1")
var i
var temp = new Array();
temp = v2.split(',');

for (i in temp)
{
Response.write(temp[i] + "<br />")
}

det er denne linje der fejler temp = v2.split(',');

så mit spørgsmål er hvordan får jeg er string som ser sådan her ud:
d1,d2,d3,d4,d5,d6,d7,d8,d9,d10

over i et array som

temp[0]=d1
temp[1]=d1
...
o.s.v
Avatar billede erikjacobsen Ekspert
18. juli 2007 - 14:35 #1
v2 ?
Avatar billede webblaster Nybegynder
18. juli 2007 - 14:57 #2
jeg skrev forkert v2 = v1 i koden jeg tester
Avatar billede erikjacobsen Ekspert
18. juli 2007 - 15:02 #3
Sikker ?  Jeg har ikke lige prøvet ASP sammenhæng, men i browser-JS virker det da fint:

var v1 = "d2,d5,d7"
var i
var temp = new Array();
temp = v1.split(',');

for (i in temp)
{
document.write(temp[i] + "<br />")
}
Avatar billede erikjacobsen Ekspert
18. juli 2007 - 15:03 #4
Men hvis ingen er afkrydset, vil du selvfølgelig få en fejl.
Avatar billede webblaster Nybegynder
18. juli 2007 - 15:35 #5
jeg får følgende fejl

The page you are looking for cannot be displayed because an invalid method (HTTP verb) was used to attempt access.

hvis det er en js file

og


Microsoft JScript runtime error '800a01b6'

Object doesn't support this property or method

/testform.asp, line 14

hvis det er en asp page
og linje 14 er : temp = v1.split(',');
Avatar billede erikjacobsen Ekspert
18. juli 2007 - 15:41 #6
Jo, men der er jo ikke noget galt i det du viser her. Giv os et link, eller vis hele koden.
Avatar billede mclemens Nybegynder
18. juli 2007 - 15:48 #7
Noget i denne stil ?



<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html><head><meta http-equiv="content-type" content="text/html; charset=iso-8859-1"><title>Ingen titel</title>

</head><body>
<form action="testform.asp" method="post" name="test">
<input name="v1" type="checkbox" value="d1" />
<input name="v1" type="checkbox" value="d2" />
<input name="v1" type="checkbox" value="d3" />
<input name="v1" type="checkbox" value="d4" />
<input name="v1" type="checkbox" value="d5" />
<input name="v1" type="checkbox" value="d6" />
<input name="v1" type="checkbox" value="d7" />
<input name="v1" type="checkbox" value="d8" />
<input name="v1" type="checkbox" value="d9" />
<input name="v1" type="checkbox" value="d10" />
<input name="" type="submit" />

</form>


<script type="text/javascript">
var v1 = document.getElementsByName("v1");
temp=[];
for(i=0;i<v1.length;i++)temp[i]=v1[i].value;alert(temp);
for (i=0;i<temp.length;i++)document.write(temp[i] + "<br />");
</script>
</body>
</html>
Avatar billede mclemens Nybegynder
18. juli 2007 - 15:52 #8
for(i in arrayname) fungerer ikke altid så godt med array af
elementer m.v., men fungerer godt med object indeholdende elementer.

I ovenstående kan du f.eks. istedet for:
for (i=0;i<temp.length;i++)document.write(temp[i] + "<br />");
sige:
for (i in temp)document.write(temp[i] + "<br />");

... men hvis du gør det samme med med v1 for løkken går det knap så heldigt.
Avatar billede mclemens Nybegynder
18. juli 2007 - 15:57 #9
Medmindre du skal bruge temp arrayet til andet kan
man selvfølgelig ligesågodt udskrive med det samme ...

<script type="text/javascript">
var v1 = document.getElementsByName("v1");
for(i=0;i<v1.length;i++)document.write(v1[i].value + "<br />");
</script>
Avatar billede webblaster Nybegynder
18. juli 2007 - 15:58 #10
html siden:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Untitled Document</title>
<script>
function CheckMyBox(BoxName,GetStat,MyForm){
var GetAll = eval("document.forms." + MyForm + "." + BoxName)
for (i=0; i < GetAll.length; i++)
GetAll[i].checked=GetStat
}
</script>
</head>

<body>

<form action="testform.asp" method="post" name="test">
<input name="v1" type="checkbox" value="d1" />
<input name="v1" type="checkbox" value="d2" />
<input name="v1" type="checkbox" value="d3" />
<input name="v1" type="checkbox" value="d4" />
<input name="v1" type="checkbox" value="d5" />
<input name="v1" type="checkbox" value="d6" />
<input name="v1" type="checkbox" value="d7" />
<input name="v1" type="checkbox" value="d8" />
<input name="v1" type="checkbox" value="d9" />
<input name="v1" type="checkbox" value="d10" />
<input name="" type="submit" />

</form>
<a href="java script:CheckMyBox('v1', true, 'test')">Check All</a><br>
<a href="java script:CheckMyBox('v1', false, 'test')">Uncheck All</a>
</body>
</html>


asp siden:

<%@LANGUAGE="JAVASCRIPT" CODEPAGE="1252"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Untitled Document</title>
</head>

<body>
<%
var v1 = Request.Form("v1")
Response.write(v1);


var i

if(v1){
var temp = new Array();
temp = v1.split(',');

for (i in temp)
{
Response.write(temp[i] + "<br />")
}
}
else
{
Response.write("No form content");
}
%>
</body>
</html>
Avatar billede erikjacobsen Ekspert
18. juli 2007 - 16:14 #11
Ok, et lille hack

  var v1 = "" + Request.Form("v1")

Så laver du den til en streng.
Avatar billede olebole Juniormester
18. juli 2007 - 16:15 #12
<ole>

mclemens >> "for(i in arrayname) fungerer ikke altid så godt med array af
elementer m.v., men fungerer godt med object indeholdende elementer."

- den må du lige forklare/eksemplificere  =)

Bortset fra det, er en for/in-løkke altid væsentligt langsommere end en alm. for-løkke i JS og PHP ... og jeg formoder, det også gør sig gældende i VB(S), selvom jeg ikke selv har testet. Men de fungerer - bortset fra hastigheden - lige godt  ;o)

/mvh
</bole>
Avatar billede erikjacobsen Ekspert
18. juli 2007 - 16:17 #13
Og lav testen som

    if(v1!="undefined"){
Avatar billede erikjacobsen Ekspert
18. juli 2007 - 16:18 #14
(ja, ok, det egentlig testes på en anden måde...men hacks er så sjove)

Ole da, har du tid til det her - du skulle lægge noget kode op, ik'?
Avatar billede olebole Juniormester
18. juli 2007 - 16:19 #15
Erik >> undefined er et keyword, så det bør vel blot være:
    if(v1!=undefined){
Avatar billede olebole Juniormester
18. juli 2007 - 16:21 #16
Erik >> jeg er jo en sprød, ung mand - på nippet til at flække af ubrugt energi - så det er gjort forlængst  ;o)
Avatar billede erikjacobsen Ekspert
18. juli 2007 - 16:36 #17
Jeg har jo lavet det til en streng, Ole.

Men man kan da ikke se noget på forsiden af http://dengodekode.dk/ - kan man? Eller er jeg moden til at komme alderdomshjem...
Avatar billede mclemens Nybegynder
18. juli 2007 - 17:28 #18
Beklager de 3 tidligere indlæg, jeg ved ikke
noget om asp, men troede det kun var om javascript...

...

>> Olebole "- den må du lige forklare/eksemplificere  =)"
Jeg ville ønske jeg kunne forklare, men tag et kig på
nedenstående gennemløb af v1 arrayet af elementer.
(Jeg ved ikke helt, hvorfor de gør som de gør - IE vs. FF,
og det er egentlig en ting, der altid har undret mig. )


<html><body>
<form><input name="v1" type="checkbox" value="d1">
<input name="v1" type="checkbox" value="d2"></form>

<script type="text/javascript">
var v1 = document.getElementsByName("v1");

document.write("for(i=0;i&lt;v1.length;i++)document.write(v1[i].value + \"&lt;br&gt;\")<br>");
for(i=0;i<v1.length;i++)document.write(v1[i].value + "<br>");

document.write("<br><br><br>");

document.write("for(i in v1)document.write(v1[i].value + \"&lt;br&gt;\")<br>");
for(i in v1)document.write(v1[i].value + "<br>");

document.write("<br><br><br>");

document.write("for(i in v1)document.write(v1[i] + \"&lt;br&gt;\")<br>");
for(i in v1)document.write(v1[i] + "<br>");
</script>
</body></html>



... mens hvis vi lige kaster du over i et
object så kører gennemløbningen noget bedre.

<html><body>
<form><input name="v1" type="checkbox" value="d1">
<input name="v1" type="checkbox" value="d2"></form>

<script type="text/javascript">
var v1 = document.getElementsByName("v1");

v2={};
for(i=0;i<v1.length;i++)v2[i]=v1[i];

document.write("for(i=0;i&lt;v2.length;i++)document.write(v2[i].value + \"&lt;br&gt;\")<br>");
for(i=0;v2[i];i++)document.write(v2[i].value + "<br>");

document.write("<br><br><br>");

document.write("for(i in v2)document.write(v2[i].value + \"&lt;br&gt;\")<br>");
for(i in v2)document.write(v2[i].value +"<br>");

document.write("<br><br><br>");

document.write("for(i in v2)document.write(v2[i] + \"&lt;br&gt;\")<br>");
for(i in v2)document.write(v2[i] + "<br>");
</script>
</body></html>
Avatar billede mclemens Nybegynder
18. juli 2007 - 17:31 #19
"mens hvis vi lige kaster du over"
-> "mens hvis vi lige kaster dem over"
Avatar billede olebole Juniormester
19. juli 2007 - 11:54 #20
Erik >> "Jeg har jo lavet det til en streng, Ole."
- jamen, det havde du da også ... sorry  ;o)

mclemens >> ahhhh ... nu forstår jeg  ;o)

Begge dele burde fejle. En NODELIST (som er det, getElementsByName burde returnere) er nemlig hverken et array eller et object (object Object, altså) - men en collection. Du bør bruge NODELIST-metoden item til at hente de enkelte elementer:
    var oElm = v1.item(0);

Begge fremgangsmåder - altså det at bruge en for- eller for/in-løkke - stammer fra version 4 browsernes lettere rodede begreber (collections, der samtidig var arrays). Hvis standarden ellers blev overholdt af såvel browsere som kodere, burde begge fremgangsmåder dog fejle med et brag.

Som sædvanligt er der væsentligt bedre mening i at skælde ud på os kodere end på browserne. De fleste browsere er _dramatisk_ bedre til at overholde standarderne end de fleste kodere ... omend det sjældent er at spore i vores selvforståelse. NODELIST med metoden item blev således indført i W3C's DOM Level 1 i 1999!  ;o)
Avatar billede mclemens Nybegynder
19. juli 2007 - 12:10 #21
Tak for forklaringen Ole,
nu forstår jeg det bedre :o)
Avatar billede olebole Juniormester
19. juli 2007 - 12:31 #22
Selvtak ... men min egen kodestil afspejler faktisk sjældent dette forhold. Jeg må indrømme at jeg ofte itererer gennem en nodelist, somom den var et tal-indekseret array  :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester