[JS] Hoe resultaat van XMLHTTPRequest verwerken

Pagina: 1
Acties:

  • Woudloper
  • Registratie: November 2001
  • Niet online

Woudloper

« - _ - »

Topicstarter
Aangezien ik nog niet eerder met XMLHTTPRequest aan de gang ben geweest, is dit een geheel nieuw terrein voor mij waar ik nog niet in zijn geheel uitkom.

Op de server wordt de volgende XML gegenereerd met daarin alle beschikbare pagina's op de server met daarbij diverse kenmerken die van belang kunnen/moeten zijn aan de client side.
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<page_list>
    <page id="1">
        <name>Welkom</name>
        <type>Content</type>
        <hierarchy>1</hierarchy>
        <active>True</active>
        <owner>1</owner>
    </page>
    <page id="3">
        <name>Contact Us</name>
        <type>Content</type>
        <hierarchy>1.1</hierarchy>
        <active>True</active>
        <owner>1</owner>
    </page>
</page_list>


Vervolgens wordt deze XML opgehaald met XMLHTTPRequest met behulp van de volgende functie (welke ik op deze site heb gevonden):

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function loadXMLDoc(url) 
{
    // branch for native XMLHttpRequest object
    if (window.XMLHttpRequest) {
        req = new XMLHttpRequest();
        req.onreadystatechange = processReqChange;
        req.open("GET", url, true);
        req.send(null);
    // branch for IE/Windows ActiveX version
    } else if (window.ActiveXObject) {
        req = new ActiveXObject("Microsoft.XMLHTTP");
        if (req) {
            req.onreadystatechange = processReqChange;
            req.open("GET", url, true);
            req.send();
        }
    }
}


Nadat het resultaat is opgehaald wordt vervolgens het resultaat met onderstaande functie verwerkt:

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
function processReqChange() 
{
    // Ga alleen verder wanneer de readyState "complete" is
    if (req.readyState == 4) {
        // Alleen verder wanneer de status ook daadwerkelijk "OK" is
        alert('Readystate is OK');
        
        if (req.status == 200) {
            alert('Requeststate is 200');

            // Verwerking van het ontvangen XML document
            
            response  = req.responseXML;

            page_list = response.getElementByTagName('page_list');
                        
            page_id = response.getElementsByTagName('page');

            // Haal info op en stop deze in een array
            for(i=0; i<page_id.length; i++){
                id = page_id[i].getAttribute('id')
    
                name = page_id[i].getElementByTagName('name').firstChild.data;
                version = page_id[i].getElementByTagName('hierarchy').firstChild.data;
                
                alert('naam : ' + name + '\n' + 'Hierarchy: ' + version);
            }

        } else {
            alert("There was a problem retrieving the XML data:\n" + req.statusText);
        }
    }
}


Echter zoals je kan zien staan er de nodige alerts tussen aangezien ik wat aan het debuggen was. Ik krijg het niet voor elkaar om lijst op te halen en van de verschillende pagina's informatie toe te voegen aan een array. Ik kan bijvoorbeeld nog wel een alert opvragen van het 'response', maar wanneer ik verder ga met 'page_list = response.getElementByTagName('page_list');' gebeurt er niets meer. Iemand een suggestie wat ik fout aan het doen ben!?

[ Voor 17% gewijzigd door Woudloper op 19-08-2005 10:42 ]


  • BtM909
  • Registratie: Juni 2000
  • Niet online

BtM909

Watch out Guys...

Mis je geen s in:

page_list = response.getElementsByTagName('page_list'); ?

[ Voor 17% gewijzigd door BtM909 op 19-08-2005 10:52 ]

Ace of Base vs Charli XCX - All That She Boom Claps (RMT) | Clean Bandit vs Galantis - I'd Rather Be You (RMT)
You've moved up on my notch-list. You have 1 notch
I have a black belt in Kung Flu.


Verwijderd

page_list = response.getElementByTagName('page_list');

daar mist een "s"

voor de rest lijkt er zo als ik vlug kijk niks mis mee. responseXML bevat idd een document object normaliter.

voor naslagwerk wellicht nog handig: http://www.devguru.com/technologies/xml_dom/home.asp

edit:
blast BtM ;)

[ Voor 9% gewijzigd door Verwijderd op 19-08-2005 10:54 ]


  • Woudloper
  • Registratie: November 2001
  • Niet online

Woudloper

« - _ - »

Topicstarter
Bedankt voor de reply's, maar ik ben er nog niet helemaal uit. Op advies van BtM909 nog maar even een voorbeeldje gemaakt, welke hier te vinden is.

Om de één of andere reden lijkt het fout te gaan binnen de for lus. Zodat ik tracht iets op te vragen met de page_id[i] gaat het fout. Iemand nog een suggestie.

Nog bedankt voor de reference, van BtM909 kreeg ik ook nog de volgende: http://www.mozilla.org/docs/dom/domref/

[ Voor 4% gewijzigd door Woudloper op 18-09-2005 22:43 ]


Verwijderd

firstChild.data -> firstChild.nodeValue?

naar mijn weten bestaat er geen data property van een node object.

  • Amras
  • Registratie: Januari 2003
  • Laatst online: 01-10-2025
Volgens mij heeft een NodeList geen firstChild property en gaat het daar fout. De aanroep getElementsByTagName('name') geeft een NodeList terug en geen Element. Zo zou het, volgens mij, wel moeten werken:

JavaScript:
1
alert(page_id[i].getElementsByTagName('name')[0].firstChild.nodeType);

  • Woudloper
  • Registratie: November 2001
  • Niet online

Woudloper

« - _ - »

Topicstarter
Amras schreef op vrijdag 19 augustus 2005 @ 12:03:
Volgens mij heeft een NodeList geen firstChild property en gaat het daar fout. De aanroep getElementsByTagName('name') geeft een NodeList terug en geen Element. Zo zou het, volgens mij, wel moeten werken:

JavaScript:
1
alert(page_id[i].getElementsByTagName('name')[0].firstChild.nodeType);
Ja, dat was het! Ik had dus te maken met een nodelist en geen element. Zo had ik er nog niet naar gekeken. Bovenstaande alert geeft nu wel een gewenst resultaat.
Verwijderd schreef op vrijdag 19 augustus 2005 @ 11:57:
firstChild.data -> firstChild.nodeValue?

naar mijn weten bestaat er geen data property van een node object.
data en nodeValue geven in dit geval beiden hetzelfde resultaat, dus het schijnt wel te werken...

  • Woudloper
  • Registratie: November 2001
  • Niet online

Woudloper

« - _ - »

Topicstarter
Nog even een vraag aangezien ik er nog niet helemaal uitkom. Alles lijkt nu goed te werken, maar om de één of andere reden gaat hij niet goed om met de XML Elementen die leeg zijn.

Zoals te zien is in het online voorbeeld geeft hij geen alerts in de for lus wanneer de eerste page een lege 'name' element heeft. Iemand nog een suggestie hoe ik hieromheen moet komen?

[ Voor 5% gewijzigd door Woudloper op 18-09-2005 22:44 ]


  • BtM909
  • Registratie: Juni 2000
  • Niet online

BtM909

Watch out Guys...

Als ik tijdelijk voor name dit gebruik:

JavaScript:
1
name = page_id[i].getElementsByTagName('name')[0].firstChild;

Dan zie je dat je eerste node NULL retourneert (had eerlijk gezegd een leeg object verwacht, maar ok).

De kan is dus groot dat je een extra check moet inbouwen of je firstChild niet NULL retourneert :)

[ Voor 25% gewijzigd door BtM909 op 19-08-2005 13:51 ]

Ace of Base vs Charli XCX - All That She Boom Claps (RMT) | Clean Bandit vs Galantis - I'd Rather Be You (RMT)
You've moved up on my notch-list. You have 1 notch
I have a black belt in Kung Flu.

Pagina: 1