Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [AJAX] Błąd funkcji send() w chacie
Forum PHP.pl > Forum > XML, AJAX
brtekb
Witam!
Naskrobałem sobie chat w AjAX'ie.
I mam funkcję se() która sczytuje z inputa wartość i wysyła ją (GET'em!) do odpowiedniego skryptu w PHP który sobie już z nią radzi sam.
Mam też funkcję ref() która odświeża diva z treścią chatu co 2,5 sekundy. (to działa dość prosto - w funkcji po prostu pod koniec mam onTimeout('ref()',2500) winksmiley.jpg

Więc problem jest następujący:
Kiedy ktoś próbuje wysłać nową wiadomość w trakcie odświeżania chatu, chat znika a w spicie blędów firefoxa pojawia się fatal:
Kod
Error: uncaught exception:
[Exception... "Component returned failure code: 0xc1f30001 (NS_ERROR_NOT_INITIALIZED) [nsIXMLHttpRequest.send]"  nsresult: "0xc1f30001 (NS_ERROR_NOT_INITIALIZED)"  location: "JS frame :: (adres strony, pliku) :: ref :: line 34"  data: no]



Starałem się to zabezpieczyć tworząc zmienną globalną i zmieniając jej wartość w czasie pracy jednej funkcji, i ifkami broniąc dostępu do drugiej kiedy pracuje pierwsza.
Wszystko na nic.
Błąd Ciągle się powtarza.

Ma ktoś jakiś sposób?
Będę wdzięczny.


brtekb



PS.
Zamieszczę wam kod funkcji:

Kod
var send=0;

function se(){
     if(send==1){
         setTimeout('se();',500);
         return false;
     }
     send=1;
     var msg = document.getElementById('msg').value;
     document.form.msg.value = '';
     dis(true);
     Req.open('GET','chatsend.php?msg='+msg);
     Req.send(null);
     send=0;
}

function ref(){
     if(send==1){
         setTimeout('ref();',500);
         return false;
     }
     send=1;
     Req.open('GET','chatview.php?aa='+Math.random()*99999);
     Req.onreadystatechange = function(){if(Req.readyState==4){var msg = Req.responseText; document.getElementById('tu').innerHTML = msg; dis(false); setTimeout('ref()',2000);}};
     Req.send(null);
     send=0;
}

ref();


Wyciąłem funkcję dis(), żeby nie śmieciła. Przy okazji chętnie wysłucham pomysłów jak to wszystko lepiej rozwiązać.
sticker
Sporbuj zsynchronizowac obie funckje semaforem. Wyłacz timeouta dopoki nie dostaniesz potwierdzenia z sv że dodałeś gdzieś tam wiadomości i że mozna już odświeżyć sobie czata. ( tylko zastanawiam sie jak to zadziała kiedy kilku klientów będzie chciało zrobić to wszystko na raz ) Tak czy siak taki śmieszny błąd wyrzuca tylko ff.

Pokaż jeszcze prosze link wywołujący wysłanie inputa smile.gif Bo ja miałem coś podobnego i on wlasnie tam siedział (nawet gdzies na forum wrzucałem błąd )
brtekb
Biegnę, lecę, pokazuję:

Kod
<input size=60 id='msg' name='msg'><button onclick='se();'>ok</button><button onclick='flush();'>Czyść</button>
<br>
<br>
<div id='tu'>


Nic nadzwyczajnego, po prostu zwykły onclick...

Zapomniałem nadmienić, że błąd nie zawsze wskazuje linijkę Req.send(null); w se() ale, czasem też w req() ...
To raczej ważna uwaga winksmiley.jpg

Naprawione.
Dla potomności:

Robimy div'ka niewidzialnego (id 'stat')
Kod
function se(){
    if(document.getElementById('stat').value == 1){
        setTimeout('se()',250);
        alert(1);
        return false;
    }
    document.getElementById('stat').innerHTML = 1;
    var msg = document.getElementById('msg').value;
    document.form.msg.value = '';
    dis(true);
    Req.open('GET','chatsend.php?msg='+msg);
    Req.onreadystatechange = function(){if(Req.readyState==4)document.getElementById('stat').innerHTML = 0;}
    Req.send(null);
  
}


        setTimeout('se()',250);
        alert(1);
        return false;
    }
    document.getElementById('stat').innerHTML = 1;
    var msg = document.getElementById('msg').value;
    document.form.msg.value = '';
    dis(true);
    Req.open('GET','chatsend.php?msg='+msg);
    Req.onreadystatechange = function(){if(Req.readyState==4)document.getElementById('stat').innerHTML = 0;}
    Req.send(null);
  
}
  
function flush(){
    Req.open('GET','chatsend.php?flush');
    Req.send(null);  
}

function ref(){
    if(document.getElementById('stat').value == 1){
        setTimeout('ref()',250);
        return false;
    }
    document.getElementById('stat').innerHTML = 1;
    Req.open('GET','chatview.php?aa='+Math.random()*99999999999999999999);
    Req.onreadystatechange = function(){if(Req.readyState==4){document.getElementById('tu').innerHTML = Req.responseText; dis(false); document.getElementById('stat').innerHTML = 0;setTimeout('ref()',2000);}};
    Req.send(null);
}




Pytacie czemu nie zrobić tego na globalnej zmiennej?
Dobre pytanie - próbowałem ale dlaczego to nie działało?


Brtekb
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.