Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Prototype][JSON] Ajax.Request i głupie .each
Forum PHP.pl > Forum > Przedszkole
Victor152
Na początku jak jest teraz i działa.
PHP generuje mi coś w stylu:
Kod
[{"address":"127.0.0.1:27015","hostname":"Orzeszek #1 FFA [s+ns] (only de_dust2)","map":"de_dust2"}]


Kod js, który to obrabia:
[JAVASCRIPT] pobierz, plaintext
  1. function updateServersStats() { new Ajax.Request('/serversstats.php', {
  2. 'method': 'get',
  3. onSuccess: function(transport) {
  4. var json = transport.responseText.evalJSON();
  5.  
  6. string = '';
  7. $H(json).each(function(server)
  8. {
  9. string += 'blablabla. kazdy element tablicy ma swoje blablabla';
  10. })
  11.  
  12. $('cat_serversstats_e').innerHTML = string;
  13. }); }
  14. updateServersStats();
[JAVASCRIPT] pobierz, plaintext


Lecz, gdy zmienie troche kod, zamiast enkodowania:
  1. $servers_s[] = array($gametype, $b[0], $b[1]);

Dam np...
  1. $servers_s[$server['address']] = array($gametype, $b[0], $b[1]);


A wtedy JSON zamienia sie na:
Kod
{"91.121.112.144:27015":{"address":"127.0.0.1:27015","hostname":"Orzeszek #1 FFA [s+ns] (only de_dust2)","map":"de_dust2"}}


To już powyższy kod js, obrabiający JSONa nie działa. Podejrzewam, że te each coś nie działa.

Macie jakieś rozwiązanko?
pepkin88
Tak naprawdę, to pierwszy JSON powinien być niewłaściwie parsowany.
Zauważ, że w pierwszym przypadku masz tablicę z jednym elementem: obiektem.
W drugim masz już obiekt (tablicę asocjacyją).

Zatem w pierwszym przypadku $H(tablica).each przeleci nie tylko po iteracjach tablicy, ale także po wszystkich metodach obiektu typu tablica (Array), których Prototype trochę dodał.
everth
Może to ci coś pomoże - zamiast each():
[JAVASCRIPT] pobierz, plaintext
  1. for (key in json) {
  2. server = json[key];
  3. string += 'blablabla. kazdy element tablicy ma swoje blablabla';
  4. }
[JAVASCRIPT] pobierz, plaintext


@DOWN: Tak więc problem specyficzny dla Prototype. Nie używałem i sugerowałem się składnią jQuery.
pepkin88
Efekt będzie taki sam. Jeżeli for in przeleci po tablicy to uwzględni też wszystkie metody dodane do prototypu Array, a biblioteka Prototype takowe dodała.

Należy więc uważać i stosować $A i $H odpowiednio dla tablic i obiektów (tablic asocjacyjnych, hash tablic).

PS: Wszystkie zmienne deklaruj przez var, dzięki temu będą one miały zasięg prywatny, a nie globalny.
Victor152
Tak, więc zmiana w "źródle", żeby była tabliczka asosacyjna (tj. to opisywałem), potem zmiana H na A i powinno działać?
W każdym bądź razie o dziwo tak nie jest. Czy H, czy A, to i tak kod wewnątrz pętli .each się nie wykonuje. Nie wazne czy to alert(server), czy to alert("test123");.
Po prostu nic.

#Edit:
A raczej nazwy nie podobają mu się jako klucze kolejnych tablic. Numerki bez problemu.


Jednak nadal są problemy, nawet z liczbami.
pepkin88
Na odwrót: $A - Array - do tablic; $H - Hash - do tablic asocjacyjnych.

Więc piszesz, że nic się nie wyświetla?
Sprawdź, np. alertem, czy i w jakiej postaci jest przesyłany ten JSON ( alert(transport.responseText); ).

Bo kod jest dobry (jeżeli A i H nie są pomylone) i powinno to działać (u mnie działa, po przepisaniu samego JSONa - nie symulowałem samej ajaxowej transakcji).

Aha, jeszcze pamiętaj o średnikach, teoretycznie JavaScript sam uzupełnia brakujące średniki, ale nie zawsze podejmie właściwą decyzję, czy rzeczywiście tego średnika brakuje, czy nie ma go tam być.
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.