Ajax összeakadás
Sziasztok!
Egy elég bonyolult js problémám akadt, és nem jövök rá a megoldásra. Gugli a barátom volt, de nem segített ő sem. :) Így jutottam hozzátok, hátha valaki tudja a megoldást, és hajlandó segíteni. :)
A helyzet összefoglalója:
Linkre kattintva indul egy ajax lekérés. Háttérbe PUSH() -al kinyomom az aktuális "állapotot", amit egy divbe pakolgatok. A kapcsolat hosszabb távon fennál, és több PUSH()-al érkezik válasz. Minden szépen működik (ff alatt nézem még csak).
Azonban ha a PUSH() folyamán újra el akarom indítani az ajax lekérést (vagyis egy újat akarok), akkor összeakadnak a lekérések. Azaz, a "második szálba" érkező válasz belekerül az első szálba is. Teszi ezt annak ellenére, hogy a script tag printelése után a php egyből leáll.
Sajnos js ből nem vagyok túl erős, de az a gyanúm, hogy valami változó értékének öröklődését nem vettem figyelembe.
Íme a kód:A HTML rész:Esetleg a php:Az alábbi oldalon rá lehet nézni:
http://www.smokingtrade.hu/web2cms/extrmoduls/index.html
■ Egy elég bonyolult js problémám akadt, és nem jövök rá a megoldásra. Gugli a barátom volt, de nem segített ő sem. :) Így jutottam hozzátok, hátha valaki tudja a megoldást, és hajlandó segíteni. :)
A helyzet összefoglalója:
Linkre kattintva indul egy ajax lekérés. Háttérbe PUSH() -al kinyomom az aktuális "állapotot", amit egy divbe pakolgatok. A kapcsolat hosszabb távon fennál, és több PUSH()-al érkezik válasz. Minden szépen működik (ff alatt nézem még csak).
Azonban ha a PUSH() folyamán újra el akarom indítani az ajax lekérést (vagyis egy újat akarok), akkor összeakadnak a lekérések. Azaz, a "második szálba" érkező válasz belekerül az első szálba is. Teszi ezt annak ellenére, hogy a script tag printelése után a php egyből leáll.
Sajnos js ből nem vagyok túl erős, de az a gyanúm, hogy valami változó értékének öröklődését nem vettem figyelembe.
Íme a kód:
function AjaxObj(COM) {
var Command = COM;
function StartF(myValue){
var myPars = 'com='+Command+'&'+myValue;
var url = BasicURL+"/web2cms/extrmoduls/importmotor.php";
new makeRequest(url, myPars);
}
this.Start = StartF;
}
function makeRequest(url, parameters) {
var http_request = false;
this.textem = textem;
this.tartalekhosz = 0;
if (window.XMLHttpRequest) { // Mozilla, Safari,...
http_request = new XMLHttpRequest();
if (http_request.overrideMimeType) {
http_request.overrideMimeType('text/xml');
}
} else if (window.ActiveXObject) { // IE
try {
http_request = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
http_request = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e) {}
}
}
if (!http_request) {
alert('Hiba :( Nem hozható létre az XMLHTTP példánya');
return false;
}
http_request.onreadystatechange = function() {
if(this.tartalekhossz == undefined) { this.tartalekhossz = 0; }
if (http_request.readyState == 4) {
if (http_request.status == 200) {
// Úgy tűnik ez nem kell, mert megcsinálja az else ág...
http_request = false;
} else {
alert('Hiba történt a kérés kiszolgálása során.');
http_request = false;
}
} else {
this.hossz = http_request.responseText.length;
textem = http_request.responseText;
textem = textem.substring(this.tartalekhossz);
this.tartalekhossz = this.hossz;
//alert('hossz:'+this.tartalekhossz+';textem:'+textem);
RespControll(textem);
}
};
http_request.open('POST', url, true);
http_request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
http_request.send(parameters);
}
function RespControll(Resp) {
re = /(?:<id\:([^>]*)?>)((\n|\r|.)*?)(?:<\/id>)/ig;
while((match = re.exec(Resp))){
helyzet = match[1].split(':');
id = helyzet[0];
hely = helyzet[1];
mit = match[2];
switch(hely) {
case 'top':
new Insertion.Top(id, mit);
break;
case 'bottom':
new Insertion.Bottom(id, mit);
break;
case 'before':
new Insertion.Before(id, mit);
break;
case 'after':
new Insertion.After(id, mit);
break;
default:
$(id).innerHTML = mit;
}
}
mcEval(Resp);
}
function mcEval(string) {
re = /(?:<script([^>]*)?>)((\n|\r|.)*?)(?:<\/script>)/ig;
while((match = re.exec(string))){
eval(match[2]);
}
}
<a href="javascript:akarmi.Start('sor=0');">Teszt</a>
<script type="text/javascript">
akarmi = new AjaxObj('teszt');
</script>
if($_POST['com'] == 'teszt') TesztKeret();
function TesztKeret() {
teszt(1);
teszt(2);
teszt(3);
if($_POST['sor'] < 30) {
print '
<script>
alert("várakoztatás");
akarmi.Start("sor=40");
</script>';
}
exit;
}
function teszt($x) {
for($i=0; $i<15000000; $i++) { }
print '<id:adatok:felulir>'.$_POST['sor'].': '.$x.'</id>';
print '<id:lista:after>'.$x.'</id>';
flush();
}
http://www.smokingtrade.hu/web2cms/extrmoduls/index.html
Mi a cél?
Egyszerű, de nem segít. :)
(sajnos a push() feldolgozásra jqueryben nem találtam megoldást, pedig ott talán nem szívnék ezzel)
A kód sajnos tényleg nem a "normál volt".
javítottam a megadott linken.
function makeRequest(url, parameters) { ... } Ő nem kap, csak 2 változót.
Azért raktam bele a +változót, mert azt gondoltam, hogy a StartF függvényben minden alkalommal ÚJ lekérés készül, és gondoltam, hogy talán a textem változó miatt van gond. Azóta kétlem, mert a firebugban is megjelenik a 2. lekérés tartalma az első szálban.
Melyik változót, és hol kellene deklarálnom? Kifejtenéd?
JavaScriptben
var
kulcsszóval, különben globális változó lesz, amit használsz. Ennek okán például are
,textem
,helyzet
,id
,match
stb. globális változók, és minden egyes futás felül írja a másik változót.2 nap legszebb pillanata
két napot szívtam vele legalább, ha nem többet. Bemásolom az új kódot, amivel működik, véleményed szerint melyikkel lehetett a gáz?