Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [js][ajax][php][xml] Wartość zwrotna tablicą
Forum PHP.pl > Forum > Przedszkole
Hazel
Witam.
Mam ciężką sytuację, dość dziwną.
Posiadam kod JS pewnej aplikacji. Nie mogę go zmienić, po prostu go znam. I w tym cały problem - bez zmian kodu JS mam do tego dopisać kod działający po stronie serwera, w PHP.

Fragment funkcji dołączonej do zdarzenia onreadystatechange wygląda tak:
Kod
  if(request.readyState == 4){
        if(request.status == 200){
    if(formObjTyp.length > 0 && formObjTyp == "input"){
      var resp =  request.responseText;
    // Wartość zwrotna jest tablicą.
    var func = new Function("return "+resp);
    var objt = func();
    var sel = document.createElement("select");
    sel.setAttribute("name","countries");
    createOptions(sel,objt);
    var newsel = document.getElementById("newsel");
    reset(newsel);
    newsel.appendChild(sel);
}


Sęk tkwi w funkcji createOptions:
Kod
function createOptions(sel, _options)
{
    if (_options == null || _options.length == 0)
    {
        return;
    }
    var opt = null;
    for (var i = 0; i < _options.length; i++)
    {
        opt=document.createElement("option");
        opt.appendChild(document.createTextNode(_options[i]));
        sel.appendChild(opt);
    }
}


Nie mogę zmienić tego kodu. No a funkcja createOptions() spodziewa się tablicy jako drugiego parametru. Teraz pytanie, jak ułożyć taki kod PHP, żeby w zmiennej objt była tablica... blinksmiley.gif

Jeśli chodzi o mój wysiłek, to próbowałem z XML. Ale wtedy krzaczy się konstruktor Function("return" +resp), chyba że coś źle robiłem...
nevt
tego w ogóle nie rozumiem...
Kod
var resp =  request.responseText;
...
var func = new Function("return "+resp);
var objt = func();
...
createOptions(sel,objt);

dlaczego nie po prostu
Kod
var resp =  request.responseText;
...
createOptions(sel, resp);


a co do tekstu zwracanego przez PHP to musi on mieć składnię JS Array, czyli coś w rodzaju
Kod
{ 0:'wartosc 1', 1:'wartosc 2', 2:'wartosc 3', ... }
Hazel
No, hehe, mamy podobne zdanie.
Kodu JS nie tworzyłem ja, dałem go tak jak jest - też mnie zdziwiła obecność zupełnie niepotrzebnego konstruktora funkcji, ale myślałem że się nie znam tongue.gif A ten konstruktor mi strasznie psuł koncepcję.

No dobra, zrobiłem tak, że linia zwracająca tego konstruktora wygląda tak:
return { 0: 'wartosc1', 1: 'wartosc2', 2: 'wartosc3' }

Ale jak kontroluję właściwość length zmiennej, która otrzymuje taką wartość, to jest to 47, czyli widzi ciąg, a nie tablicę. Zresztą, abstrakcyjnie oderwany od projektu kod:

  1. var objt = false;
  2. function zwroc()
  3. {
  4. return { 0: 'wartosc 1', 1: 'wartosc 2', 2: 'wartosc 3' };
  5. }
  6. function przypisz()
  7. {
  8. objt = zwroc();
  9. }
  10. <button onclick="przypisz();alert(objt.length);">


zwraca niestety undefined. Na logikę powinien chyba zwrócić ilość elementów tablicy, czyli 3. A dokładnie o coś takiego chodzi w tamtym kodzie, z którym pracuję. Coś robię nie tak?
nevt
a spróbuj zwrócić z php ciąg:
Kod
new Array('ala', 'ma', 'kota');
// albo
new Array(1, 2, 3);

chyba właśnie po to jest ten manewr z nienazwaną funkcją, żeby można wprost przypisać kod JS ...
Hazel
Haa, dokładnie biggrin.gif
W tym momencie też to zrozumiałem smile.gif

Dzięki wielkie. Działa.

Napiszę jeszcze, że właściwość length zmiennej zawierajacej responseText to 31, czyli widzi ciąg. Natomiast jak przepuszczę to przez anonimową funkcję, to się robi ilość elementów tablicy zamiast długości ciągu. Dokładnie o to chodziło.
Pozdrawiam.
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.