2009-08-20 2 views
9

Некоторые фона:Любопытно: возможно ли иметь динамические имена переменных данных Ajax?

На недавнем проекте я попытался написать обтекаемый JQuery плагин, который будет обрабатывать некоторые Ajax звонки, когда были обновлены различные входы. Я написал функцию JavaScript как плагин, так что я мог бы назвать его просто на различные входы, например, так:

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

Затем внутри плагина, я собрал на вход идентификационному, значение и т.д.

Проблема:

Что-то, что я действительно хотел сделать, но не смог найти решение, состоял в том, чтобы динамически генерировать имя переменной данных, передаваемой через ajax.

Чтобы быть более понятным, учитывая эту функцию:

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

    } 

} 

... как я могу представить данные для вызова Ajax, как { password: inputValue } вместо { email: inputValue }, когда переменная InputName является «пароль» вместо "Эл. адрес"? Это очень конкретный пример, но в основном я просто ищу способ прочитать имя переменной данных из отдельной динамической переменной.

Я пробовал window[inputName] не повезло, и я почти уверен, что это невозможно. Однако, если у кого-то есть идея, я буду очень впечатлен.

Кстати, в итоге мы закончили с { type: inputName, value: inputValue }, но для него потребовалось немного больше работы на стороне PHP (не спрашивайте меня, я просто фронтмен :).

Заранее благодарен!

+0

Как вы планируете общаться желаемое имя переменной функция? Будет ли это параметром? – JorenB

ответ

20

Если я вас правильно понял, это то, что вы после:

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

Ваш главный вопрос пытается использовать динамическое значение, используя объектную буквального обозначения, что вы не можете обойтись без возврата к очень плохо (например, использование eval(), где eval() не принадлежит;).

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

эквивалентно:

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

эквивалентно:

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

myObj[myKey] = myVal; 
+0

Ничего себе, это здорово. Именно то, что я искал. Намного больше учиться! –

+0

(И спасибо большое, Лиор!) –

-1

попробовать с этим:

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 медленный, грязный и опасный. Избегай это. – Quentin

+1

ОК, мы отправим его Джону Ресигу для изменения в строке 3725 «jQuery-1.3.2.js» -> 'window ["eval"]'. Из-за вас я думаю, что никто не использует jQuery. Кто такой? window ["eval"] возвращает родной "eval()" –

Смежные вопросы