Causes de l'erreur & # 8220; Impossible d'exécuter le code d'un script libéré & # 8221;

StackOverflow https://stackoverflow.com/questions/83132

  •  01-07-2019
  •  | 
  •  

Question

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

  

Si vous rencontrez un jour l'erreur JavaScript (ou s'agit-il de JScript), vous ne pouvez pas exécuter le code à partir d'un script libéré " - essayez de déplacer les balises méta dans la tête pour les placer avant les balises de script.

... mais sur la base de l’un des commentaires les plus récents du blog, le correctif que j’ai suggéré ne fonctionnera peut-être pas pour tout le monde. Je pensais que ce serait un bon moyen de s’ouvrir à la communauté StackOverflow ....

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

Était-ce utile?

La solution

On dirait que vous avez rencontré un bogue ou un problème dans la façon dont certaines balises sont traitées ou que vous avez des références à des objets publiés sur lesquels vous essayez d'exécuter des méthodes.

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

Vérifiez ensuite si les problèmes de page / de sécurité ont été abordés dans ici . .

Autres conseils

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
    ...
}

L'erreur est provoquée lorsque la fenêtre de script "parent" est supprimée (c'est-à-dire: fermée) mais qu'une référence au script qui est toujours conservée (comme dans une autre fenêtre) est invoquée. Même bien que l'objet soit toujours vivant, le contexte dans lequel il veut s'exécuter ne l'est pas.

C'est un peu sale, mais cela fonctionne pour mon gadget Windows Sidebar:

Voici l’idée générale: La fenêtre principale définit une fonction qui va évaluer du code, ouais, c'est moche. Ensuite, un "enfant" peut appeler cette " fonction constructeur ". (qui est / lié à la portée de la fenêtre principale /) et récupère une fonction qui est également liée à la fenêtre 'principale'. Un inconvénient évident est, bien sûr, que la fonction de "rebond" ne peut pas fermer sur la portée dans laquelle elle est apparemment définie dans ... de toute façon, assez de charabia:

Il s’agit en partie de pseudo-code, mais j’en utilise une variante sur un gadget de barre latérale Windows (je l’affirme sans cesse, car les gadgets de barre latérale fonctionnent dans la "zone non restreinte 0"), ce qui peut modifier ou non la scénario grandement.)


// This has to be setup from the main window, not a child/etc!
mainWindow.functionBuilder = function (func, args) {
  // trim the name, if any
  var funcStr = ("" + func).replace(/^function\s+[^\s(]+\s*\(/, "function (")
  try {
    var rebuilt
    eval("rebuilt = (" + funcStr + ")")
    return rebuilt(args)
  } catch (e) {
    alert("oops! " + e.message)
  }
}

// then in the child, as an example
// as stated above, even though function (args) looks like it's 
// a closure in the child scope, IT IS NOT. There you go :)
var x = {blerg: 2}
functionInMainWindowContenxt = mainWindow.functionBuilder(function (args) {
  // in here args is in the bound scope -- have at the child objects! :-/
  function fn (blah) {
    return blah * args.blerg
  }
  return fn
}, x)

x.blerg = 7
functionInMainWindowContext(6) // -> 42 if I did my math right

En variante, la fenêtre principale devrait pouvoir transmettre la fonction functionBuilder à la fenêtre enfant - tant que la fonction functionBuilder est définie dans le contexte de la fenêtre principale!

J'ai l'impression d'avoir utilisé trop de mots. YMMV.

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.

Cette erreur peut se produire dans MSIE lorsqu'une fenêtre enfant tente de communiquer avec une fenêtre parent qui n'est plus ouverte.

(Ce n'est pas le texte du message d'erreur le plus utile au monde.)

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

À partir d'un iframe:

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

Ensuite, après avoir rechargé l'iframe avec un nouveau contenu, dans la fenêtre contenant l'iframe:

window.mySpecialHandler();

Cet appel échoue avec " Impossible d'exécuter le code à partir d'un script libéré " car mySpecialHandler a été défini dans un contexte (le DOM d'origine de l'iframe) qui n'existe plus. (Le rechargement de l’iframe a détruit ce contexte.)

Vous pouvez cependant définir en toute sécurité " sérialisable " valeurs (primitives, graphes d'objets qui ne référencent pas directement les fonctions) dans la fenêtre parente. Si vous avez vraiment besoin d'une fenêtre distincte (dans mon cas, une iframe) pour spécifier du travail dans une fenêtre distante, vous pouvez transmettre le travail en tant que chaîne et "eval". dans le récepteur. Faites attention à cela, cela ne permet généralement pas une implémentation propre ou sécurisée.

Depuis IE9, nous avons commencé à recevoir cette erreur lors de l'appel de .getTime () sur un objet Date stocké dans un tableau dans un autre objet. La solution a été de s’assurer que c’était une date avant d’appeler les méthodes de date:

Echec: rowTime = wl.rowData [a] [12] .getTime ()

Passez: rowTime = new Date (wl.rowData [a] [12]). getTime ()

J'ai rencontré ce problème lorsque, à l'intérieur d'un cadre enfant, j'ai ajouté un type de référence à la fenêtre de niveau supérieur et tenté d'y accéder après le rechargement de la fenêtre enfant

c'est-à-dire

// set the value on first load
window.top.timestamp = new Date();

// after frame reloads, try to access the value
if(window.top.timestamp) // <--- Raises exception
...

J'ai pu résoudre le problème en utilisant uniquement des types primitifs

// set the value on first load
window.top.timestamp = Number(new Date());

Ce n’est pas vraiment une réponse, mais plutôt un exemple de ce qui se produit précisément.

Nous avons les cadres A et B (ce n’était pas mon idée, mais je dois vivre avec). L'image A ne change jamais, l'image B change constamment. Nous ne pouvons pas appliquer les modifications de code directement dans le cadre A; nous ne pouvons donc exécuter JavaScript que dans le cadre B (conformément aux instructions du fournisseur) - le cadre exact qui ne cesse de changer.

Nous avons un élément JavaScript qui doit être exécuté toutes les 5 secondes. Il doit donc créer une nouvelle balise de script et l'insérer dans la section d'en-tête de l'image B. L'ensemble setInterval existe dans ce nouveau script (celui injecté ), ainsi que la fonction à appeler. Bien que le code JavaScript injecté soit techniquement chargé par l'image A (puisqu'il contient maintenant la balise script), une fois l'image B modifiée, la fonction n'est plus accessible par setInterval.

J'ai eu cette erreur dans IE9 dans une page qui ouvre éventuellement un iFrame. Tant que l'iFrame n'était pas ouvert, je pouvais utiliser localStorage. Une fois l'iFrame ouvert et fermé, je ne pouvais plus utiliser le stockage local à cause de cette erreur. Pour résoudre ce problème, j’ai dû ajouter ce code dans le code Javascript qui se trouvait à l’intérieur de l’iFrame et qui utilisait également le stockage local.

if (window.parent) {
    localStorage = window.parent.localStorage;
}

a eu cette erreur dans DHTMLX lors de l’ouverture d’un dialogue & amp; identifiant parent ou identifiant de fenêtre en cours introuvable

        $(document).ready(function () {

            if (parent.dxWindowMngr == undefined) return;
            DhtmlxJS.GetCurrentWindow('wnManageConDlg').show();

});

Assurez-vous simplement que vous envoyez le bon identifiant de fenêtre curr / parent lors de l'ouverture d'un dialogue

Suite à la mise à jour du code src d'iframe, le message d'erreur s'affiche.

Vous avez cette erreur en accédant à un événement (cliquez dans mon cas) d'un élément de la fenêtre principale comme ceci (appelant directement la fenêtre principale / la plus à l'extérieur):

top.$("#settings").on("click",function(){
    $("#settings_modal").modal("show");
}); 

Je viens de le changer comme ça et ça fonctionne bien (appeler le parent du parent de la fenêtre iframe):

$('#settings', window.parent.parent.document).on("click",function(){                    
   $("#settings_modal").modal("show");      
});

Mon iframe contenant le modal se trouve également dans une autre iframe.

Les explications sont très pertinentes dans les réponses précédentes. J'essaie juste de fournir mon scénario. J'espère que cela pourra aider les autres.

nous utilisions:

<script> window.document.writeln(table) </script>

, et appeler d'autres fonctions dans le script lors d'événements onchange , mais Writeln remplace complètement le code HTML dans IE, car il présente un comportement différent en chrome.

nous l'avons changé en:

<script> window.document.body.innerHTML = table;</script> 

Ainsi conservé le script qui a résolu le problème.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top