ugrás a tartalomhoz

Ajax összeakadás

gtoma · 2012. Okt. 13. (Szo), 10.58
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:


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 HTML rész:

<a href="javascript:akarmi.Start('sor=0');">Teszt</a>
<script type="text/javascript">
     akarmi = new AjaxObj('teszt');
</script>
Esetleg a php:

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();
}
Az alábbi oldalon rá lehet nézni:
http://www.smokingtrade.hu/web2cms/extrmoduls/index.html
 
1

Mi a cél?

Poetro · 2012. Okt. 13. (Szo), 12.09
Egyáltalán mi a cél? Miért hívogatod meg a szkriptedet rekurzívan? És ha már vársz egy sor nevű változóra, akkor miért nem küldöd el? Valamint az is hasznos lenne, ha deklarálnád a változókat, és nem mindegyik globális lenne, mert az is okozhat problémát.
2

Egyszerű, de nem segít. :)

gtoma · 2012. Okt. 13. (Szo), 13.21
A cél az, hogy pl egy termék importnál, ha kifut a futási időből a php, akkor "meg tudja hívni" saját magát. A folyamatos push() pedig a folyamatos tájékoztatás miatt szükséges (én biztosan igénylem :) )

(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?
3

JavaScriptben

Poetro · 2012. Okt. 13. (Szo), 13.23
JavaScriptben minden változót deklarálni kell a var kulcsszóval, különben globális változó lesz, amit használsz. Ennek okán például a re, textem, helyzet, id, match stb. globális változók, és minden egyes futás felül írja a másik változót.
4

2 nap legszebb pillanata

gtoma · 2012. Okt. 13. (Szo), 13.32
SIKERÜLT! KÖSZÖNÖM!

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?


function makeRequest(url, parameters) {
    var http_request = false;
    var textem = '';
	this.hossz = 0;
    this.tartalekhossz = 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) {
    var re = /(?:<id\:([^>]*)?>)((\n|\r|.)*?)(?:<\/id>)/ig;
    while((match = re.exec(Resp))){
        var helyzet = match[1].split(':');
        var id = helyzet[0];
        var hely = helyzet[1];
        var 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) {
    var re = /(?:<script([^>]*)?>)((\n|\r|.)*?)(?:<\/script>)/ig;
    while((match = re.exec(string))){
        eval(match[2]);
    }    
}