2010-04-22 7 views
4

Je crée un objet JavaScript très volumineux lors du chargement de la page. Je ne reçois aucune erreur sur firefox mais sur Internet Explorer j'obtiens une erreur en disant:Mon objet JavaScript est trop grand

Arrêtez d'exécuter ce script? Un script sur cette page provoque l'exécution lente de votre navigateur Web. Si elle continue à s'exécuter, votre ordinateur peut ne plus répondre.

Y at-il une limite de taille pour les objets Javascript dans Internet Explorer? D'autres solutions mais ne divisant pas l'objet?

+0

Une grande partie de cela dépendra de la gestion de la mémoire des navigateurs et la quantité de mémoire disponible sur le PC de l'utilisateur. Quel genre d'objet est-ce? Pourquoi est-il si grand en premier lieu? Avez-vous vraiment besoin de toutes ses données pendant l'exécution? Que contient-il? –

+0

Dupliquer http://stackoverflow.com/questions/2692623/my-javascript-object-is-too-big – Germ

+0

@Kubi s'il vous plaît supprimer l'une des questions en double, je suppose que vous les avez créés par erreur car ils semblent être identiques? –

Répondre

3

La clé du message de votre réception est la partie « courir lentement », qui se rapporte à temps. Donc, votre problème n'est pas la taille de l'objet, mais le temps nécessaire pour construire l'objet.

Pour affiner encore plus les choses, le problème n'est pas non plus le temps de construction de l'objet. Au lieu de cela, IE compte le nombre d'instructions javascript qu'il exécute, réinitialisant ce nombre lorsqu'il exécute un gestionnaire d'événements ou une fonction setTimeout.

Ainsi, vous pouvez éviter ce problème en divisant votre code en plusieurs morceaux qui gèrent les appels à l'intérieur de setTimeout (...);

Voici un exemple qui peut vous pousser dans la bonne direction:

var finish = function(data) { 
    // Do something with the data after it's been created 
}; 

var data = []; 
var index = 0; 

var loop; 
loop = function() { 
    if (++index < 1000000) { 
    data[index] = index; 
    setTimeout(loop, 0); 
    } else { 
    setTimeout(function(){ finish(data); }, 0); 
    } 
} 

setTimeout(loop, 0); 
+0

pourriez-vous vérifier mon code? – Kubi

+0

@Kubi: Votre code devrait convertir assez facilement. Si vous avez besoin d'aide après avoir essayé un peu, postez-le ici sur SO et voyez ce que vous obtenez. –

+0

Je pense que je ne pouvais pas avoir l'idée. J'ai essayé de mettre setTimeout avant allPlans.push si allPlans.length est supérieur à 1000. – Kubi

2

ce n'est pas à cause de la taille mais à cause de la grande quantité de boucles que vous exécutez et du grand temps d'exécution. Si vous le coupez en plus petites parties, cela devrait fonctionner. Essayez de réduire la complexité des fonctions que vous exécutez. Pouvez-vous le poster afin que nous puissions regarder les boucles et essayer d'aider?

Edit:

Je supose que vous voulez faire tout ce que sur le côté client pour une raison quelconque. Le code semble avoir besoin de beaucoup d'exécution pour fonctionner du côté client. Vous ne pouvez pas faire les calculs sur le serveur?

Si c'est tout pour initialiser l'objet, vous pouvez le mettre en cache pour éviter le retraitement et simplement envoyer un json généré au côté javascript.

Il ne semble être mis en cache

+0

Je suis désolé, c'est trop complexe pour le poster ici. Mais fondamentalement, il s'agit d'un tableau d'objets comprenant 700 objets. Ces objets incluent 4 propriétés dont l'une inclut jusqu'à 6 autres types de propriétés. – Kubi

+0

je l'ai posté :) – Kubi

+0

non, nous ne voulons pas le faire sur le côté serveur! JSON généré devient environ 10mbs. – Kubi

2

Vous devez utiliser les grandes boucles ou une logique récursive dans le code. Cela ne dépend pas vraiment de la taille de l'objet, cela dépend des ressources processeur utilisées (mémoire, processeur, etc.).

2

Les ressources disponibles JavaScript sont limitées par les ressources sur l'ordinateur client.

Il semble que votre script utilise trop de temps de traitement tout en créant cet objet, et le mécanisme « de script d'arrêt » est PASSENT pour sauver votre navigateur pende.

La raison pour laquelle cela se produit sur Internet Explorer et non sur Firefox est probablement parce que le moteur JavaScript dans Firefox est plus efficace, donc il ne dépasse pas le seuil pour que le 'stop script' soit déclenché.

Questions connexes