Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][AJAX] Dwa zapytania do jednego pliku
Forum PHP.pl > Forum > Przedszkole
basstone
Witam

Mam pewien problem otóż w jednej podstronie serwisu potrzebuję wywołać dwa zapytania ajaxowe - oba odpytujące ten sam plik php, ale każdy o inne dane. Niestety, gdy w kodzie mam dwa takie zapytania - działa tylko jedno z nich (to drugie), niezależnie od umiejscowienia wywołania funkcji w kodzie.

Oto kod js:
  1. function noweZapytanie(url,funkcja,atrybut) {
  2. http_request = false;
  3.  
  4. if(window.XMLHttpRequest) {
  5. http_request = new XMLHttpRequest();
  6. if(http_request.overrideMimeType) {
  7. http_request.overrideMimeType('text/xml');
  8. }
  9. } else if (window.ActiveXObject) {
  10. try {
  11. http_request = new ActiveXObject("Msxm12.XMLHTTP");
  12. } catch (e) {
  13. try {
  14. http_request = new ActiveXObject("Microsoft.XMLHTTP");
  15. } catch (e) {}
  16. }
  17. }
  18.  
  19. if(!http_request) {
  20. alert('Poddaje sie :( Nie moge stworzyc instancji obiektu XMLHTTP');
  21. return false;
  22. }
  23.  
  24. if(funkcja == 'menuitems') {
  25. http_request.onreadystatechange = function() { responseMenuItems(http_request); };
  26. http_request.open('POST', url, true);
  27. http_request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
  28. http_request.send('show=' + funkcja);
  29. }
  30.  
  31. if(funkcja == 'menuadding') {
  32. http_request.onreadystatechange = function() { responseMenuAdding(http_request); };
  33. http_request.open('POST', url, true);
  34. http_request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
  35. http_request.send('show=' + funkcja);
  36. }
  37.  
  38. function responseMenuAdding(http_request) {
  39. if(http_request.readyState < 4) {
  40. document.getElementById('menuadd_cc').innerHTML = '<img src=gfx/ajax-loader2.gif style="margin-top:15px;">';
  41. }
  42. if(http_request.readyState == 4) {
  43. alert('ok');
  44. if(http_request.status == 200) {
  45. var odpowiedz = http_request.responseText;
  46. document.getElementById('menuadd_cc').innerHTML = odpowiedz;
  47. } else {
  48. alert(http_request.status);
  49. }
  50. }
  51. }
  52.  
  53.  
  54. function responseMenuItems(http_request) {
  55. if(http_request.readyState < 4) {
  56. document.getElementById('menuitems_cc').innerHTML = '<img src=gfx/ajax-loader2.gif style="margin-top:15px;">';
  57. }
  58. if(http_request.readyState == 4) {
  59. if(http_request.status == 200) {
  60. var odpowiedz = http_request.responseText;
  61. document.getElementById('menuitems_cc').innerHTML = odpowiedz;
  62. } else {
  63. alert(http_request.status);
  64. }
  65. }
  66. }
  67.  



A to obcięty ze zbędnych div'ów kod html'owy, w którym wywołuję zapytania:

  1. <div id="insidewindow">
  2. <div id="menuadd_cc">
  3. <script> noweZapytanie('modules/menustrony_ajaxresponse.php','menuadding',''); </script>
  4. </div>
  5. </div>
  6.  
  7. <div id="insidewindow">
  8. <div id="menuitems_cc">
  9. <script> noweZapytanie('modules/menustrony_ajaxresponse.php','menuitems',''); </script>
  10. </div>
  11. </div>


Czy ktoś może pomóc i chociaż naprowadzić mnie dlaczego te funkcje nie mogą zadziałać obie naraz? Po stronie pliku menustron_ajaxresponse.php wszystko jest w porządku, sprawdzałem na setki sposobów smile.gif Firebug dla obu operacji pokazuje status 200, ale mimo wszystko zapytanie o 'menuadding' nie działa :|
Sephirus
Odpowiedź jest bardzo prosta...

[JAVASCRIPT] pobierz, plaintext
  1. if(funkcja == 'menuitems') { // w tym miejscu nadpisujesz onreadystatechange dla AJAX'a
  2. http_request.onreadystatechange = function() { responseMenuItems(http_request); };
  3. http_request.open('POST', url, true);
  4. http_request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
  5. http_request.send('show=' + funkcja);
  6. }
  7.  
  8. if(funkcja == 'menuadding') { // w tym też - i to wyżej po prostu ginie śmiercią naturalną...
  9. http_request.onreadystatechange = function() { responseMenuAdding(http_request); };
  10. http_request.open('POST', url, true);
  11. http_request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
  12. http_request.send('show=' + funkcja);
  13. }
[JAVASCRIPT] pobierz, plaintext


Sposoby rozwiązania są co najmniej 3:

1. Zamiast robić jednej funkcji wysyłającej i dwóch odbierających zrób na odwrót. Innymi słowy zostaw jedną funkcję wysyłającą tak jak masz - ale onreadystatechange ustaw raz na tylko jedną funkcję. W odpowiedzi AJAX ustaw coś tak aby funkcja odbierająca wiedziała co ma z danymi wykonać - proponuje po prostu odpowiadać do AJAXAa JSONem.

2. Utwórz dwie oddzielne funkcję wysyłajace i dwie odbierające i stwórz dwa oddzielne obiekty http_request dla jednej i dla drugiej - unikniesz tego problemu.

3. Zastosuj jakiś framework np. jQuery - $.ajax(...); i po problemie
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.