ďťż

[AJAX] Problem z odbiorem danych.

       

Podstrony


telcocafe

Witam.

var rezult; function handle_check3() { if((ajax.readyState==4)&&(ajax.status==200)) { rezult = ajax.responseText; alert('Marek: ' + rezult); } } function katal_add(vkatalog) { if(ajax) { ajax.open('post', 'ajax.php?s=katal_add'); ajax.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); ajax.send("nazwa=" + encodeURIComponent(vkatalog) + "&priv=1&haslo="); ajax.onreadystatechange = handle_check3; //- bedzie potrzebna zmienna do przypisania w h_c3 alert('Rezultat: '+rezult); if((rezult != 0) || (rezult != NULL)){ document.nowy_kod_frm.katalog.options[document.nowy_kod_frm.katalog.options.length] = new Option(vkatalog, rezult, false, true); alert('nowa pozycja aaaaaaaaaaaaaaaaaaaaaaa'); } else { alert('nim0'); } } }

Mam sobie taki o to JS. Działa to tak.
User wchodzi na stronę, ma listę wyboru. Obok przycisk dodaj, który wywołuje funkcję katal_add
Następnie przesyłane postem zmienne do pliku ajax.php tworzą nową pozycję w bazie danych. Dalej zaczynają się schody.
Chciałbym by pole wyboru po dodaniu wartości do bazy przytyło również o nowy rekord.

Plik ajax.php zwraca 0 dla niepowodzenia lub ID nowego rekordu i funkcja handle_check3 powinna ją przypisać do zmienne rezult, która następnie zostaje przetworzona w warunku w katal_add, tak niestety się nie dzieje.

Wyśledziłem, że skrypt odbiera dane z ajax.php ale potem już zachowuje się dziwnie. Konkretnie chodzi o katal_add
wyświetla mi się najpierw komunikat
Rezultat: undefined
a dopiero po nim komunikat z handle_check3:
Marek: i tu ID
Użytkownik DJ Mentos edytował ten post 12 listopad 2009, 16:09


jQuery nie możesz użyć? Prosto, szybko i skutecznie.

Coś mi się nie podoba. Metoda onreadystatechange wykona się dopiero po zmianie statusu żądania, np. po pobraniu danych. Funkcja katal_add() nie będzie czekać, aż AJAX zakończy działanie.
Użytkownik Ferrari edytował ten post 12 listopad 2009, 16:42
Racja, wywołania ajaxa są asynchroniczne(jak sama nazwa wskazuje).
ajax.onreadystatechange = handle_check3;
to oznacza tylko tyle, że dopiero po wystąpieniu redyStateChange zostanie wywołana handle_check3. Funkcja leci dalej i wykonuje następną linijkę(alert('Rezultat: '+rezult);). Rezult jest oczywiście nadal pusty - stąd undefined.

A nad jQuery też powinieneś się zastanowić - kod był by krótszy o 1/4 i bardziej czytelny.



if (window.XMLHttpRequest) { OAJAX = new XMLHttpRequest(); } else if (window.ActiveXObject) { OAJAX = new ActiveXObject("Microsoft.XMLHTTP"); } function laduj_strone(strona) { var tresc=document.getElementById('tresc'); OAJAX.open("GET", 'http://strona.pl'); OAJAX.onreadystatechange = function() { if (OAJAX.readyState == 4) { tresc.innerHTML=OAJAX.responseText; } if (OAJAX.readyState != 4) { tresc.innerHTML='<center><img src="grafika/waiting.gif" border="0"><br>Ładowanie zawartości - proszę czekać...</center>'; } } OAJAX.send(null); }
ja używam takiego czegoś ;-) i działa bez zarzutu w każdej przeglądarce, sprawdza wartość stanu rządania dopiero przy jego zmianie, i wtedy wykonuje określoną funckję ;-)
Użytkownik piotr94 edytował ten post 12 listopad 2009, 19:33
No ładne :)
To samo w jQuery
$('#tresc').html('Ładowanie. Proszę czekać...'); $.get("http://strona.pl", function(data){$('#tresc').html(data);});

Cóż, ja jestem zwolennikiem własnych rozwiązań - bo na stronie na której dynamicznie wykonuję tylko ładowanie treści nie ma moim skromnym zdaniem sensu dołączać całej biblioteki JQuery ;-)
ale dla większych projektów, w których na JQuery jest wykonywane więcej operacji jak najbardziej popieram someone

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • nvm.keep.pl

  • Sitedesign by AltusUmbrae.