Was sind die Ursachen der Fehler „Kann nicht-Code von einem befreiten Skript ausführen“

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

  •  01-07-2019
  •  | 
  •  

Frage

Ich dachte, ich die Lösung eine Weile gefunden hatte vor (siehe mein Blog ):

  

Wenn Sie jemals die JavaScript bekommen (oder sollte es sein, JScript) Fehler „nicht-Code von einem befreiten Skript ausführen können“ - versuchen, alle Meta-Tags im Kopf zu bewegen, so dass sie vor Ihrem Script-Tags sind.

... aber basierend auf einer der jüngsten Blog-Kommentare, ich das Update vorgeschlagen kann nicht für alle arbeiten. Ich dachte, das wäre ein guter sein zu öffnen, um die Stackoverflow Gemeinschaft ....

Was sind die Ursachen der Fehler „Kann nicht-Code von einem befreiten Skript ausführen“ und was sind die Lösungen / Abhilfen?

War es hilfreich?

Lösung

Es klingt wie Sie einen Fehler / Problem in der Art und Weise getroffen haben einige Tags behandelt werden oder dass Sie Verweise auf veröffentlichte Objekte haben, auf dem Sie Methoden auszuführen versuchen.

Zuerst würde ich keine <meta> Tags vor irgendwelchen <script> Tags bewegen, wie vorgeschlagen hier und zahlreiche andere Orte.

Dann schauen Sie nach, ob Sie Seite / Sicherheitsfragen diskutiert haben hier .

Andere Tipps

Sie diese Fehlermeldung erhalten, wenn Sie eine Funktion aufrufen, die in einem Fenster oder Rahmen erstellt wurde, existiert nicht mehr.

Wenn Sie nicht im Voraus wissen, ob das Fenster immer noch vorhanden ist, können Sie einen try / catch tun es zu erkennen:

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

Der Fehler wird verursacht, wenn die ‚Eltern‘ Fenster Skript angeordnet sind. (Dh geschlossen), sondern ein Verweis auf das Skript, das noch (wie beispielsweise in einem anderen Fenster) gehalten wird, aufgerufen wird, Selbst obwohl das ‚Objekt‘ noch am leben ist, in dem der Zusammenhang es auszuführen will, ist es nicht.

Es ist etwas schmutzig, aber es funktioniert für mein Windows Sidebar Gadget:

Hier ist die allgemeine Idee: Das ‚Haupt‘ Fenster stellt eine Funktion auf, die einen Code eval'uate werden, yup, dann ist es, dass hässlich. Dann kann ein ‚Kind‘ nennt die „Builder-Funktion“ (was / gebunden an den Umfang des Hauptfensters /) und eine Funktion zurück, die auch auf das ‚Haupt‘ Fenster gebunden ist. Ein offensichtlicher Nachteil ist natürlich, dass die Funktion ‚Rebound‘ zu sein kann nicht Verschluss über den Umfang es scheinbar in definiert ist ... wie auch immer, genug von dem gibbering:

Dieser teilweise Pseudo-Code ist, aber ich benutze eine Variante davon auf einem Windows-Sidebar Gadget (ich sage die halten, weil Sidebar Gadgets in „unrestricted Zone 0“ laufen, das kann - oder auch nicht - das Szenario ändern stark).


// 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

Als Variante sollte das Hauptfenster der Lage sein, die functionBuilder Funktion für das Kind Fenster passieren - solange die functionBuilder Funktion im Hauptfenster Kontext definiert wird

Ich fühle mich wie ich zu viele Worte verwendet. YMMV.

Wenn Sie versuchen, das JS-Objekt zuzugreifen, ist der einfachste Weg ist, um eine Kopie zu erstellen:

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

Hoffe, es hilft.

Dieser Fehler in MSIE auftreten kann, wenn ein untergeordnetes Fenster versucht, mit einem übergeordneten Fenster zu kommunizieren, die nicht mehr offen ist.

(Nicht gerade der nützlichste Fehlermeldung Text in der Welt.)

Hier ist ein sehr spezieller Fall, in dem ich dieses Verhalten gesehen habe. Es ist reproduzierbar für mich in IE6 und IE7.

Von innerhalb eines Iframe:

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

Dann, nach der iframe mit neuen Inhalten, im Fenster mit dem iframe Nachladen:

window.mySpecialHandler();

Dieser Aufruf schlägt mit „Can not Code von einem befreiten Skript ausführen“, weil mySpecialHandler in einem Kontext definiert wurde (der ursprünglichen DOM iframe), die nicht mehr beendet. (Nachladen der iframe diesen Kontext zerstört.)

Sie können jedoch sicher gesetzt „serializeable“ Werte (Primitiven, Objektdiagramme, die Funktionen nicht direkt verweisen) in dem übergeordneten Fenster. Wenn Sie wirklich ein separates Fenster müssen (in meinem Fall ein iframe) einige Arbeit zu einem entfernten Fenster angeben, können Sie die Arbeit als String und „eval“ es in dem Empfänger übergeben. Werden mit dieser Vorsicht, es in der Regel nicht machen für eine saubere oder sichere Implementierung.

Der Beginn in IE9 haben wir begonnen, diese Fehler zu erhalten, wenn sie in einem Array in einem anderen Objekt gespeichert .getTime () auf ein Date-Objekt aufrufen. Die Lösung war, um sicherzustellen, war es ein Datum vor dem Datum der Methoden aufrufen:

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

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

ich in dieses Problem lief, wenn sie innerhalb eines Kindes Rahmens ich einen Referenztyp der obersten Ebene Fenster hinzugefügt und versuchte es nach dem Kind Fenster für den Zugriff auf neu geladen

d.

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

Ich war in der Lage, das Problem zu lösen, indem nur primitive Typen mit

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

Das ist nicht wirklich eine Antwort, aber ein Beispiel, wo dies genau geschieht.

Wir haben Frame A und Frame B (das war nicht meine Idee, aber ich habe mit ihm zu leben). Frame A ändert sich nie, Frame B ändert sich ständig. Wir können nicht für Code direkt in den Rahmen A ändert, so (gemäß den Anweisungen des Herstellers) wir nur JavaScript in Frame B laufen kann -. Den genauen Rahmen, der ständig ändert

Wir haben ein Stück JavaScript, die alle 5 Sekunden ausgeführt werden muss, so dass die JavaScript in Frame B einen neuen Skript-Tag und fügt in in den Abschnitt des Rahmens B. Kopf erstellen Die setInterval in dieser neuen Skripte vorhanden (die injizieren ) sowie die Funktion aufzurufen. Auch wenn das injizierte JavaScript technisch Frame A geladen wird (da sie nun das Script-Tag enthält), einmal Rahmen B ändert, wird die Funktion nicht mehr zugänglich ist durch die setInterval.

habe ich diesen Fehler in IE9 innerhalb einer Seite, die schließlich ein iFrame öffnet. Solange die iFrame nicht geöffnet war, konnte ich localstorage verwenden. Einmal wurde das iFrame geöffnet und geschlossen, war ich die localstorage nicht in der Lage mehr zu verwenden, da dieser Fehlers. Um es zu beheben, musste ich in der JavaScript-Code hinzuzufügen, die innerhalb des iFrame war und auch die localstorage verwendet wird.

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

hätte diesen Fehler in Dhtmlx während eines Dialog & Eltern-ID oder aktuelle Fenster-ID nicht gefunden

Öffnen
        $(document).ready(function () {

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

});

So stellen Sie sicher, korrekte curr / Eltern-Fenster-ID senden, während ein Dialog öffnen

Ein Update von src des iframe Ich erhalte diesen Fehler.

diesen Fehler Haben Sie durch ein Ereignis Zugriff auf (klicken Sie in meinem Fall) eines Elements im Hauptfenster wie folgt aus (das Haupt / outmost Fenster Aufruf direkt):

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

Ich habe gerade es so und es funktioniert gut (die Eltern der Eltern des iframe Fenster aufrufen):

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

Meine iframe des modalen enthalten, sind auch innerhalb eines anderen iframe.

Die Erklärungen sind sehr relevant in den vorangegangenen Antworten. Ich versuche nur, mein Szenario zu schaffen. Hoffen, dass diese anderen helfen können.

Wir wurden mit:

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

und auf onchange Ereignisse im Skript andere Funktionen aufrufen, aber völlig überschreibt den HTML-Code in IE writeln wo, wie es ist ein anderes Verhalten in Chrom mit.

änderten wir es an:

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

beibehalten Damit das Skript, das das Problem behoben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top