Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: ajaxRequest.responseXML has no properties

Matso [18.07.2007 23:32:26]

#

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

Olga [19.07.2007 07:33:35]

#

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
    }
  });
};

Matso [19.07.2007 12:23:40]

#

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.

Olga [19.07.2007 12:42:11]

#

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.

Matso [19.07.2007 18:39:15]

#

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

Olga [19.07.2007 20:53:20]

#

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.).

Matso [19.07.2007 21:22:26]

#

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...

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta