web-dev-qa-db-fra.com

taille maximale de l'objet javascript

J'essaie de passer une variable JavaScript côté serveur en utilisant jquery.ajax méthode.

J'essaie de créer une chaîne json, mais lorsque la longueur de la variable atteint 10000, plus aucune donnée n'est ajoutée à la chaîne.

var jsonObj = '{"code":"' + code + '","defaultfile":"' + defaultfile + '","filename":"' + currentFile + '","lstResDef":[';
        $.each(keys, function(i, item) {
            i = i + 1;
            var value = $("#value" + i).val();
            var value = value.replace(/"/g, "\\\"");
            jsonObj = jsonObj + '{';
            jsonObj = jsonObj + '"Key":' + '"' + Encoder.htmlEncode($(this).html()) + '"' + "," + '"Value"' + ':' + '"' + Encoder.htmlEncode(value) + '"';
            jsonObj = jsonObj + '},';
            alert(jsonObj);             
        });          

        jsonObj = jsonObj + ']}';

Ici, lorsque la longueur de caractère du var jsonObj est de 10000, les valeurs suivantes ne sont pas ajoutées.

Il semble qu'il y ait une limite à cela.

36
Paras

Il n'y a pas une telle limite sur la longueur de chaîne. Pour être certain, je viens de tester pour créer une chaîne contenant 60 mégaoctets.

Le problème est probable que vous envoyez les données dans une demande GET, elles sont donc envoyées dans l'URL. Différents navigateurs ont des limites différentes pour l'URL, où IE a la liste la plus basse d'environ 2 Ko. Pour être sûr, vous ne devez jamais envoyer plus de données qu'environ un kilo-octet dans une demande GET.

Pour envoyer autant de données, vous devez les envoyer dans une demande POST à la place. Le navigateur n'a pas de limite stricte sur la taille d'une publication, mais le serveur a une limite sur la taille d'une demande peut être. IIS par exemple a une limite par défaut de 4 Mo, mais il est possible d'ajuster la limite si vous avez besoin d'envoyer plus de données que cela.

En outre, vous ne devez pas utiliser + = pour concaténer de longues chaînes. Pour chaque itération, il y a de plus en plus de données à déplacer, donc cela devient de plus en plus lent avec le nombre d'éléments que vous avez. Mettez les chaînes dans un tableau et concaténez tous les éléments à la fois:

var items = $.map(keys, function(item, i) {
  var value = $("#value" + (i+1)).val().replace(/"/g, "\\\"");
  return
    '{"Key":' + '"' + Encoder.htmlEncode($(this).html()) + '"' + ",'+
    '" + '"Value"' + ':' + '"' + Encoder.htmlEncode(value) + '"}';
});
var jsonObj =
  '{"code":"' + code + '",'+
  '"defaultfile":"' + defaultfile + '",'+
  '"filename":"' + currentFile + '",'+
  '"lstResDef":[' + items.join(',') + ']}';
67
Guffa

L'étape 1 consiste toujours à déterminer d'abord où se situe le problème. Votre titre et la plupart de vos questions semblent suggérer que vous rencontrez une limite de longueur assez faible sur la longueur d'une chaîne dans JavaScript/sur les navigateurs, une limite probablement faible. Tu n'es pas. Considérer:

var str;

document.getElementById('theButton').onclick = function() {
  var build, counter;

  if (!str) {
    str = "0123456789";
    build = [];
    for (counter = 0; counter < 900; ++counter) {
      build.Push(str);
    }
    str = build.join("");
  }
  else {
    str += str;
  }
  display("str.length = " + str.length);
};

Live copy

Cliquez plusieurs fois sur le bouton correspondant pour allonger la chaîne. Avec Chrome, Firefox, Opera, Safari et IE, je n'ai eu aucun problème avec des chaînes de plus d'un million de caractères:

 str.length = 9000 
 str.length = 18000 
 str.length = 36000 
 str.length = 72000 
 str.length = 144000 
 str.length = 288000 
 str.length = 576000 
 str.length = 1152000 
 str.length = 2304000 
 str.length = 4608000 
 str.length = 9216000 
 str.length = 18432000

... et je suis sûr que je pourrais obtenir un beaucoup plus élevé que cela.

Cela n'a donc rien à voir avec une limite de longueur en JavaScript. Vous n'avez pas montré votre code pour envoyer les données au serveur, mais vous utilisez probablement GET ce qui signifie que vous rencontrez la limite de longueur d'une demande GET, car GET les paramètres sont placés dans la chaîne de requête. Détails ici .

Vous devez plutôt utiliser POST à la place. Dans une requête POST, les données se trouvent dans le corps de la requête plutôt que dans l'URL, et peuvent en effet être très, très grandes.

8
T.J. Crowder