Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [AJAX] Błąd funkcji send() w chacie
brtekb
post 5.02.2008, 00:45:32
Post #1





Grupa: Zarejestrowani
Postów: 19
Pomógł: 0
Dołączył: 24.06.2007

Ostrzeżenie: (0%)
-----


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ć.


--------------------
Devortis RPG
Go to the top of the page
+Quote Post
sticker
post 6.02.2008, 00:43:42
Post #2





Grupa: Zarejestrowani
Postów: 611
Pomógł: 19
Dołączył: 28.02.2005
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


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 )


--------------------
Go to the top of the page
+Quote Post
brtekb
post 7.02.2008, 23:42:39
Post #3





Grupa: Zarejestrowani
Postów: 19
Pomógł: 0
Dołączył: 24.06.2007

Ostrzeżenie: (0%)
-----


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


--------------------
Devortis RPG
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 2.07.2025 - 03:09