![]() |
![]() ![]() |
![]() |
![]()
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) ![]() 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 |
|
|
![]()
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 ![]() -------------------- |
|
|
![]()
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 ![]() 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 |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 2.07.2025 - 03:09 |