jQuery,AJAX,JSONP:即使它是空的,如何实际发送数组?

27 javascript jquery json

我已经阅读过这些问题,但没有一个能满足我的需求:

(最新的一个说只是添加硬编码的引号,['']但我不能这样做,我正在调用一个返回数组的函数)

所以这是我的代码(注意问题在于空数组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');
      }   
    }   
  }); 
}
Run Code Online (Sandbox Code Playgroud)

简单呃?这是我的Php代码:

echo '_POST='.var_export($_POST,true)."\n";
Run Code Online (Sandbox Code Playgroud)

这是结果:

_POST=array (
)
jQuery1710713708313414827_1329923973282(...)
Run Code Online (Sandbox Code Playgroud)

如果我将空数组更改为非空,即:

'tab':new Array({ 't':'u' },{ 'v':'w' })
Run Code Online (Sandbox Code Playgroud)

结果是:

_POST=array (
  'tab' => 
  array (
    0 => 
    array (
      't' => 'u',
    ),
    1 => 
    array (
      'v' => 'w',
    ),
  ),
)
jQuery1710640656704781577_1329923761425(...)
Run Code Online (Sandbox Code Playgroud)

所以这显然意味着当要发送一个空的Array()时,它会被忽略,并且它不会被添加到POST变量中.

我错过了什么吗?

PS:我的jQuery版本来自最新的谷歌CDN,即:

http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js

http://ajax.googleapis.com/ajax/libs/jqueryui/1/jquery-ui.min.js

我希望发送数组,即使它是空的(=发送[])!有解决方案吗 任何的想法?我已经尝试添加此选项traditional: true但没有成功.

Pat*_*and 19

问题是你无法真正发送空数组.您是否尝试手动发送空数组?那个uri看起来怎么样(注意这与POST的推理相同)?

/path?arr[]
Run Code Online (Sandbox Code Playgroud)

这将导致$ _GET像这样:

array (
 'arr' => array (
    0 => ''
  )
)
Run Code Online (Sandbox Code Playgroud)

这不是一个空阵列,是吗?它是一个包含空字符串的单个元素的数组.那么jQuery做了什么,我会同意这是处理它的正确方法,就是不发送任何东西.

这实际上非常简单,您可以检查服务器.只需添加额外检查参数是否存在,即:

$tabs = array();
if(isset($_POST['tab'])) {
  $tabs = $_POST['tab'];
}
Run Code Online (Sandbox Code Playgroud)

  • 那么,从你的角度来看,这是一种正常的行为吗?我的意思是,也许听起来它与Php中的GET/POST原则保持"同质",但是,即使它保持"同质",从"理性"的观点来看这也不正常. (4认同)
  • 所以我所做的是:如果param不存在,我只需将其设置为空数组,最后的结果是它清空了实际的数组.所以,如果黑客尝试没有param的`wget`,那么篮子将被清空,而(我认为)它应该返回错误. (2认同)
  • 当用户点击JavaScript中的图片从篮子中删除某些内容时,就会发生这种情况.如果篮子是空的,仍然将"空篮子"作为POST发送. (2认同)