Mikä tässä nyt on vikana??
<html> <body onLoad="ajax()"> <script type="text/javascript"> var ajaxRequest; function ajax(){ try{ ajaxRequest = new XMLHttpRequest(); }catch(e){ try{ ajaxRequest = new ActiveXObject("Msxml2.XMLHTTP"); }catch(e){ try{ ajaxRequest = new ActiveXObject("Microsoft.XMLHTTP"); }catch(e){ alert("AJAX virhe :<"); } } } ajaxRequest.onreadystatechange = stateChanged; ajaxRequest.open("GET","testixml.php",true); ajaxRequest.send(null); } function stateChanged(){ if(ajaxRequest.readyState == 4){ var xmlDoc=ajaxRequest.responseXML.documentElement;//ajaxRequest.responseXML has no properties alert(xmlDoc.getElementsByTagName("messages").item(0).childNodes[0].nodeValue); } } </script> </body> </html>
Eli virhe tulee tossa määritettäessä xmlDoc muuttujaa: ajaxRequest.responseXML has no properties
Hatusta tulee kun ei ole noin manuaalisesti koskaan hommaa tullut hoidettua, mutta pitäisikö stateChanged-handlerin saada tuo ajaxRequest parametrina? Suosittelisin kuitenkin käyttämään jotain apukirjastoa, kuten Prototypeä. Siinä homma menisi jotakuinkin seuraavasti:
var ajax = function () { new Ajax.Request('testixml.php', { method: 'get', asynchronous: true, onSuccess: function (request) { // do your magic } }); };
Olga kirjoitti:
Hatusta tulee kun ei ole noin manuaalisesti koskaan hommaa tullut hoidettua, mutta pitäisikö stateChanged-handlerin saada tuo ajaxRequest parametrina? Suosittelisin kuitenkin käyttämään jotain apukirjastoa, kuten Prototypeä. Siinä homma menisi jotakuinkin seuraavasti:
var ajax = function () { new Ajax.Request('testixml.php', { method: 'get', asynchronous: true, onSuccess: function (request) { // do your magic } }); };
Kyllä se noin on oppaassakin tehty, että ei ole mitenkään parametrina annettu.
Ai joo, onkin globaali toi ajaxRequest. No kannattaa ainakin aluksi hieman debuggailla koodia. Jos Firebug löytyy koneelta (Firefoxin laajennos), niin sit vaan tuohon stateChanged-handleriin
console.log(ajaxRequest);
Ja jos ei Firebugia löydy eikä sitä jostain syystä halua asentaa, ihan perinteinen alert-funktiokin käy. Mutta suosittelisin tosiaan valitsemaan jonkun lukuisista valmiista JS-kirjastoista. Säästyt monelta turhalta harmilta ja ylimääräisiltä koodiriveiltä kun eri selainten väliset erot on otettu jo valmiiksi huomioon.
Oon kyllä melko paljon noiden alerttien kanssa yrittäny selvitellä. Ja itseasiassa tossa responseXML:ssä on vaan joku vika, koska responseText:illä saan sen dokumentin sisällön.
Edit: No ei tolla Firebugilla yhtää enempää infoa saa, tai sit en osaa käyttää sitä:
xmlHttp.responseXML has no properties stateChanged()jstest.html (line 24) [Break on this error] var xmlDoc=xmlHttp.responseXML.documentElement;
Edit: Tos nyt on eri nimine toi ajaxRequest -> xmlHttp , ku kopioin valmiin koodin oppaasta eikä vieläkää toimi O_o
Onko sulla jossain netissä tuo esimerkkisivu? Itse käytän serverin ja selaimen välisessä kommunikoinnissa paljon XML:ää kevyempää JSON-formaattia. Eli serveri sylkäisee validin JSON-stringin ulos, kaivan sen tuolta responseText-muuttujasta ja Prototypen String-luokan evalJSON-funktiolla muutan sen suoraan Javascript-olioksi. Muutenkin tuo responseXML on vähän (kuulemma) kinkkinen, sillä sen muodostuminen riippuu aika monesta seikasta (oikeat headerit, mime-tyyppi jne.).
Jeps mulla olikin ongelma tossa tyypissä. Pistin tohon xml dokumenttiin (joka on php:lla generoitu) headerin:
header("Content-type: text/xml");
Ni sit lähti jo melkeen toimimaan. W3Schoolin oppaassa oli sitten joku kummallinen lisä toi documentElement juttu ja ilman sitä se toimikin sitten loppujen lopuks. Tiedä sitten mitä virkaa tolla on...
Aihe on jo aika vanha, joten et voi enää vastata siihen.