2009-08-20 13 views
9

Alcuni retroscena:Curioso: è possibile avere nomi di variabili dati Ajax dinamici?

In un recente progetto, ho provato a scrivere un plugin jQuery snella che avrebbe gestito alcune chiamate Ajax fatte quando i vari ingressi sono stati aggiornati. Ho scritto la funzione JavaScript come un plugin in modo che ho potuto solo chiamare input diversi, in questo modo:

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

Poi, dall'interno del plug-in, ho raccolto id, il valore dell'ingresso, ecc

Il problema:

Qualcosa che volevo davvero fare, ma non ho trovato una soluzione, era generare dinamicamente il nome della variabile di dati che si passa attraverso ajax.

Per essere più chiari, dato questa funzione:

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!"); 
     } 

    } 

} 

... come faccio a presentare i dati per la chiamata Ajax come { password: inputValue } invece di { email: inputValue } quando la variabile inputName è "password" invece di "e-mail"? Questo è un esempio molto specifico, ma fondamentalmente sto solo cercando un modo per leggere il nome della variabile di dati da una variabile dinamica separata.

Ho provato window[inputName] senza fortuna, e sono praticamente convinto che questo sia impossibile. Tuttavia, se qualcuno ha un'idea, sarei molto colpito.

Per inciso, abbiamo finito con lo { type: inputName, value: inputValue } invece, ma ha richiesto un po 'più di legwork sul lato PHP (non chiedermelo, sono solo il front-end :).

Grazie in anticipo!

+0

Come si sta progettando di comunicare il nome della variabile desiderata per la funzione? Sarà un parametro? – JorenB

risposta

20

Se ho capito bene, questo è quello che stai dopo:

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!"); 
     }  
    }  
} 

Il tuo problema principale stava tentando di utilizzare un valore dinamico utilizzando la notazione letterale oggetto, qualcosa che non può fare a meno di ritornare al davvero male pratiche (come l'utilizzo di eval() dove eval() non appartiene;).

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

è equivalente a:

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

è equivalente a:

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

myObj[myKey] = myVal; 
+0

Wow, è grandioso. Esattamente quello che stavo cercando. Molto più da imparare! –

+0

(E grazie mille, Lior!) –

-1

provare con questo:

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 è lento, sporco e pericoloso. Evitalo. – Quentin

+1

ok, lo inoltreremo a John Resig per modificare la riga di 3725 "jQuery-1.3.2.js" -> 'window ["eval"]'. A causa tua, credo che nessuno usi jQuery. Chi ha ragione ?. window ["eval"] restituisce il nativo "eval()" –

Problemi correlati