Метод jQuery ajax не передает ключ post data при использовании анонимной функции

#javascript #php #jquery #ajax

#javascript #php #jquery #ajax

Вопрос:

Я пытался отправить один из параметров key to data в качестве анонимной функции, но какой бы тип данных она ни возвращала, Jquery не передает его на сервер.

Примеры:

 $.ajax({
    type: 'post',
    url: 'http://host.com/cart',
    dataType: 'html',
    data: {
        'quantity': function () {
            var return_obj = [];
            return_obj['1:YTowOnt9'] = '1';
            return return_obj;
        },
        'action': 'cart-update-quantity'
    },
    success: function(data) {
        console.log(data);
    }
});
  

у этого есть action ключ POST, однако quantity ключ является пустой строкой. Я пробовал также как строку и объект.

Этот пример работает:

 $.ajax({
    type: 'post',
    url: 'http://host.com/cart',
    dataType: 'html',
    data: {
        'quantity': {
            '1:YTowOnt9': '1'
        },
        'action': 'cart-update-quantity'
    },
    success: function(data) {
        console.log(data);
    }
});
  

Как я могу отправить анонимную функцию на quantity ключ в данных? Анонимная функция будет получать некоторые входные данные формы динамически. Я также пробовал jQuery serializeArray , но он отправляет данные неправильно.

Комментарии:

1. Почему вы хотите поместить туда функцию? Просто передайте динамический объект, который создается перед ajax вызовом.

2. Не злоупотребляйте массивами! Особенно jQuery будет подавляться этим.

3. @Bergi: Спасибо, что указали на это. Для меня значение Array.length равно нулю для не числовых ключей — это важный момент.

Ответ №1:

Вам не нужно откладывать выполнение анонимной функции, поэтому просто немедленно вызовите ее, чтобы вернуть ваш объект:

 $.ajax({
    type: 'post',
    url: 'http://host.com/cart',
    dataType: 'html',
    data: {
        'quantity': (function () {
            var return_obj = {};
            return_obj['1:YTowOnt9'] = '1';
            return return_obj;
        })(),
        'action': 'cart-update-quantity'
    },
    success: function(data) {
        console.log(data);
    }
});
  

Это называется IIFE (выражение функции, вызываемое немедленно).

В качестве альтернативы, просто создайте объект перед вызовом Ajax.. В любом случае ошибка заключалась в передаче функции, а не результата функции.

* Примечание: Этот код включает в себя редактирование с помощью Bergi для создания объекта (с {} ) вместо массива (с [] )

Вы, конечно, можете просто использовать IIFE для анонимного объявления объекта:

 'quantity': (function () {
        return {'1:YTowOnt9': '1'};
    })(),
  

Комментарии:

1. Ваш код заработал сразу. Я также нашел это в качестве того же примера. Я думал, что самозапускаемые функции будут вызывать себя только один раз. Однако наличие ajax в функции будет вызывать IIFE каждый раз, когда я вызываю основную функцию, правильно?

2. Самозависимые функции вызываются в зависимости от того, где они находятся. Если в цикле или функции они вызываются каждый раз. Вы часто видите их как глобальные, и в этом случае они вызываются только один раз. Приветствия.