Avatar billede haunted Nybegynder
10. februar 2003 - 09:51 Der er 18 kommentarer og
2 løsninger

Javascript fejl...

Hej med jer...

Når jeg prøver at køre et script jeg har lavet får jeg fejlen:

"Et objekt er obligatorisk."

Hvad skyldes dette?

JS scriptet ser således ud:

function makeTable() {
  var xmlDoc = new ActiveXObject("Microsoft.XMLDOM")
  xmlDoc.async="false"
  xmlDoc.load("menu.xml")

  var root = xmlDoc.getElementsByTagName('menupunkt')

  for (i=0; i <= root.length; i++) {
    document.write("<tr><td class=\"Menu\" vAlign=\"top\" noWrap width=\"100%\">" + root[i].childNodes[2].firstChild.nodeValue + "</td></tr>")
  }
}

min XML fil ser således ud:

<?xml version="1.0" encoding="ISO-8859-1"?>

<menu-configuration>
 
  <menupunkt>
    <menuId>1</menuId>
    <navn>Hjem</navn>
    <link>../hovedside/hovedside.htm</link>
    <frame>2</frame>
  </menupunkt>
 
  <menupunkt>
    <menuId>2</menuId>
    <navn>Referater</navn>
    <link>../referat/referat.htm</link>
    <frame>1</frame> 
  </menupunkt>
</menu-configuration>

Kaldet fra html siden ser således ud:

<!DOCTYPE html PUBLIC "-//W3C//Dtd html 4.0 transitional//EN">
<html>
<head>
  <title>menu</title>
  <script language="javascript" src="Menu.js"></script>
</head>

<body>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
  <tr>
    <td class="Menu" vAlign="top" width="100%">
      <script type="text/javascript">document.write(makeTable());</script>
    </td>
  </tr>
</table>
</body>
</html>
Avatar billede pelkjaer Nybegynder
10. februar 2003 - 09:58 #1
for (i=0; i <(root.length);i++) {
Avatar billede ocp Nybegynder
10. februar 2003 - 10:02 #2
Eller:

for (var i=0; i <(root.length);i++) {
Avatar billede haunted Nybegynder
10. februar 2003 - 10:04 #3
Det fjernede fejlen delvist... Nu bliver der udskrevet en forkomst først hvori der står
UNDEFINED
../referat/menu.htm
../holdning/holdning.htm
Avatar billede pelkjaer Nybegynder
10. februar 2003 - 10:08 #4
Jeg får

<tr><td class="Menu" vAlign="top" noWrap width="100%">../hovedside/hovedside.htm</td></tr><tr><td class="Menu" vAlign="top" noWrap width="100%">../referat/referat.htm</td></tr>
Avatar billede pelkjaer Nybegynder
10. februar 2003 - 10:08 #5
(kildekode)
Avatar billede pelkjaer Nybegynder
10. februar 2003 - 10:10 #6
sludder :)
Avatar billede haunted Nybegynder
10. februar 2003 - 10:31 #7
<!DOCTYPE html PUBLIC "-//W3C//Dtd html 4.0 transitional//EN">
<html>
<head>
  <title>Hovedmenu</title>
  <meta http-equiv=Content-Type content="text/html; charset=windows-1252">
  <meta http-equiv=Content-style-Type content=text/css>
  <link href="defsMenu.css" type=text/css rel=stylesheet>
  <script language="javascript" src="Menu.js"></script>
</head>

<body>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
  <tr>
    <td class="Menu" vAlign="top" width="100%">
      <script type="text/javascript">document.write(makeTable());</script>
    </td>
  </tr>
</table>
</body>
</html>

Dette er hvad der står i kildekoden når jeg tager denne...
Avatar billede ocp Nybegynder
10. februar 2003 - 11:09 #8
Hvor er makeTable-funktionen?
Avatar billede haunted Nybegynder
10. februar 2003 - 11:12 #9
Ligger i Menu.js som er vist øverst i spørgsmålet.
Avatar billede haunted Nybegynder
10. februar 2003 - 11:14 #10
i for løkken har jeg prøvet at skrive følgende:

for (i=0; i <= root.length; i++) {
    document.write(i);
    document.write("<tr><td class=\"Menu\" vAlign=\"top\" noWrap width=\"100%\">" + root[i].childNodes[2].firstChild.nodeValue + "</td></tr>")
  }

Dette gav følgende resultat hvis der er nogle der er interesserede!?
1
2
undefined
../referat/menu.htm
../hovedside/hovedside.htm
Avatar billede atoft Nybegynder
10. februar 2003 - 11:34 #11
Ved at bruge childNodes bliver din kode stort set ulæselig, og samtidig bliver du afhænging af rækker følgen af dine elementer.

Anvend i stedet selectNodes og selectSingleNode, det vil gøre din kode mere vedligeholdelses venlig.

Prøv at kigge på msdn.microsoft.com/xml.

/atoft
Avatar billede haunted Nybegynder
10. februar 2003 - 13:17 #12
Jeg har nu lavet den om til selectNodes...men får samme resultat:

Output:

1 Hjem hovedside/hovedside.htm 2
2 Referater referat/menu.htm 1
3 Hjem hovedside/hovedside.htm 2
undefined 

Ny funktion:

function makeTable() {
  var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
  xmlDoc.async = "false";
  xmlDoc.load("test.xml");

  var objNodeList = xmlDoc.selectNodes("//menupunkt");

  for (var i=0;i<(objNodeList.length);i++) {
    document.write("<tr><td>" + objNodeList.item(i).text + "</td></tr>");
  }
}
Avatar billede atoft Nybegynder
10. februar 2003 - 13:20 #13
Hvor mange menupunkter har du i din xml?
Avatar billede atoft Nybegynder
10. februar 2003 - 13:24 #14
du kan også med fordel ændre:

document.write("<tr><td>" + objNodeList.item(i).text + "</td></tr>");
til

document.write("<tr><td>" + objNodeList.item(i).selectSingleNode("navn").text + "</td></tr>");
Avatar billede haunted Nybegynder
10. februar 2003 - 14:00 #15
Har hermed ændret det til:

document.write("<tr><td>" + objNodeList.item(i).selectSingleNode("link").text  + "</td></tr>");

og dette hjalp ikke noget på mit problem andet end koden er blevet lidt
pænere...

Indtil videre har jeg kun 3 punkter i min XML fil:

<menu-configuration>
  <menupunkt>
    <menuId>1</menuId>
    <navn>Hjem</navn>
    <link>../hovedside/hovedside.htm</link>
    <frame>2</frame>
  </menupunkt>
  <menupunkt>
    <menuId>2</menuId>
    <navn>Referater</navn>
    <link>../referat/menu.htm</link>
    <frame>1</frame> 
  </menupunkt>
  <menupunkt>
    <menuId>3</menuId>
    <navn>Hjem</navn>
    <link>../hovedside/hovedside.htm</link>
    <frame>2</frame>
  </menupunkt>
</menu-configuration>
Avatar billede atoft Nybegynder
10. februar 2003 - 14:03 #16
Der ser ud som om din i tæller kører en tur for meget.

Den skal jo kun køre 3 gange.

du har ændret var ændret til "<" mindre end istedet for "<=" ikke?
Avatar billede haunted Nybegynder
10. februar 2003 - 14:07 #17
Jeg tror også det har noget med det at gøre...

når jeg ændrer fra:
for (var i=0;i<(objNodeList.length);i++) {
til
for (var i=0;i<=(objNodeList.length);i++) {
kommer det rigtigt ud, men så kommer der en scriptfejl og siger:

"'item(...)' er null, eller ikke et objekt."
Avatar billede atoft Nybegynder
10. februar 2003 - 14:11 #18
det skal være

for (var i=0;i<(objNodeList.length);i++)

ellers kører den engang for meget.

Virker det ikke?
Avatar billede atoft Nybegynder
10. februar 2003 - 14:22 #19
Nu har jeg den. Skal skal jo ikke lave en document.write, hvor du kalder funktionen.

<tr>
    <td class="Menu" vAlign="top" width="100%">
      <script type="text/javascript">document.write(makeTable());</script>
    </td>
</tr>

det skal selvfølgelig bare være:

<tr>
    <td class="Menu" vAlign="top" width="100%">
      <script type="text/javascript">makeTable();</script>
    </td>
</tr>
Avatar billede haunted Nybegynder
10. februar 2003 - 14:25 #20
Skidehamrende godt det virker sgu'

Mange tak for hjælpen...
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