it-swarm-eu.dev

Was verursacht den Fehler "Code kann nicht von einem freigegebenen Skript ausgeführt werden"

Ich dachte, ich hätte die Lösung vor einiger Zeit gefunden (siehe mein blog ):

Wenn Sie jemals den JavaScript-Fehler (oder sollte es JScript sein) erhalten, wird der Fehler "Code kann nicht aus einem freigegebenen Skript ausgeführt werden" angezeigt. Versuchen Sie, alle Meta-Tags im Kopf so zu verschieben, dass sie vor Ihren Skript-Tags liegen. 

... aber basierend auf einem der neuesten Blogkommentare funktioniert das von mir vorgeschlagene Update möglicherweise nicht für alle. Ich dachte, dies wäre ein guter Weg, um sich der StackOverflow-Community zu öffnen ...

Was verursacht den Fehler "Code kann nicht aus einem freigegebenen Skript ausgeführt werden" und welche Lösungen/Problemumgehungen gibt es?

57
Tom Robinson

Es klingt, als hätten Sie einen Fehler in der Art und Weise, wie Tags behandelt werden, oder Sie haben Verweise auf freigegebene Objekte, bei denen Sie Methoden ausführen möchten.

Zuerst würde ich alle <meta>-Tags vor den <script>-Tags verschieben, wie vorgeschlagen hier und zahlreiche andere Orte.

Prüfen Sie dann, ob Sie über Seiten-/Sicherheitsprobleme hier diskutiert haben.

19
Joe Skora

Diese Fehlermeldung wird angezeigt, wenn Sie eine Funktion aufrufen, die in einem Fenster oder Frame erstellt wurde, das nicht mehr vorhanden ist. 

Wenn Sie nicht im Voraus wissen, ob das Fenster noch vorhanden ist, können Sie es versuchen/fangen, um es zu erkennen:

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

Der Fehler wird verursacht, wenn das übergeordnete Fenster des Skripts entsorgt wird (z. B. geschlossen), jedoch ein Verweis auf das noch gehaltene Skript (z. B. in einem anderen Fenster) aufgerufen wird. Auch wenn das 'Objekt' noch lebt, ist es nicht der Kontext, in dem es ausgeführt werden soll.

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

Hier ist die allgemeine Idee: Das 'Haupt'-Fenster richtet eine Funktion ein, die Code auswertet, yup, es ist so hässlich . Dann kann ein' Kind 'diese' Builder-Funktion '(was ist/an den Umfang des Hauptfensters gebunden /) und eine Funktion zurückgeben, die auch an das 'Hauptfenster' gebunden ist. Ein offensichtlicher Nachteil ist natürlich, dass die Funktion "Rebound" nicht über den Umfang geschlossen werden kann, in dem sie scheinbar definiert ist in ... ohnehin genug von dem Kauderwelsch:

Dies ist teilweise Pseudo-Code, aber ich verwende eine Variante davon in einem Windows-Sidebar-Gadget (ich sage das immer wieder, weil Sidebar-Gadgets in "unrestricted zone 0" laufen, was das Szenario stark verändern kann oder nicht.)


// 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 in der Lage sein, die Funktion functionBuilder an das untergeordnete Fenster zu übergeben - sofern die Funktion functionBuilder im Kontext des Hauptfensters definiert ist!

Ich habe das Gefühl, ich habe zu viele Wörter verwendet. YMMV.

18
user166390

Wenn Sie versuchen, auf das JS-Objekt zuzugreifen, können Sie am einfachsten eine Kopie erstellen:

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

Ich hoffe es hilft.

8

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

Innerhalb eines iframe:

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

Dann, nachdem Sie den iframe mit neuem Inhalt neu geladen haben, in dem Fenster, das den iframe enthält:

window.mySpecialHandler();

Dieser Aufruf schlägt mit "Code aus einem freigegebenen Skript kann nicht ausgeführt werden" fehl, da mySpecialHandler in einem Kontext (dem ursprünglichen DOM des iframe) definiert wurde, der nicht mehr vorhanden ist. (Beim erneuten Laden des Iframes wurde dieser Kontext zerstört.)

Sie können jedoch sicher "serialisierbare" Werte (Grundelemente, Objektdiagramme, die nicht direkt auf Funktionen verweisen) im übergeordneten Fenster festlegen. Wenn Sie wirklich ein separates Fenster benötigen (in meinem Fall ein Iframe), um einem entfernten Fenster Arbeit zuzuweisen, können Sie die Arbeit als String übergeben und im Empfänger "auswerten". Seien Sie vorsichtig, da dies im Allgemeinen keine saubere oder sichere Implementierung ermöglicht.

6
aaron

Ab IE9 haben wir diesen Fehler erhalten, als .getTime () für ein Date-Objekt aufgerufen wurde, das in einem Array in einem anderen Objekt gespeichert ist. Die Lösung bestand darin, sicherzustellen, dass es sich um ein Date handelt, bevor Date-Methoden aufgerufen werden:

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

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

5
Tom

Dieser Fehler kann in MSIE auftreten, wenn ein untergeordnetes Fenster versucht, mit einem übergeordneten Fenster zu kommunizieren, das nicht mehr geöffnet ist.

(Nicht gerade der hilfreichste Fehlermeldungstext der Welt.)

3
pcorcoran

Ich bin auf dieses Problem gestoßen, als ich in einem untergeordneten Frame einen Referenztyp zum Fenster der obersten Ebene hinzugefügt und versucht habe, darauf zuzugreifen, nachdem das untergeordnete Fenster neu geladen wurde

d.h.

// 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 konnte das Problem nur mit primitiven Typen beheben

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

Dies ist nicht wirklich eine Antwort, sondern eher ein Beispiel, wo dies genau geschieht.

Wir haben Frame A und Frame B (dies war nicht meine Idee, aber ich muss damit leben). Bild A ändert sich nie, Bild B ändert sich ständig. Wir können Codeänderungen nicht direkt in Frame A anwenden. Daher können wir (gemäß den Anweisungen des Herstellers) nur JavaScript in Frame B ausführen - der genaue Frame, der sich ständig ändert.

Wir haben ein Stück JavaScript, das alle 5 Sekunden ausgeführt werden muss. Daher erstellt das JavaScript in Frame B ein neues Skript-Tag und fügt es in den Head-Abschnitt von Frame B ein sowie die aufzurufende Funktion. Obwohl das eingespritzte JavaScript technisch von Frame A geladen wird (da es jetzt das Skript-Tag enthält), ist nach dem Ändern von Frame B die Funktion nicht mehr von setInterval verfügbar.

1
Nathan Crause

Ich habe diese Fehlermeldung in IE9 auf einer Seite erhalten, die schließlich einen iFrame öffnet. Solange der iFrame nicht geöffnet war, konnte ich localStorage verwenden. Nachdem der iFrame geöffnet und geschlossen wurde, konnte ich localStorage aufgrund dieses Fehlers nicht mehr verwenden. Um das Problem zu beheben, musste ich diesen Code in das Javascript einfügen, das sich innerhalb des iFrame befand und auch localStorage verwendete.

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

Beim Update von iframe src bekomme ich diesen Fehler.

Diesen Fehler erhalten Sie, indem Sie auf ein Ereignis (klicken Sie in meinem Fall auf) eines Elements im Hauptfenster wie folgt zugreifen (das Haupt-/äußerste Fenster direkt aufrufen): 

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

Ich habe es einfach so geändert und es funktioniert gut (Aufruf des übergeordneten Elements des Iframe-Fensters):

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

Mein iframe mit dem Modal befindet sich auch in einem anderen iframe.

0
Chan

Die Erklärungen sind in den vorherigen Antworten sehr relevant. Ich versuche nur, mein Szenario bereitzustellen. Hoffe, das kann anderen helfen.

wir verwendeten:

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

und das Aufrufen anderer Funktionen im Skript für onchange -Ereignisse, aber das vollständige Überschreiben des HTML-Codes in IE, wobei das Verhalten in Chrome anders ist.

wir haben es geändert in:

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

So behielt das Skript das Problem bei.

0
pavan kumar

dieser Fehler wurde in DHTMLX beim Öffnen eines Dialogs angezeigt. Die übergeordnete ID oder die aktuelle Fenster-ID wurde nicht gefunden 

        $(document).ready(function () {

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

});

Stellen Sie nur sicher, dass Sie beim Öffnen eines Dialogs die korrekte aktuelle ID/Elternfenster-ID senden

0
panky sharma