#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. Самозависимые функции вызываются в зависимости от того, где они находятся. Если в цикле или функции они вызываются каждый раз. Вы часто видите их как глобальные, и в этом случае они вызываются только один раз. Приветствия.