[ajax] onreadystatechange stop process

Pagina: 1
Acties:

Onderwerpen


Verwijderd

Topicstarter
Ik ben een script aan het bouwen waarmee ik een xml bestand ophaalt vanaf de server. Nu werkte dit script vorige week prima, maar na wat wijzigingen niet meer. nu heb ik het bestand hersteld naar de werkende versie, zij het dat ik nog steeds dezelfde fout krijg.

De onreadystatechange blijft hangen op 0, als ik deze na het send(NULL) argument plaats krijg ik wel een 1 maar verder dan dat komt hij niet.

IE geeft als fout aan dat "de typen niet overeen komen" maar hier kom ik niet veel verder mee.

code:
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
34
35
36
37
38
39
40
41
42
43
44
45
46
function createXMLHttpRequest()
    {
        if(window.ActiveXObject)
            {
            xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
            }
        else if(window.XMLHttpRequest)
            {
            xmlHttp = new XMLHttpRequest(); 
            }
    }

function fetchData()
    {
    var URL = "./script/rr.php?supid=" + document.getElementById('supidselected').value + "&timestamp="+ document.getElementById('version_checked').value;
    createXMLHttpRequest();
    xmlHttp.onreadystatechange = handleStateChange();
    xmlHttp.open("GET", URL, true);
    xmlHttp.send(null);
    }


function handleStateChange() 
    {
    document.getElementById('testDisplay').value = xmlHttp.readyState;
    if(xmlHttp.readyState == 4)
        {
            if (xmlHttp.status == 200)
            {
            if(xmlHttp.responseText.length > 1 )
                {
                document.getElementById('light').src = './img/light_green.png'; //indicates loading done
                handleXML();
                }

            }
        else if (xmlHttp.status == 404)
            {
            alert("Page not loaded\n ERROR: 404");  
            }
        }
    else
        {
        document.getElementById('light').src = './img/light_red.png'; //loading started
        }
    }

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Verwijderd schreef op donderdag 11 februari 2010 @ 14:36:

IE geeft als fout aan dat "de typen niet overeen komen" maar hier kom ik niet veel verder mee.
Daarom zijn er tools als Firebug (of IE equivalenten daarvan). Heb je al gedebugged? Debuggen: Hoe doe ik dat?
En zo ja: wat kwam daar uit? Krijg je uberhaupt een (geldige) response van de server?

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Verwijderd

Topicstarter
Ik krijg geen nuttige informatie terug. Onder FF helemaal niets en onder IE 8 alleen "de typen niet overeen komen" zoals boven vermeld.

Ik krijg deze fout op:
JavaScript:
17
xmlHttp.onreadystatechange = handleStateChange(); 

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Verwijderd schreef op donderdag 11 februari 2010 @ 14:42:
Ik krijg geen nuttige informatie terug. Onder FF helemaal niets en onder IE 8 alleen "de typen niet overeen komen" zoals boven vermeld.

Ik krijg deze fout op:
JavaScript:
17
xmlHttp.onreadystatechange = handleStateChange(); 
Dat is geen debuggen. Kijk dan eens wat je terug krijgt als je de URL "http://jedomein.nl/script/rr.php?supid=xyz" in je browser mikkert ofzo. Ga stap voor stap na wat er gebeurt en kijk of elke stap uitgevoerd wordt zoals je verwacht. Zo nee, kijk dan wat er mis gaat.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • B0rf
  • Registratie: Oktober 2008
  • Laatst online: 03-10-2024
Je moet de haakjes achter handleStateChange weghalen op regel 17, je probeert nu het resultaat van die functie te assignen aan de handleStateChange, maar je moet de functie assignen aan de handleStateChange

Verwijderd

Topicstarter
B0rf schreef op donderdag 11 februari 2010 @ 14:46:
Je moet de haakjes achter handleStateChange weghalen op regel 17, je probeert nu het resultaat van die functie te assignen aan de handleStateChange, maar je moet de functie assignen aan de handleStateChange
Was al bang dat het zo iets simpels was >:)

Thanks

  • burrug
  • Registratie: April 2005
  • Laatst online: 14-10-2024
En als je dit doet, wat is dan je output?;
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
function handleStateChange()  
    { 
    document.getElementById('testDisplay').value = xmlHttp.responseText; 
    if(xmlHttp.readyState == 4) 
        { 
            if (xmlHttp.status == 200) 
            { 
            if(xmlHttp.responseText.length > 1 ) 
                { 
                document.getElementById('light').src = './img/light_green.png'; //indicates loading done 
                handleXML(); 
                } 

            } 
        else if (xmlHttp.status == 404) 
            { 
            alert("Page not loaded\n ERROR: 404");     
            } 
        } 
    else 
        { 
        document.getElementById('light').src = './img/light_red.png'; //loading started 
        } 
    }

Tannoy Revolution R3 105W 6ohm, Marantz PM-7003 2x70W 8ohm, 2x JVG goud/goud, Marantz CD-6003, Marantz ST-6003


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
De bug was dus veroorzaakt door de () achter de xmlHttp.onreadystatechange = handleStateChange.

Ik heb echter wel weer een nieuwe bug.

Ik probeer de onderstaande XML uit te lezen:

XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?xml version="1.0" encoding="utf-8"?>
    <XmlPage>
        <timestamp>20100212130127</timestamp>
        
        <holder>
    <row>1</row>
    <cell>1</cell>
    <locked>0</locked>
    <rowdata>
<![CDATA[Overzeas]]>
    </rowdata>
</holder><holder>
    <row>1</row>
    <cell>2</cell>
    <locked>0</locked>
    <rowdata>
<![CDATA[BOOSTah]]>
    </rowdata>
</holder>
</XmlPage>


In Firefox werkt dit naar behoren maar in IE krijg ik de CDATA van rowdata niet uitgelezen.
JavaScript:
1
2
3
4
5
6
7
8
if(isIE == true)
            {
            var content = tree.getElementsByTagName('rowdata')[0].innerText;
            }
        else
            {
            var content = tree.getElementsByTagName('rowdata')[0].textContent;
            }


Lees IE de XML anders uit zodat de DOM positie anders is?
Bij IE krijg ik alleen een 'undefined'

De andere elementen uit de XML kan ik gewoon uitlezen. Deze roep ik zo aan:
JavaScript:
1
2
var rowId = tree.getElementsByTagName('row')[0].firstChild.nodeValue;
var cell = tree.getElementsByTagName('cell')[0].firstChild.nodeValue;

Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 00:33

MueR

Admin Tweakers Discord

is niet lief

Heb je daar al eens op gezocht? Ik krijg een hoop resultaten namelijk: [google=IE xml javascript cdata]

[ Voor 5% gewijzigd door MueR op 12-02-2010 13:56 ]

Anyone who gets in between me and my morning coffee should be insecure.


Acties:
  • 0 Henk 'm!

  • _eXistenZ_
  • Registratie: Februari 2004
  • Laatst online: 11-09 23:46
Eventueel kan je kijken naar jQuery of Mootools (Mijjn favoriet, doe alles met Mootools) om het hele crossbrowser-gezeur uit je handen te nemen :)

There is no replacement for displacement!


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb me rot geGoogled maar ik kom steeds maar uit bij de 3 mogelijkheden:
childNodes/firstChild.nodeValue
innerText
InnerHTML

Geen van drieen werkt.

FF werkt volgens de DOM en doet het zoals het hoort, IE doet hier iets maar wat kan ik niet achterhalen.

het gebruikmaken van een library zou inderdaad een oplossing zijn, maar toch zou ik graag willen weten wat hier gebeurd.

Acties:
  • 0 Henk 'm!

  • Rekcor
  • Registratie: Februari 2005
  • Laatst online: 05-09 21:08
_eXistenZ_ schreef op vrijdag 12 februari 2010 @ 13:59:
Eventueel kan je kijken naar jQuery of Mootools (Mijjn favoriet, doe alles met Mootools) om het hele crossbrowser-gezeur uit je handen te nemen :)
Hier nog eentje. Zelf gebruik ik JQuery (i.v.m. Drupal), maar vind ik Mootools iets prettiger omdat hij iets dichter bij de standaard Javascript blijft (qua syntax).

Acties:
  • 0 Henk 'm!

  • Mephix
  • Registratie: Augustus 2001
  • Laatst online: 15-03 08:21
Gewoon wat netter werken eerlijk gezegd..

var rowId = tree.getElementsByTagName('row')[0].firstChild.nodeValue;

Dit is vragen om problemen. Kijk eerst of je een node terug krijgt met getElementsByTagName en hoeveel het er zijn. Wandel (recursief) door de childNodes en controleer de nodeType of het inderdaad een CData node is (nodeType == 4).

Zo te zien is een CData een apart object (CDATASection), met zijn eigen type en properties.
Zie :http://www.w3schools.com/Dom/dom_cdatasection.asp

Zo te zien heeft die een eigen data property om de inhoud op te halen, mogelijk dat nodeValue daarom niet werkt.

Verder lezen:
Zie http://www.w3schools.com/Dom/dom_nodetype.asp

[ Voor 7% gewijzigd door Mephix op 12-02-2010 14:31 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Mephix schreef op vrijdag 12 februari 2010 @ 14:27:
Gewoon wat netter werken eerlijk gezegd..

var rowId = tree.getElementsByTagName('row')\[0].firstChild.nodeValue;

Dit is vragen om problemen.
Kan je me uitleggen waarom dit vragen om problemen is?

Acties:
  • 0 Henk 'm!

  • Mephix
  • Registratie: Augustus 2001
  • Laatst online: 15-03 08:21
Verwijderd schreef op vrijdag 12 februari 2010 @ 14:39:
[...]

Kan je me uitleggen waarom dit vragen om problemen is?
Omdat het script op teveel punten in 1 regel fout kan lopen. Lijstje (wellicht niet compleet)

tree.getElementsByTagName('row')[0].firstChild.nodeValue

getElementsByTagName array kan 0 elementen hebben, dus de eerste (index 0) pakken geeft null.
.firstChild daarvan oppakken geeft een error, want null heeft geen firstChild property
Als het eerste element wel bestaat, maar het element heeft geen childNodes, dan returned firstChild ook null
De nodeValue van null opvragen geeft ook een error
Als de firstChild node wel bestaat, ligt het maar aan de nodeType of je nodeValue kan uitlezen

Zoals ik in mijn vorige post al zei: het lijkt erop dat een CData een apart object is, die je wellicht terug krijgt als je de nodeValue uitleest. Hoe dan ook, die CData heeft een property 'data' om de inhoud op te halen.

Beetje net zoals een node een textNode child heeft, met een nodeValue die je uiteindelijk de waarde geeft. Dat zie je niet terug in de XML, maar in de DOM is die laag er wel.

[ Voor 3% gewijzigd door Mephix op 12-02-2010 14:48 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Je hebt gelijk, het was netter geweest als ik per node naar beneden was gegaan. Echter de XML is statisch met alleen de waarde van de nodes die verandert, voor gemak (dit is mijn eerste Ajax script) heb ik de lement direct aangeroepen. Zoals ik al zei doen alle elementen het behalve de Cdata.

Ik heb hem doorgeloept met tree.getElementsByTagName('rowdata')[0].childNodes.length en dan krijg ik de juiste waarde terug bij 10 ?!?!?

Als ik hem direct aanroep doet hij het niet maar binnen de loep wel.
Dus als quick & dirty oplossing werkt het nu maar inzicht in deze heb ik niet gekregen.

Acties:
  • 0 Henk 'm!

  • Mephix
  • Registratie: Augustus 2001
  • Laatst online: 15-03 08:21
Verwijderd schreef op vrijdag 12 februari 2010 @ 14:58:
Ik heb hem doorgeloept met tree.getElementsByTagName('rowdata')[0].childNodes.length en dan krijg ik de juiste waarde terug bij 10 ?!?!?
Dus... de 10e childNode bevat de data die jij verwacht? Wat zijn die childNodes 1 t/m 9?
Verwijderd schreef op vrijdag 12 februari 2010 @ 14:58:
Dus als quick & dirty oplossing werkt het nu maar inzicht in deze heb ik niet gekregen.
Aan jou de keuze of je blij bent dat het werkt, of dat je door gaat tot je weet *hoe* het werkt :)
Pagina: 1