Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: AJAX pod nowoczesnymi przeglądarkami
Forum PHP.pl > Forum > XML, AJAX
Hazel
Nie znam się na ajaxie, a chciałbym się poznać, bo jest przydatny, dlatego napisałem sobie z pomocą Google krótką "aplikację" ajaxową. I działa pod IE , natomiast pod nowoczesnymi przeglądarkami - nie działa. Testowałem w Operze, Flocku, Firefoxie, Safari. Tylko IE reaguje prawidłowo.
No to najpierw kod.
001.html:
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
  2. <script type="text/javascript" src="001.js"></script>
  3. <meta http-equiv="content-type" content="text/html; charset=iso-8859-2">
  4. <title>Wysyłanie danych</title>
  5. </head>
  6. <h3>Kilka informacji o użytkowniku...</h3>
  7. <form onsubmit="sendData();return false">
  8. <p>Imię: <input type="text" name="firstname" size="20"></p>
  9. <p>Nazwisko: <input type="text" name="lastname" size="20"> </p>
  10. <p>Płeć: <input type="text" name="gender" size="2"> </p>
  11. <p>Kraj pochodzenia: <input type="text" name="country" size="20"> </p>
  12. <p><button type="submit">Wyślij dane</button></p>
  13. </form>
  14. </body>
  15. </html>

To jest kod HTML. W IE działa, jak już pisałem (po zmianie zdarzenia z onsubmit formularza na onclick buttona wysyłającego oczywiście).
Kod 001.js:
Kod
/* Funkcja opakowująca do skonstruowania obiektu żądania.
Parametry:
reqType: typ żądania HTTP, na przykład GET lub POST.
url: adres URL programu serwerowego.
asynch: czy żądanie będzie wysłane asynchronicznie, czy też nie. */

function httpRequest(reqType,url,asynch){
   // Przeglądarki na bazie Mozilli.
   if(window.XMLHttpRequest){
      request = new XMLHttpRequest();
   } else if (window.ActiveXObject){
      request=new ActiveXObject("Msxml2.XMLHTTP");
      if (! request){
         request=new ActiveXObject("Microsoft.XMLHTTP");
      }
   }
   // Jeżeli nie powiodła się nawet inicjalizacja ActiveXObject,
   // wówczas żądanie wciąż może być typu null.
   if(request){
      initReq(reqType,url,asynch);
   } else {
      alert("Używana przeglądarka nie pozwala na wykorzystanie "+
         "wszystkich funkcji tej aplikacji!");
   }
}
/* Inicjalizacja obiektu żądania, który został już skonstruowany. */
function initReq(reqType,url,bool){
   /* Określamy funkcję, która będzie obsługiwała odpowiedź HTTP. */
   request.onreadystatechange=handleResponse;
   request.open(reqType,url,bool);
   request.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=iso-8859-2");
   request.send(queryString);
}
function setQueryString(){
queryString="";
var frm = document.forms[0];
var numberElements = frm.elements.length;
for (var i = 0; i < numberElements; i++) {
  if(i < numberElements-1) {
   queryString += frm.elements[i].name+"="+encodeURIComponent(frm.elements[i].value)+"&";
  } else {
   queryString += frm.elements[i].name+"="+encodeURIComponent(frm.elements[i].value);
  }
}
}
var request;
var queryString;
function sendData(){
setQueryString();
var url="001.xml";
httpRequest("POST",url,true);
alert("a");
}
// Obsługa zdarzeń dla XMLHttpRequest
function handleResponse(){
if(request.readyState == 4){
  if(request.status == 200){
   alert(request.responseText);
  } else {
   alert("Wystąpił problem z komuinkacją między obiektem XMLHttpRequest, a programem serwera.");
  }
} // Koniec zewnętrznej pętli if.
}


Plik XML jest zbudowany najzupełniej poprawnie.

Widzę to tak:
Po kliknięciu buttona wykonuje się funkcja sendData(), która uruchamia SetQueryString(), która to ustawia ciąg postaci firstname=imie&lastname=nazwisko&gender=plec&country=kraj, zależnie od wpisanych danych. Następnie zostaje wykonane żądanie za pomocą httpRequest(). I chyba tutaj coś nie działa, bo za pomocą linijki alert("a"); wstawianej w różnych miejscach kodu doszedłem do tego, że we wszystkich przeglądarkach oprócz IE to tutaj skrypt się wykrusza - alert wstawiony przed tą linią wykonuje się, po tej linii - już nie. Mógłby ktoś pomóc? smile.gif
slammer
dlaczego piszesz:
Kod
alert(request.responseText);

skoro zwracasz dane XML powinieneś pisać:
Kod
alert(request.responseXML);


To całe alert("a") na moje oko powinno znajdować się w funkcji zwrotnej, gdy wiadomo czy zapytanie zostało wykonane czy też nie.
Hazel
Pisałem, że tego alerta wstawiałem w róznych miejscach kodu - a wkleiłem akurat mało reprezentatywną wersję.
Za pomocą tego alerta doszedłem do tego, że poniższy kod:
1. Wyświetla alert o treści "reqType=POST".
2. Wyświetla kolejny alert o treści "url=plik.xml".
3. Wyświetla ostatni alert o treści "bool=true".
4. Alert o treści "a" nie wykonuje się, co wskazuje na błąd w metodzie open. Pod IE też nie dziala (już tongue.gif), przez chwilę działał, ale nie mam pojęcia, co skopałem w kodzie, że znów nie działa.
Kod
function initReq(reqType,url,bool){
   /* Określamy funkcję, która będzie obsługiwała odpowiedź HTTP. */
   request.onreadystatechange=handleResponse;
   alert("reqType=" + reqType);
   alert("url=" + url);
   alert("bool=" + bool);
   request.open(reqType,url,bool);
    alert("a");
   request.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=iso-8859-2");
   request.send(queryString);
}

Zatem responseText/responseXML nie ma tutaj żadnego znaczenia, choć teoretycznie niby masz rację.
slammer
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
  2. /* Funkcja opakowująca do skonstruowania obiektu żądania.
  3. Parametry:
  4. reqType: typ żądania HTTP, na przykład GET lub POST.
  5. url: adres URL programu serwerowego.
  6. asynch: czy żądanie będzie wysłane asynchronicznie, czy też nie. */
  7.  
  8. function httpRequest(reqType,url,asynch){
  9. // Przeglądarki na bazie Mozilli.
  10. if(window.XMLHttpRequest){
  11. request = new XMLHttpRequest();
  12. } else if (window.ActiveXObject){
  13. request=new ActiveXObject("Msxml2.XMLHTTP");
  14. if (! request){
  15. request=new ActiveXObject("Microsoft.XMLHTTP");
  16. }
  17. }
  18. // Jeżeli nie powiodła się nawet inicjalizacja ActiveXObject,
  19. // wówczas żądanie wciąż może być typu null.
  20. if(request){
  21. initReq(reqType,url,asynch);
  22. } else {
  23. alert("Używana przeglądarka nie pozwala na wykorzystanie "+
  24. "wszystkich funkcji tej aplikacji!");
  25. }
  26. }
  27.  
  28. /* Inicjalizacja obiektu żądania, który został już skonstruowany. */
  29. function initReq(reqType,url,bool){
  30. /* Określamy funkcję, która będzie obsługiwała odpowiedź HTTP. */
  31. request.onreadystatechange=handleResponse;
  32. request.open(reqType,url,bool);
  33. request.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=iso-8859-2");
  34. request.send(queryString);
  35. }
  36. function setQueryString(){
  37. queryString="";
  38. var frm = document.forms[0];
  39. var numberElements = frm.elements.length;
  40. for (var i = 0; i < numberElements; i++) {
  41. if(i < numberElements-1) {
  42. queryString += frm.elements[i].name+"="+encodeURIComponent(frm.elements[i].value)+"&";
  43. } else {
  44. queryString += frm.elements[i].name+"="+encodeURIComponent(frm.elements[i].value);
  45. }
  46. }
  47. }
  48. var request;
  49. var queryString;
  50. function sendData(){
  51. setQueryString();
  52. var url="XMLgen.php";
  53. httpRequest("POST",url,true);
  54. }
  55. // Obsługa zdarzeń dla XMLHttpRequest
  56. function handleResponse() {
  57. if(request.readyState == 4){
  58. if(request.status == 200){
  59. alert(request.responseXML);
  60. alert("a");
  61. } else {
  62. alert("Wystąpił problem z komuinkacją między obiektem XMLHttpRequest, a programem serwera.");
  63. }
  64. } // Koniec zewnętrznej pętli if.
  65. }
  66. <meta http-equiv="content-type" content="text/html; charset=iso-8859-2">
  67. <title>Wysyłanie danych</title>
  68. </head>
  69. <h3>Kilka informacji o użytkowniku...</h3>
  70. <form onsubmit="sendData();return false">
  71. <p>Imię: <input type="text" name="firstname" size="20"></p>
  72. <p>Nazwisko: <input type="text" name="lastname" size="20"> </p>
  73. <p>Płeć: <input type="text" name="gender" size="2"> </p>
  74. <p>Kraj pochodzenia: <input type="text" name="country" size="20"> </p>
  75. <p><button type="submit">Wyślij dane</button></p>
  76. </form>
  77. </body>
  78. </html>


U mnie działa bez problemów snitch.gif
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.