AJAX - (readyState==4) után késik (?) a tartalom
2008-07-09T13:28:11+02:00
2008-07-10T14:57:41+02:00
2022-07-29T15:45:31+02:00
Astyu
Sziasztok!
Nemrég úgy gondoltam, hogy csinálok egy szavazás szerűséget AJAX kezelőfelülettel. Az elméleti tudásom meg volt hozzá, így hamar el is készültem, localhost-on remekül működik minden probléma nélkül.
De mikor feltöltöttem egy extra.hu-s tárhelyre próbaképpen, egy elég furcsa jelenségbe ütköztem.
(Na meg abba, hogy az extra teleszemeteli a php fájl kimenetelét, de ezt gyorsan megoldottam.)

Ahová feltöltöttem a cucot:
http://wanax.extra.hu/vote/client.html
Ami ebben az esetben fontos, az az, hogy van egy client.html és egy vote.php. A client.html a következő kóddal próbálja megszerezni a "vote.php?vote_action=default" tartalmát:

function createRequestObject() { var ro; var browser = navigator.appName; if(browser == "Microsoft Internet Explorer"){ ro = new ActiveXObject("Microsoft.XMLHTTP"); }else{ ro = new XMLHttpRequest(); } return ro; } function handleResponse() { if(http.readyState == 4){ if (http.status == 200) { var response = http.responseText; var update = new Array(); if(response.indexOf('|' != -1)) { update = response.split('|'); document.getElementById(update[1]).innerHTML = update[2]; } } else { alert('Kapcsolódási hiba.'); } } } function sndReq(action) { http.open('get', 'vote.php?'+action); http.onreadystatechange = handleResponse; http.send(null); } var http = createRequestObject(); sndReq('vote_action=default');

A "vote.php?vote_action=default" pedig a következő formájú választ adja:

extra.hu-s szemét|vote_container|html szöveg

(http://wanax.extra.hu/vote/vote.php?vote_action=default)
(Természetesen az oldalon van egy <div id="vote_container">)
Mint említettem, localhost-on ez hibátlanul működik, de az extra.hu-s tárhelyen a böngészők hibajelentői a következőt mondják:

Hiba: document.getElementById(update[1]) is null
Forrásfájl: http://wanax.extra.hu/vote/client.html
Sor: 54

54.-es sor, azaz:
document.getElementById(update[1]).innerHTML = update[2];

A tömb második eleme ([1]) null, tehát ha jól értem vagy nem sikerült a szöveget feldarabolnia, vagy nem volt még mit feldarabolni. Ha bármilyen módon megállítom a scriptet egy kis időre mielőtt ez a sor megtörténne (Firebug breakpoint vagy egy alert()) akkor elvégzi a dolgokat kifogástalanul.
Ennek a demonstrálására feltöltöttem egy alert()-el ellátott verziót:
http://wanax.extra.hu/vote2/client.html

Ez ugyanígy van FF 3-ban, IE 7-ben és Opera 9-ben.

Találkoztatok már hasonlóval? Mi lehet a hiba/megoldás?

Üdv.:
Astyu
Mutasd a teljes hozzászólást!
Rájöttem a dologra és tévedtem a hiba okát illetőleg, leírom hátha valakinek még hasznára lesz:

A fenti kódrészletet a következőre módosítva

update = response.split('|'); var elmId = update[1]; var elm = document.getElementById(elmId); elm.innerHTML = update[2];

ki tudtam debugolni, hogy nem az update[1] a
null
, hanem a
document.getElementById("vote_container")
. Ezután Google már könnyen rásegített a válaszra: azelőtt történik meg mindez, mielőtt a böngészők feldolgoznák a
<div id="vote_container"></div>
részt, tehát az indító függvényhívást betettem az oldal végére:

<script type="text/javascript"> sndReq('vote_action=default'); </script>

és így remekül műküdik.

Pontot sajna senkinek nem tudok adni, de egy admin ha erre jár megoldott témává minősíthetné.

Üdv.:
Astyu
Mutasd a teljes hozzászólást!

abcd