JQuery, AJAX, JSONP: как отправить массив, даже если он пуст?
Я уже прочитал эти вопросы, но никто из них не ответил на мои потребности:
(последний сказал, что просто добавьте закодированные кавычки, т.е. ['']
, но я не могу этого сделать, я вызываю функцию, возвращающую массив)
Итак, вот мой код (обратите внимание, что проблема кроется в пустом массиве new Array()
):
function AjaxSend() {
$.ajax({
url: '/json/myurl/',
type: 'POST',
dataType: 'jsonp',
data : { 'tab':new Array() },
context: this,
success: function (data) {
if (data.success) {
console.log('ok');
}
else {
console.log('error');
}
}
});
}
Простой а?
Здесь мой код Php:
echo '_POST='.var_export($_POST,true)."\n";
И вот результат:
_POST=array (
)
jQuery1710713708313414827_1329923973282(...)
Если я изменю пустой массив на непустую, то есть:
'tab':new Array({ 't':'u' },{ 'v':'w' })
Результат:
_POST=array (
'tab' =>
array (
0 =>
array (
't' => 'u',
),
1 =>
array (
'v' => 'w',
),
),
)
jQuery1710640656704781577_1329923761425(...)
Таким образом, это явно означает, что при отправке пустого массива() он игнорируется и не добавляется к переменным POST.
Я что-то пропустил?
PS: моя версия jQuery - из последней версии CDN i.e.:
http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js
и
http://ajax.googleapis.com/ajax/libs/jqueryui/1/jquery-ui.min.js
Я хочу, чтобы массив отправлялся, даже если он пуст (= send []
)!
Любое решение? Есть идеи? Я уже пытался добавить эту опцию traditional: true
без успеха.
Ответы
Ответ 1
Проблема в том, что вы не можете отправить пустой массив. Вы пытались отправить пустой массив вручную? Как бы выглядел этот uri (обратите внимание, что это то же самое для POST)?
/path?arr[]
Это приведет к $_GET следующим образом:
array (
'arr' => array (
0 => ''
)
)
Это не пустой массив, не так ли? Это массив с одним элементом пустой строки. Итак, что делает jQuery, и я бы согласился с тем, что это правильный способ обращения с ним, вовсе не отправлять ничего.
Это действительно очень просто проверить на сервере. Просто добавьте дополнительную проверку, существует ли параметр или нет: i.e:
$tabs = array();
if(isset($_POST['tab'])) {
$tabs = $_POST['tab'];
}
Ответ 2
Try
PHP
<?php
// `echo.php`
if (isset($_POST["emptyArray"])) {
function arr() {
$request = $_POST["emptyArray"];
if(is_array($request) && count($request) === 0) {
// do stuff
echo $request;
};
};
arr();
};
JS
$.post("echo.php", {"emptyArray":[]}
, function (data, textStatus, jqxhr) {
if (textStatus === "success" && data.length === 0) {
// do stuff
console.log(data.length === 0 ? new Error("error").message : data);
};
});
jsfiddle http://jsfiddle.net/guest271314/Lf6GG/