[ kukipei @ 08.09.2006. 21:38 ] @
Pozdrav svima.

Koristim sledeci kod pri radu sa AJAX-om:
Code:

function handleHttpResponse() 
{
    if (http.readyState == 4) 
    { 
      if(http.status==200) 
      { 
        var results=http.responseText;
        if (navig == 1)
            ObradiNavigator1(results);
        if (navig == 2)
        {
            ObradiNavigator2(results);
        }
        return;
      } 
    } 

function Start(nav, zapretragu)
{
    var metod = true;
    navig=nav;
    if (nav == 1)
    {
        url = "navigator1.php";
    }
    if (nav == 2)
    {
        metod = false;
        url = "navigator2.php?slovo="+zapretragu;
    }
    http.open("GET", url, metod);
    http.onreadystatechange = handleHttpResponse; 
    http.send(null); 

function getHTTPObject() 

    var xmlhttp; 
    try 
    {
        xmlhttp = new XMLHttpRequest();
      }
    catch (trymicrosoft)
    {
        try
        {
              xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
        }
        catch (othermicrosoft)
        {
            try
            {
                xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
            }
            catch (failed)
            {
                xmlhttp = false;
              }
        }
      }
    if (!xmlhttp)
        alert("Error initializing XMLHttpRequest!");
    return xmlhttp; 

var http = getHTTPObject(); // We create the HTTP Object 


E sada je bitan ovaj deo koda:
Code:

if (nav == 2)
    {
        metod = false;
        url = "navigator2.php?slovo="+zapretragu;
    }
    http.open("GET", url, metod);
    http.onreadystatechange = handleHttpResponse; 
    http.send(null); 


kada je metod = false, stranica bi trebalo da saceka izvrsenje skripte na serveru i tek onda obradi podatke (sinhronizovan poziv).

Ovo lepo radi u IE 6 i Operi 9 ali nece u Mozilli 1.5?
U cemu je problem?
Kako da u Mozilli izvrsim sinhronizovan poziv?

Pozdrav,
Predrag


[Ovu poruku je menjao kukipei dana 09.09.2006. u 15:46 GMT+1]
[ noviKorisnik @ 11.09.2006. 08:37 ] @
Ja ne znam, recimo da ne može :-)

No, u čemu je problem da cela priča ne može da se odvija asinhrono?

Zato se i postavlja taj onreadystatechange handler - po prijemu podataka on može da inicira obradu podataka.
[ kukipei @ 11.09.2006. 09:16 ] @
Citat:
noviKorisnik
No, u čemu je problem da cela priča ne može da se odvija asinhrono?



Pa dobro, moze da se odvija i asinhrono, ali ja sam ipak hteo da se sacekaju podaci sa servera a da za to vreme user ne moze nista da radi. Ali moze i ovako. Nije toliko strasno.

Pozdrav.
[ Gojko Vujovic @ 11.09.2006. 09:32 ] @
Poenta tog asinhronog je što stranica deluje interaktivnije, barem ja to tako shvatam. Treba baš da imaš specifične potrebe pa da bežiš od toga. Ako te brine da ne klikne još nešto za vreme učitavanja, disejbluj te kontrole javascriptom.
[ kukipei @ 11.09.2006. 16:51 ] @
http://www.gensunasumus.com/searchajax/

Ma ostavicu ga da radi asinhrono, ali ipak me interesuje zasto sinhrono ne radi u mozzili.
[ Br@nkoR @ 11.09.2006. 18:01 ] @
Nije me bilo odavno ovde. :)

Kod sinhrohog zahteva ne postoji event onreadystatechange, odnosno nikada se ne izvrši, tako da bi u ovom slučaju Start funkcija trebala da izgleda ovako:
Code:

function Start(nav, zapretragu)
{
    var metod = true;
    navig=nav;
    if (nav == 1)
    {
        url = "navigator1.php";
    }
    if (nav == 2)
    {
        metod = false;
        url = "navigator2.php?slovo="+zapretragu;
    }
    http.open("GET", url, metod);
    
    if(metod == true) {
      http.onreadystatechange = handleHttpResponse; 
    }
    
    http.send(null); 
    
    if(metod == false) {
      if(http.responseText) {
        ObradiNavigator2(http.responseText);
      }  
    }

[ bzero @ 11.09.2006. 18:13 ] @
1. Sinhroni XMLHttpRequest definitivno radi sasvim normalno u mozilli. Da bi to proverio u tvojoj funkciji Start iskomentarisi red koji postavlja hedler za onreadystatechange i dodaj alert(http.responseText) na kraju, znaci ovako:

Code:

function Start(nav, zapretragu)
{
    var metod = true;
    navig=nav;
    if (nav == 1)
    {
        url = "navigator1.php";
    }
    if (nav == 2)
    {
        metod = false;
        url = "navigator2.php?slovo="+zapretragu;
    }
    http.open("GET", url, metod);
    //http.onreadystatechange = handleHttpResponse; 
    http.send(null); 
    alert(http.responseText);



i videces da ovo radi u mozilli i to potpuno isto kao i u ostalim browserima.

2. Razlika izmedju asinhronog i sinhronog XMLHttpRequest-a je u tome sto se kod sinhronog zaustavlja izvrsavanje bilo cega na toj strani i browser ceka dok ne dobije odgovor od servera, dok se kod asinhronog browser ne ceka, nego kada se promeni readyState poziva funkciju koja mu je data. Iz ovoga slede dve stvari: prvo, sinhroni request se apsolutno ne preporucuje (osim mozda u nekim specificnim slucajevima), jer bukvalno blokira browser, mozda se to ne oseti kada radis u lokalnoj mrezi, ali ako odgovor od servera treba duze cekati, ovo je itekako problem. Drugo, postavljanje onreadystatechange hendlera kod sinhronog requesta nema nikakvog smisla, jer ce browser ionako cekati dok se request potpuno ne zavrsi. To sto tvoj originalni primer radi u nekim browserima prakticno je zbog toga sto oni pozovu onreadystatechange funkciju i za sinhroni zahtev, a mozilla ne (sto je ustvari i ispravno).

3. Sto se tice toga da si ti hteo da se sacekaju podaci sa servera, treba da disejblujes konrole na strani dok ne dobijes ceo odgovor sa servera, kao sto je vec receno i eventualno da stavis neku indikaciju da se podaci ucitavaju, da bi korisnik znao sta se desava.
[ kukipei @ 11.09.2006. 20:39 ] @
OK. Hvala momci sada su mi neke stvari jasnije