Autor Zpráva
Martin Tiršel
Profil
Zdravim,

s JS robim len par dni, takze som este nestihol vsetko pochytat, ale mam jeden problem s ktorym si neviem rady. Mam objekt, ktory ma za ulohu spracovavat okrem ineho httprequest poziadavky na server, co funguje, ale nefunguje uz spracovanie odpovedi, lepsie povedane je readystate stale 0. Takto nejako vyzera kod:

function initialise() {
  var myPage = new ajaxObject();
  ...
  myPage.doAction();
}

function ajaxObject() {
  ...

  function doAction() {
    this.httpRequest = new XMLHttpRequest();
    ...
    this.httpRequest.onreadystatechange = alert (this.httpRequest.readyState);
  }

}


Kod je kvoli prehladnosti znacne osekany, ale to podstatne je tu. Alert je zavolany 2x, avsak v oboch pripadoch je hodnota 0, pricom serverlogy ukazu 2 dotazy so statusom 200.

Pokial ma niekto viete nakopnut, budem vdacny
Chamurappi
Profil
Reaguji na Martina Tiršela:
Přiřazuješ do ovladače události „this.httpRequest.onreadystatechange“ výslednou hodnotu metody alert. Tou je undefined. Takže na událost onreadystatechange nijak nereaguješ.

Potřebuješ k události přiřadit přímo nějakou funkci.
    this.httpRequest.onreadystatechange = function() {
      alert (this.httpRequest.readyState);
    }
Patrně ještě narazíš na problém s „this“, které při zpracování události nebude ukazovat na původní „this“, ale na „httpRequest“.
Martin Tiršel
Profil
Chamurappi
Prave tymto sposobom to nefunguje, pretoze this je povazovane za sucast objektu httpRequest a nie objektu ajaxObject. Alert som tam dal len na skratenie, v skutocnosti som tam mal this.httpRequest.onreadystatechange = this.handleRequest(); a ta sa chovala rovnako ako dany alert - metoda sa korektne zavolala (overene alertom v danej metode - cize nie priradenie ale pointer na funkciu?).
Martin Tiršel
Profil
Beriem spat, uz mi to doslo...

Ako teda tento problem nejako rozumne vyriesit, da sa to vobec?
Chamurappi
Profil
Reaguji na Martin Tiršela:
Máš nějaký opravdu hodně závažný důvod nedat sem odkaz na živou ukázku problému?

v skutocnosti som tam mal this.httpRequest.onreadystatechange = this.handleRequest();
Opět tedy přiřazuješ výsledek funkce, která se vykoná v okamžiku tohoto přiřazení, a nikoliv funkci samotnou.
Jestli mi na tohle řekneš, že jsi svůj kód opět jen nechtěně zkreslil a že ve svém kompletním tajném kódu ty závorky „()“ nemáš, tak tě nechám sežrat naším dvorním lidožroutem.

———
Dodatek:
Ako teda tento problem nejako rozumne vyriesit, da sa to vobec?
Dokážeš-li smazat ty závorky, tak dá.
Martin Tiršel
Profil
Chamurappi
Bohuzial to verejne spristupnit nemozem, som zazmluvneny :) Mimochodom by to nic neriesilo, pretoze tam je stara verzia JavaScriptu, ktora sa postupne zacala nabalovat tak, ze som bol nuteny si vytvorit nieco lepsie fungujuce a toto bol prvy problem, na ktory som narazil.

Hej, to priradenie som si potom uvedomil, ved som ten post zobral spat :) Kod som sem napisal len pre ilustraciu principu, ako s tym pracujem. Ak by si sem poslal nejaku peknu ludozrutku, kludne sa zozrat necham :D

Ale po troche googlenia a analyzovani frameworkov som natrafil na sikovnu vec:

var tentoobjekt = this;


Takze ked namiesto this pouzijem tentoobjekt, tak uz vsetko funguje ako ma a neodkazujem sa na xmlhttprequest objekt.
peta
Profil
Martin Tiršel
'Bohuzial to verejne spristupnit nemozem'
V tom pripade bych povazoval problem za neresitelny, tudiz vyreseny a nemas zac :)
Bud chces poradit a vyrobis treba jednoduchy priklad, jakych je na webu kolem ajaxu tisice, stacilo hledat, nebo proste muzeme sazet do loterie, kde presne mas asi chybu.

Mam tu takovy pokus, ale nevim, v jake fazi to skoncilo, zda to funguje.
var req = null;
try {req = new XMLHttpRequest();}
catch (e) {req = null;}
req.onreadystatechange = function()
{
// alert(req.readyState)
if (req.readyState==4)
{
// if (req.status==200) {func(req.responseText);} else {alert(req.status+": "+req.statusText);} //POST server
if (window[func]!=null) {window[func](req.responseText);} //string
// if (ajax.func) {ajax.func(req.responseXML);} //XML
}
}

Mno, this odkazuje na aktualni objekt.
pokud napises
aaa = function () {this.neco
tak se dostavas do aaa

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0