2009-08-20 6 views
9

Niektóre tła:Ciekawy: czy możliwe jest posiadanie dynamicznych nazw zmiennych danych Ajax?

Na ostatnim projekcie, próbowałem napisać opływowy jQuery plugin, który będzie obsługiwać kilka połączeń Ajax dokonane po różne komponenty były aktualizowane. Napisałem funkcji JavaScript jako plugin tak, że może po prostu nazwać to na różnych wejść, tak jak poniżej:

$("#email").updateChanges(); 

Następnie od wewnątrz wtyczki, zebrałem id, wartość wejścia, itp

Problem:

Coś, co naprawdę chciałem zrobić, ale nie mogłem znaleźć rozwiązania, było dynamiczne generowanie nazwy zmiennej danych przekazywanej przez ajax.

Aby być bardziej jasne, ponieważ ta funkcja:

jQuery.fn.updateChanges = function(){ 

    this.bind('blur',function(){ 

     var inputName = $(this).attr("name"); 
     var inputValue = $(this).val(); 

     $.post('/ajax/updateValue.php', 
     { email: inputValue }, function(ret){ 
      if (ret=='success') alert("all good!"); 
     } 

    } 

} 

... jak mam przedstawić dane dla wywołania Ajax jako { password: inputValue } zamiast { email: inputValue } gdy zmienna inputName to „hasło” zamiast "e-mail"? Jest to bardzo konkretny przykład, ale w zasadzie po prostu szukam sposobu na odczytanie nazwy zmiennej danych z oddzielnej zmiennej dynamicznej.

Próbowałem window[inputName] bez powodzenia i jestem prawie przekonany, że to niemożliwe. Jeśli jednak ktoś ma pomysł, byłbym pod wrażeniem.

Zamiast tego, zamiast tego musieliśmy użyć { type: inputName, value: inputValue }, ale wymagało to trochę więcej pracy w PHP (nie pytaj mnie, jestem po prostu facetem z przodu).

Z góry dziękuję!

+0

Jak planujesz komunikować żądaną nazwę zmiennej do funkcja? Czy to będzie parametr? – JorenB

Odpowiedz

20

Jeśli rozumiem zostanie poprawnie, to co jesteś po:

jQuery.fn.updateChanges = function(){ 

    this.bind('blur',function(){  

     var data = {}; 
     data[$(this).attr("name")] = $(this).val(); 

     $.post('/ajax/updateValue.php', 
     data, 
     function(ret){ 
      if (ret=='success') alert("all good!"); 
     }  
    }  
} 

Twoim głównym problemem próbował użyć wartości dynamicznej przy użyciu obiektu dosłownego zapisu, coś, czego nie może się obejść bez powrotu do naprawdę źle praktyki (jak użycie eval() gdzie eval() nie pasuje;).

var myObj = { 'n1': 'v1' }; 

odpowiada:

var myObj = {}; // {} = new Object(); 
myObj['n1'] = 'v1'; 

odpowiada:

var myObj = {}, 
    myKey = 'n1', 
    myVal = 'v1'; 

myObj[myKey] = myVal; 
+0

Wow, to świetnie. Dokładnie to, czego szukałem. O wiele więcej do nauki! –

+0

(I dziękuję bardzo, Lior!) –

-1

spróbować z tym:

jQuery.fn.updateChanges = function(){ 

    this.bind('blur',function(){ 

     var inputName = $(this).attr("id"); 
     var inputValue = $(this).val(); 
     var data = eval("{"+ inputName +":"+ inputValue +" }"); 

     alert("send: "+ inputName+"\n"+data[inputName]); 

     $.post('/ajax/updateValue.php', 
     data, function(ret){ 
      if (ret=='success') alert("all good!"); 
     } 

    } 

} 
+2

eval jest powolny, brudny i niebezpieczny. Unikaj tego. – Quentin

+1

ok, przekażemy go do John Resig w celu zmiany linii 3725 "jQuery-1.3.2.js" -> 'window ["eval"]'. Z twojego powodu chyba nikt nie używa jQuery. Kto ma rację ?. Okno ["eval"] zwraca natywną "eval()" –