JQuery, AJAX, JSONP: comment envoyer effectivement un tableau même s'il est vide?

J'ai déjà lu ces questions, mais aucune d'entre elles ne répond à mon besoin:

  • Test d'un objet de tableau vide dans JSON avec jQuery
  • JQuery 1.4.4+ demande AJAX – afficher un tableau vide ou un objet devient une chaîne
  • Impossible d'accéder aux données de la requête jQuery Ajax, renvoie un tableau vide
  • JQuery supprime les tableaux vides lors de l'envoi

(Le dernier a dit simplement ajouter des citations codées, c'est-à-dire [''] mais je ne peux pas le faire, j'appelle une fonction qui renvoie une matrice)

Alors voici mon code (notez que le problème réside dans le tableau vide 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'); } } }); } 

Simple eh? Voici mon code Php:

 echo '_POST='.var_export($_POST,true)."\n"; 

Et voici le résultat:

 _POST=array ( ) jQuery1710713708313414827_1329923973282(...) 

Si je change le tableau vide par un non-vide, c'est-à-dire:

 'tab':new Array({ 't':'u' },{ 'v':'w' }) 

Le résultat est:

 _POST=array ( 'tab' => array ( 0 => array ( 't' => 'u', ), 1 => array ( 'v' => 'w', ), ), ) jQuery1710640656704781577_1329923761425(...) 

Donc, cela signifie clairement que lorsqu'il y a un tableau vide () à envoyer, il est ignoré, et il n'est pas ajouté aux variables POST .

Est-ce que je manque quelque chose?

PS: ma version jQuery provient du dernier CDN de google:

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

et

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

Je veux que le tableau soit envoyé, même s'il est vide (= send [] )! Toute solution? Une idée? J'ai déjà essayé d'ajouter cette option traditional: true sans succès.

Le problème est que vous ne pouvez pas vraiment envoyer un tableau vide. Avez-vous essayé d'envoyer manuellement un tableau vide? Comment cet aspect uri (notez-vous que c'est le même raisonnement pour POST)?

 /path?arr[] 

Cela entraînerait un $ _GET comme ceci:

 array ( 'arr' => array ( 0 => '' ) ) 

Ce n'est pas vraiment un tableau vide, n'est-ce pas? C'est un tableau avec un seul élément d'une chaîne vide. Alors, qu'est-ce que jQuery fait, et je suis d'accord pour dire que c'est la bonne façon de le gérer, c'est ne rien envoyer.

C'est vraiment très simple pour vous de vérifier sur le serveur. Ajoutez simplement un contrôle supplémentaire si le paramètre existe ou non, c'est-à-dire:

 $tabs = array(); if(isset($_POST['tab'])) { $tabs = $_POST['tab']; } 

essayer

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/