Любопытно: возможно ли иметь динамические имена переменных данных Ajax? - PullRequest
9 голосов
/ 20 августа 2009

Некоторый фон:

В недавнем проекте я попытался написать модернизированный плагин 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 (не спрашивайте меня, я просто фронтенд :)).

Заранее спасибо!

Ответы [ 2 ]

20 голосов
/ 20 августа 2009

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

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 голосов
/ 20 августа 2009

попробуйте с этим:

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

   }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...