Avatar billede aspbegynder Nybegynder
13. maj 2002 - 20:38 Der er 21 kommentarer og
2 løsninger

Et dropdown problembarn

Hej

Jeg har et stort problembarn, hvilket er en dropdown-menu, som ikke gider at få stoppet nogle array-elementer ind i sig.

FEJL:
'document.IndsaetArtikel.Emne' is null or not an object

SPECIFIK KODEUDSNIT (SOM GIVER FEJLEN):

for (var i = 1;i < gruppe[3].length; i++) {
      document.IndsaetArtikel.emne.options[i].text = gruppe[3][1].emne;
      document.IndsaetArtikel.emne.options[i].value = gruppe[3][1].emnenr;
      document.OpdaterArtikel.mig.length = i;
    }

HELE DEN RELEVANTE KODE:
<html>

<head>
<meta http-equiv="Content-Language" content="da">
<meta name="GENERATOR" content="Microsoft FrontPage 5.0">
<meta name="ProgId" content="FrontPage.Editor.Document">
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
<title></title>

<script>

var gruppe = new Array();
gruppe[1] = new Array();
gruppe[2] = new Array();
gruppe[3] = new Array();

function artikel(titel, forfatter, beskrivelse, filnavn, sektion, emne) {
  this.titel= titel;
  this.forfatter= forfatter;
  this.beskrivelse= beskrivelse;
  this.filnavn= filnavn;
  this.sektion= sektion;
  this.sektion= emne;
}

function sektion(sektionnr, sektion) {
  this.sektionnr= sektionnr;
  this.sektion= sektion;
}

function emne(emnenr, emne) {
  this.emnenr= emnenr;
  this.emne= emne;
}

</script>

<!--#include file ="../database/databaseConn.asp"-->
<%
strSQL = "select * from ARTIKLER"
set rs = Conn.execute(strSql)
i = 1
response.write "<script>"
while not rs.EOF or rs.BOF
  response.write "gruppe[1][" & i & "]=new artikel(""" & rs("titel") & """,""" & rs("forfatter") & """, """ & rs("beskrivelse") & """, """ & rs("filnavn") & """, """ & rs("filnavn") & """, """ & rs("emne") & """);"
  i = i + 1
  rs.MoveNext
wend

strSQL = "select * from SEKTIONER"
set rs = Conn.execute(strSql)
i = 1
while not rs.EOF or rs.BOF
  response.write "gruppe[2][" & i & "]=new sektion(""" & rs("sektionnr") & """,""" & rs("sektion") & """);"
  i = i + 1
  rs.MoveNext
wend

strSQL = "select * from EMNER"
set rs = Conn.execute(strSql)
i = 1
while not rs.EOF or rs.BOF
  response.write "gruppe[3][" & i & "]=new emne(""" & rs("emnenr") & """,""" & rs("emne") & """);"
  i = i + 1
  rs.MoveNext
wend

%>
</script>
<script> 

function opdater() {
      var gNum = document.OpdaterArtikel.gruppe.options.selectedIndex+1;
      var forfatter = gruppe[1][gNum].forfatter;
      document.OpdaterArtikel.forfatter.value = forfatter;
     
      var beskrivelse = gruppe[1][gNum].beskrivelse;
      document.OpdaterArtikel.beskrivelse.value = beskrivelse;
             
      var filnavn = gruppe[1][gNum].filnavn;
      document.OpdaterArtikel.filnavn.value = filnavn;
     
      var sektion = gruppe[1][gNum].sektion;
      document.OpdaterArtikel.sektion.options.selectedIndex = gNum;   
}
 

for (var i = 1;i < gruppe[3].length; i++) {
      document.IndsaetArtikel.emne.options[i].text = gruppe[3][1].emne;
      document.IndsaetArtikel.emne.options[i].value = gruppe[3][1].emnenr;
      document.OpdaterArtikel.mig.length = i;
    }

</script>

</head>

<body>
.
.
.
Avatar billede aspbegynder Nybegynder
13. maj 2002 - 20:43 #1
UPS - der skulle ikke have stået "gruppe[3][1].emne;". Der skulle i stedet have stået "gruppe[3][i].emne;" ved alle 3 linier i kodeudsnittet (samt i slutningen af hele koden), men fejlen kommer stadig.
Avatar billede mikoalngelo Nybegynder
13. maj 2002 - 21:01 #2
Jeg kan desværre ikke forstå bare HALVDELEN af hvad det er den kode gør, men jeg vil gerne lige vide:
Hvad gør response.write ?
Avatar billede jakoba Nybegynder
13. maj 2002 - 21:23 #3
mon ikke det kommer af at du kører den scriptkode idet head indlæses, før din form er blevet oprettet i dokumentets objekt model.
    Det bør snarere gøres som en initieringsfunktion på onload.

i din for løkke skal du oprette nogen options at lægge de der værdier i.

for (var i = 1;i < gruppe[3].length; i++) {
      document.IndssetArtikel.emne.options[i] = new Option( gruppe[3][1].emne, gruppe[3][1].emnenr );
      document.OpdaterArtikel.mig.length = i;
    }

Jeg forstår ikke den der
    document.OpdaterArtikel.mig.length
du opdaterer?

mvh JakobA
Avatar billede aspbegynder Nybegynder
14. maj 2002 - 16:46 #4
>>> jakoba

Sådan, så er koden rettet til:

.
.
.
<head>
function IndlaesMenu() {

    for (var i = 1;i < gruppe[3].length; i++) {
          document.IndsaetArtikel.emne.options[i] = new Option( gruppe[3][i].emne, gruppe[3][i].emnenr );
          document.IndsaetArtikel.emne.length = i;
    }
}
.
.
.
</head>
<body>
.
.
.
<select size="1" name="emne" onLoad="IndlaesMenu();"></select>
.
.
.

Med "onLoad" virker det ikke, men hvis jeg tager en anden f.eks. "onMouseover" så virker det. Hvorfor virker "onLoad" ikke? (Hvad kan jeg evt. bruge i stedet?)

>...i din for løkke skal du oprette nogen options at lægge de der værdier i.
Jeg er ikke klar over, om jeg har gjordt dette, men sig til, hvis det er vigtigt.
Avatar billede jakoba Nybegynder
14. maj 2002 - 17:06 #5
nu hvor du har retttet er det klart at det er længden på option listen du ønsker at opdatere med linien:
          document.IndsaetArtikel.emne.length = i;
og det er HELT galt.

1) fordi længden automatisk opdateres når du tilføjer en ny option foenden. du behøver ikke opdatere length.
2) det første element har nummer 0.  efter indsættelsen af første element siger du så
    ...length = 0;
det vil afkorte options-arrayet så det kommer til at indeholde 0 elementer, og det var jo ikke lige meningen. Ditto med de andre du indsætter. den linie sletter dem igen umiddelbart efter de er indsat.

du kan evt skrive linien EFTER forløkken, så vil den klippe overskydende elementer af hvis den select du bygger om i startede med at have flere elementer end den skal have nu.

mvh JakobA
Avatar billede jakoba Nybegynder
14. maj 2002 - 17:08 #6
altså:

function IndlaesMenu() {

    for (var i = 1;i < gruppe[3].length; i++) {
          document.IndsaetArtikel.emne.options[i] = new Option( gruppe[3][i].emne, gruppe[3][i].emnenr );
    }
    document.IndsaetArtikel.emne.length = i;
}
Avatar billede aspbegynder Nybegynder
14. maj 2002 - 18:42 #7
Den nye kode indlæser fint alle elementerne fra array'en og indsætter dem også korrekt i dropdown-menu - men kun hvis jeg anvender "onMouseover" (eller lignende). Den foreslåede "onLoad" virker ikke - intet bliver indlæst i menuen.

Hvorfor ikke?

<select size="1" name="emne" onLoad="IndlaesMenu();">
Avatar billede mikoalngelo Nybegynder
14. maj 2002 - 18:44 #8
Prøv at indsætte den i <BODY> taggen...
Avatar billede aspbegynder Nybegynder
14. maj 2002 - 18:47 #9
mikoalngelo >>

Tænker du på "<select...." eller "function IndlaesMenu()"?
Avatar billede mikoalngelo Nybegynder
14. maj 2002 - 18:53 #10
Indsæt onLoad="IndlaesMenu();" i <BODY> tagget...
Avatar billede aspbegynder Nybegynder
14. maj 2002 - 19:00 #11
Det virker - mange tak for hjælpen! :-)

mikoalngelo >> Hvis du vil have nogle points, så tryk lige 'Svar'.
Avatar billede mikoalngelo Nybegynder
14. maj 2002 - 19:03 #12
Selv tak...
Avatar billede mikoalngelo Nybegynder
14. maj 2002 - 19:32 #13
Svarer du for resten snart på mit spørgsmål om response.write?
Avatar billede aspbegynder Nybegynder
14. maj 2002 - 19:37 #14
mikoalngelo >>

Det er en måde, hvorpå man kan bruge VBScript og JavaScript sammen. Det som skrives inde i response.write "....", køres samtidigt med at man er i et VB-forløb... men det ved jakoba 100 gange mere om end jeg gør.
Avatar billede mikoalngelo Nybegynder
14. maj 2002 - 19:39 #15
Okay, tak for det...
Avatar billede aspbegynder Nybegynder
14. maj 2002 - 19:49 #16
Forresten....

Jeg undrer mig over, at det første menu-punkt er tomt, da databasen, arrayen eller menuen i forvejen ikke indeholder et tomt element. Kan du/I ser hvorfor?

function IndlaesMenu() {

    for (var i = 1;i < gruppe[3].length; i++) {
          document.IndsaetArtikel.emne.options[i] = new Option( gruppe[3][i].emne, gruppe[3][i].emnenr );
    }
}
Avatar billede jakoba Nybegynder
14. maj 2002 - 19:56 #17
alle arrays i javascript starter fra 0. prøv evt at skrive om til:
    for (var i = 0;i < gruppe[3].length-1; i++) {
Avatar billede mikoalngelo Nybegynder
14. maj 2002 - 19:56 #18
Formentlig fordi at det første nummer i et array som regel er nul, mens i FØRSTE gang er 1...

Men jeg ved det ikke med sikkerhed, da jeg ikke ved særlig meget om den der slags kode...
Avatar billede jakoba Nybegynder
14. maj 2002 - 19:58 #19
Ups nej.

function IndlaesMenu() {

    for (var i = 1;i < gruppe[3].length; i++) {
          document.IndsaetArtikel.emne.options[i-1] = new Option( gruppe[3][i].emne, gruppe[3][i].emnenr );
    }
}

så lægger du også en option i celle nr 0.
Avatar billede aspbegynder Nybegynder
14. maj 2002 - 20:00 #20
Ja, den virkede bedre - igen mange tak for hjælpen! :-)
Avatar billede mikoalngelo Nybegynder
14. maj 2002 - 20:34 #21
Selv tak -- IGEN......
Avatar billede mikoalngelo Nybegynder
14. maj 2002 - 20:36 #22
For resten, kan du ikke lige lave et link til den side du bruger koden på, for nu er jeg jo blevet nysgerrig... ;)
Avatar billede aspbegynder Nybegynder
14. maj 2002 - 20:44 #23
... men den er ikke online og bliver det heller ikke det første lange stykke tid - ud over det er den (når den er færdigudviklet) en admin-side, hvortil kun få personer skal have tilgang.

Men kopier mit allerøverste kode ind i en asp-side, hvor du kobler nogle relevante "tryk-sager" på - håber at det hjælper.
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