Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [JS] przekazywanie tablicy jako parametr funkcji, przekazywane nieporzadane dane
iwosz
post 28.01.2011, 13:21:57
Post #1





Grupa: Zarejestrowani
Postów: 62
Pomógł: 3
Dołączył: 30.07.2009

Ostrzeżenie: (0%)
-----


Witam,

łącze się z takim problemem iż mam funkcję do której przekazuję tablicę jako parametr, a dokładnie tablicę parametrów np:

Kod
var params = new Array();
params['p1'] = 1;
params['p2'] = 2;
params['text'] = 'text';
params['last_param'] = 0;

function postParams( params ) {
    var params_string = "";
    for(name in params) {
        params_string += "&"+name+"="+params[name];
    }
    // i dalej przesylamy ajaxem parametry...
}


problem polega na tym, że w tej tablicy czasem w ostatnim elemencie przesyłają się nieporządane dane, typu params['nazwa_jakiejś_funkcji'] = cialo_jakiejś_funkcji blinksmiley.gif przykład:

Kod
ajax_post.php?p1=1&p2=2&text=text&remove=function (b) {  var a = this.indexOf(b);  if (a != -1) {  this.splice(a, 1);  }  return this; }&sortDates=function () {  return this.sort(function (a, b) {return a.getTime() - b.getTime();}); }&last_param=0

i z niewinnie wyglądającej tablicy tworzy mi się jakiś potwór!? blinksmiley.gif

Czy to może być związane z przeglądaniem tablicy for'em ? Jak to jest możliwe że w wyjściowym stringu oprócz zdefiniowanych parametrów mam jeszcze jakiś szit?

Z góry dzięki za odp!

Pozdrawiam.

Ten post edytował iwosz 28.01.2011, 13:28:06


--------------------
Pozdrawiam,

iwosz.
Go to the top of the page
+Quote Post
melkorm
post 28.01.2011, 13:36:10
Post #2





Grupa: Zarejestrowani
Postów: 1 366
Pomógł: 261
Dołączył: 23.09.2008
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


Ponieważ zwraca Tobie też metody obiektu Array, możesz dać warunek że tylko gdy name jest stringiem, lub użyć normalnej konstrukcji for'a.

Ten post edytował melkorm 28.01.2011, 13:37:13


--------------------
Go to the top of the page
+Quote Post
cojack
post 28.01.2011, 13:41:12
Post #3





Grupa: Zarejestrowani
Postów: 898
Pomógł: 80
Dołączył: 31.05.2008

Ostrzeżenie: (20%)
X----


http://wstaw.org/m/2011/01/28/js.png coś knocisz.


--------------------
cojack blog - mój blog (na jakiś czas off).
"jak czegoś nie wiem, to nie myślę że wiem" - moja domena
Go to the top of the page
+Quote Post
iwosz
post 28.01.2011, 13:50:31
Post #4





Grupa: Zarejestrowani
Postów: 62
Pomógł: 3
Dołączył: 30.07.2009

Ostrzeżenie: (0%)
-----


Cytat(melkorm @ 28.01.2011, 13:36:10 ) *
Ponieważ zwraca Tobie też metody obiektu Array, możesz dać warunek że tylko gdy name jest stringiem, lub użyć normalnej konstrukcji for'a.


Hmm, no tak ale czemu zmienna 'params' przechowuje tez te metody jako kolejne wartości tablicy? Rozumiem że to jest instancja typu Array i można dla niej wywołać dane metody, ale to nie powinno wpływać na wartości tablicy, czy nie mam racji?

Co do zwykłego for'a to jak mogę odczytać indeksy tablicy aby skleić poprawny string z parametrami bo nie widzę tego w dokumentacji JS? Poza tym skoro tablica zawiera także metody obiektu Array to nie ważne w jaki sposób będziemy tą zmienna przeglądać, zawsze natrafimy na te niechciane rekordy, tak?

czyli gdybyśmy użyli PHP'owej funkcji print_r() na zmiennej 'params' otrzymali byśmy:
Kod
params => Array(
    'p1' => 1,
    'p2' => 2,
    'text' => 'text',
    'remove' => function() { .. },
    'sortDates' => function() { .. }
)

tak? to jakiś absurd... blinksmiley.gif

Dzięki za odp! smile.gif

ps. cojack: hmm, też mi się wydaję że powinno być tak jak u Ciebie, to logiczne, zastanawiam się czy może zmienna 'params' nie jest nadpisywana gdzieś wcześniej w kodzie, szukam...

Ten post edytował iwosz 28.01.2011, 13:53:11


--------------------
Pozdrawiam,

iwosz.
Go to the top of the page
+Quote Post
melkorm
post 28.01.2011, 14:02:04
Post #5





Grupa: Zarejestrowani
Postów: 1 366
Pomógł: 261
Dołączył: 23.09.2008
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


Hum, pomyliłem się, ale to z pośpiechu bo też kiedyś miałem taki problem, ale teraz testuję i za nic nie mogę uzyskać tego samego, możliwe że tej zmiennej params są przypisane jakieś metody gdzieś?
Może używasz jakiegoś FW do JS'a?


Edit: no i już wiem, najwidoczniej Prototype dopisuje swoje metody do obiektu Array stąd takie błędy smile.gif Zmień Framework na jQuery i będzie git smile.gif

Ten post edytował melkorm 28.01.2011, 14:04:48


--------------------
Go to the top of the page
+Quote Post
iwosz
post 28.01.2011, 14:13:39
Post #6





Grupa: Zarejestrowani
Postów: 62
Pomógł: 3
Dołączył: 30.07.2009

Ostrzeżenie: (0%)
-----


Cytat(melkorm @ 28.01.2011, 14:02:04 ) *
no i już wiem, najwidoczniej Prototype dopisuje swoje metody do obiektu Array stąd takie błędy smile.gif


Hm, no tak, ale czemu wartości tablicy są nadpisywane? Zastanawia mnie jak to jest możliwe i czy powinno tak być...

Cytat(melkorm @ 28.01.2011, 14:02:04 ) *
Zmień Framework na jQuery i będzie git smile.gif


Akurat korzystam z jQuery winksmiley.jpg też testuje i wygląda na to że ta zmienna jest wcześniej nadpisywana... jak będę wiedział an 100% to dam znać!

Ten post edytował iwosz 28.01.2011, 14:17:57


--------------------
Pozdrawiam,

iwosz.
Go to the top of the page
+Quote Post
everth
post 28.01.2011, 14:18:55
Post #7





Grupa: Zarejestrowani
Postów: 782
Pomógł: 153
Dołączył: 21.07.2010

Ostrzeżenie: (0%)
-----


Cytat
tak? to jakiś absurd...

To jest normalne zachowanie - tablica w JS nie przechowuje pary klucz=>wartość, tylko same wartości (z liczbą porządkową jako kluczem), gdy ty próbujesz coś takiego
[JAVASCRIPT] pobierz, plaintext
  1. params = new Array();
  2. params.push('hihi');
  3. params.push('hehe');
  4. // Co jest równoznaczne z:
  5. params = ['hihi,'hehe'];
[JAVASCRIPT] pobierz, plaintext

to masz tablicę. Gdy robisz tak:
[JAVASCRIPT] pobierz, plaintext
  1. params['to'] = 'hihi';
  2. params['tamto'] = 'hehe'
  3. // Co jest równoznaczne z:
  4. params = {'to':'hihi','tamto':'hehe'};
[JAVASCRIPT] pobierz, plaintext

To już nie przyporządkowujesz wartości w tablicy, tylko właściwości obiektu typu Array. A to już zupełnie inna rzecz. Pętla for () in () działa tutaj dlatego że przechodzi przez wszystkie metody i właściwości w obiekcie (bez znaczenia na klasę). Sprawdź sobie wartość length tej tablicy - powinieneś zrozumieć.

A dalej nie rozumiem dlaczego dostajesz dodatkowe metody - pewnie dopisujesz je gdzieś wcześniej, albo to pochodna jakiegoś FW.


--------------------
Już mi się ani wiedzieć, ani tym bardziej myśleć nie chce.
[Think different]!
Go to the top of the page
+Quote Post
melkorm
post 28.01.2011, 14:19:56
Post #8





Grupa: Zarejestrowani
Postów: 1 366
Pomógł: 261
Dołączył: 23.09.2008
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


Nie są nadpisywane, zauważ że zwraca Tobie poprawnie, tylko leci dalej po funkcjach dlatego masz remove=function().... itp.

To może gdzieś indziej "coś" dopisuje Tobie funkcje do obiektu Array? ale jak już mówiłem prosty warunek na wartość że nie jest obiektem powinien załatwić sprawę, chociaż problem będzie gdy parametr będzie obiektem, hehe.


Btw. Jeżeli używasz jQuery, to czemu nie zrobisz:

Kod
// dałem tu obiekt, ale z tablicą też powinien sobie poradzić;)
var params = {
a: 'b',
'b': 1
};

$.each(params, function(key,val)
{
alert(val);
}
);


Ten post edytował melkorm 28.01.2011, 14:21:50


--------------------
Go to the top of the page
+Quote Post
iwosz
post 28.01.2011, 14:27:13
Post #9





Grupa: Zarejestrowani
Postów: 62
Pomógł: 3
Dołączył: 30.07.2009

Ostrzeżenie: (0%)
-----


Cytat(everth @ 28.01.2011, 14:18:55 ) *
To jest normalne zachowanie - tablica w JS nie przechowuje pary klucz=>wartość, tylko same wartości (z liczbą porządkową jako kluczem), gdy ty próbujesz coś takiego
[JAVASCRIPT] pobierz, plaintext
  1. params = new Array();
  2. params.push('hihi');
  3. params.push('hehe');
  4. // Co jest równoznaczne z:
  5. params = ['hihi,'hehe'];
[JAVASCRIPT] pobierz, plaintext

to masz tablicę. Gdy robisz tak:
[JAVASCRIPT] pobierz, plaintext
  1. params['to'] = 'hihi';
  2. params['tamto'] = 'hehe'
  3. // Co jest równoznaczne z:
  4. params = {'to':'hihi','tamto':'hehe'};
[JAVASCRIPT] pobierz, plaintext

To już nie przyporządkowujesz wartości w tablicy, tylko właściwości obiektu typu Array. A to już zupełnie inna rzecz. Pętla for () in () działa tutaj dlatego że przechodzi przez wszystkie metody i właściwości w obiekcie (bez znaczenia na klasę). Sprawdź sobie wartość length tej tablicy - powinieneś zrozumieć.

A dalej nie rozumiem dlaczego dostajesz dodatkowe metody - pewnie dopisujesz je gdzieś wcześniej, albo to pochodna jakiegoś FW.


OK, dzięki za wyjaśnienie właśnie, teraz wszystko rozumiem. smile.gif Te metody muszą być gdzieś wcześniej dopisane do zmiennej z taką samą nazwą (tak mniemam).

melkorm: masz rację, to jest stary kod, ja go próbuję 'rewitalizować' i na pewno zrobię tak jak doradziłeś, poprostu zatrzymałem się na tej nieszczęsnej tablicy winksmiley.jpg

Tam Wam kliknąłem że pomogliście, dzięki! smile.gif

Ten post edytował iwosz 28.01.2011, 14:30:45


--------------------
Pozdrawiam,

iwosz.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 3.05.2025 - 04:49