66 votes

Quelle est la cause de l'erreur "Impossible d'exécuter du code à partir d'un script libéré"

Je pensais avoir trouvé la solution il y a un moment (voir mon blog):

Si jamais vous avez le JavaScript (ou devrait-il être JScript) d'erreur "impossible d'exécuter le code d'un script libéré" - essayez de déplacer les balises meta dans la tête, alors qu'ils sont en avant de vos balises de script.

...mais en se fondant sur l'un des plus récents commentaires de blog, la correction, j'ai suggéré peut ne pas fonctionner pour tout le monde. Je pensais que ce serait une bonne idée d'ouvrir à la StackOverflow de la communauté....

Quelles sont les causes de l'erreur "impossible d'exécuter le code d'un script libéré" et quelles sont les solutions/solutions de contournement?

36voto

Sjoerd Visscher Points 8310

Vous obtenez cette erreur lorsque vous appelez une fonction créée dans une fenêtre ou un cadre qui n'existe plus.

Si vous ne savez pas à l'avance si la fenêtre existe toujours, vous pouvez essayer / attraper pour la détecter:

 try
{
  f();
}
catch(e)
{
  if (e.number == -2146823277)
    // f is no longer available
    ...
}
 

15voto

Joe Skora Points 6535

Il semble que vous avez atteint un bug/problème dans la manière dont certains tags sont manipulés ou que vous avez des références à des objets publiés sur lequel vous tentez d'exécuter les méthodes.

D'abord je voudrais déplacer les balises <meta> avant toute les balises <script> comme suggéré ici et ici, et de nombreux autres endroits.

Ensuite, vérifiez pour voir si vous avez de la page/questions de sécurité abordées ici.

8voto

Grzegorz Ciwoniuk Points 103

Si vous essayez d'accéder à l'objet JS, le moyen le plus simple consiste à créer une copie:

 var objectCopy = JSON.parse(JSON.stringify(object));
 

J'espère que ça va aider.

8voto

aaron Points 146

Voici un cas très spécifique dans lequel j'ai vu ce comportement. Il est reproductible pour moi dans IE6 et IE7.

Dans une iframe:

window.parent.mySpecialHandler = function() { ...work... }

Puis, après le rechargement de l'iframe avec du nouveau contenu, dans la fenêtre contenant l'iframe:

window.mySpecialHandler();

Cet appel échoue avec "ne Peut pas exécuter le code d'un script libéré" parce que mySpecialHandler a été définie dans un contexte (l'iframe d'origine DOM) qui n'est plus de sorties. (Rechargement de l'iframe détruit ce contexte.)

Vous pouvez cependant sûre "serializeable" (valeurs primitives, les graphes d'objets qui ne sont pas référence directement des fonctions) dans la fenêtre parent. Si vous avez vraiment besoin d'une fenêtre séparée (dans mon cas, un iframe) pour spécifier un certain travail à une distance de la fenêtre, vous pouvez passer le travail comme une Chaîne de caractères et "eval" dans le récepteur. Soyez prudent avec cela, il généralement ne fait pas pour un nettoyage ou d'assurer la mise en œuvre.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X