Domanda

Pensavo di aver trovato la soluzione qualche tempo fa (vedi my blog):

Se mai ricevi l'errore JavaScript (o dovrebbe essere JScript) "Impossibile eseguire il codice da uno script liberato", prova a spostare eventuali meta tag nell'intestazione in modo che siano prima dei tag dello script.

...ma in base a uno dei commenti più recenti del blog, la soluzione che ho suggerito potrebbe non funzionare per tutti.Ho pensato che sarebbe stato un buon modo per aprirmi alla community di StackOverflow....

Cosa causa l'errore "Impossibile eseguire il codice da uno script liberato" e quali sono le soluzioni/soluzioni alternative?

È stato utile?

Soluzione

Sembra che tu abbia riscontrato un bug/problema nel modo in cui vengono gestiti alcuni tag o che tu abbia riferimenti a oggetti rilasciati su cui stai tentando di eseguire metodi.

Per prima cosa ne sposterei uno qualsiasi <meta> tag prima di qualsiasi <script> tag come suggerito Qui e numerosi altri posti.

Quindi controlla se sono stati discussi problemi di pagina/sicurezza Qui.

Altri suggerimenti

Ottieni questo errore quando chiami una funzione creata in una finestra o in un frame che non esiste più.

Se non sai in anticipo se la finestra esiste ancora, puoi fare un try/catch per rilevarla:

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

L'errore viene causato quando la finestra 'genitore' dello script viene eliminata (ovvero:closed) ma viene invocato un riferimento allo script ancora mantenuto (come in un'altra finestra). Anche se l'"oggetto" è ancora vivo, il contesto in cui vuole essere eseguito non lo è.

È un po' sporco, ma funziona con il mio gadget della barra laterale di Windows:

Ecco l'idea generale:La finestra "principale" imposta una funzione che valuterà del codice, sì, è così brutto.Quindi un 'figlio' può chiamare questa "funzione builder" (che è /vincolata all'ambito della finestra principale/) e ottenere una funzione che è anch'essa legata alla finestra 'principale'.Uno svantaggio evidente è, ovviamente, che la funzione "rimbalzo" non può chiudersi nell'ambito in cui è apparentemente definita...comunque basta con le chiacchiere:

Questo è parzialmente pseudo-codice, ma ne utilizzo una variante su un gadget della barra laterale di Windows (continuo a dirlo perché i gadget della barra laterale vengono eseguiti nella "zona 0 senza restrizioni", che può, o meno, cambiare notevolmente lo scenario.)


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

Come variante, la finestra principale dovrebbe essere in grado di passare la funzione functionBuilder alla finestra figlia, purché la funzione functionBuilder sia definita nel contesto della finestra principale!

Mi sento come se avessi usato troppe parole.YMMV.

Se stai tentando di accedere all'oggetto JS, il modo più semplice è crearne una copia:

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

Spero che possa essere d'aiuto.

Questo errore può verificarsi in MSIE quando una finestra secondaria tenta di comunicare con una finestra principale che non è più aperta.

(Non esattamente il testo del messaggio di errore più utile al mondo.)

Ecco un caso molto specifico in cui ho visto questo comportamento.È riproducibile per me in IE6 e IE7.

Dall'interno di un iframe:

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

Quindi, dopo aver ricaricato l'iframe con il nuovo contenuto, nella finestra contenente l'iframe:

window.mySpecialHandler();

Questa chiamata fallisce con "Impossibile eseguire il codice da uno script liberato" perché mySpecialHandler è stato definito in un contesto (il DOM originale dell'iframe) che non esiste più.(Il ricaricamento dell'iframe ha distrutto questo contesto.)

È tuttavia possibile impostare in sicurezza valori "serializzabili" (primitive, grafici di oggetti che non fanno riferimento direttamente alle funzioni) nella finestra principale.Se hai davvero bisogno di una finestra separata (nel mio caso, un iframe) per specificare del lavoro su una finestra remota, puoi passare il lavoro come String e "valutarlo" nel ricevitore.Fai attenzione, in genere non garantisce un'implementazione pulita o sicura.

A partire da IE9 abbiamo iniziato a ricevere questo errore quando chiamavamo .getTime() su un oggetto Date memorizzato in un Array all'interno di un altro Oggetto.La soluzione era assicurarsi che fosse una data prima di chiamare i metodi Date:

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

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

Ho riscontrato questo problema quando all'interno di un frame figlio ho aggiunto un tipo di riferimento alla finestra di livello superiore e ho tentato di accedervi dopo il ricaricamento della finestra figlio

cioè.

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

Sono stato in grado di risolvere il problema utilizzando solo tipi primitivi

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

Questa non è realmente una risposta, ma più un esempio di dove ciò accade esattamente.

Abbiamo il frame A e il frame B (non è stata una mia idea, ma devo conviverci).Il frame A non cambia mai, il frame B cambia costantemente.Non possiamo applicare le modifiche al codice direttamente nel frame A, quindi (secondo le istruzioni del fornitore) possiamo eseguire JavaScript solo nel frame B, l'esatto frame che continua a cambiare.

Abbiamo un pezzo di JavaScript che deve essere eseguito ogni 5 secondi, quindi il JavaScript nel frame B crea un nuovo tag script e lo inserisce nella sezione head del frame B.Il setInterval esiste in questo nuovo script (quello iniettato), così come la funzione da invocare.Anche se il JavaScript iniettato viene tecnicamente caricato dal frame A (poiché ora contiene il tag script), una volta modificato il frame B, la funzione non è più accessibile da setInterval.

Ho ricevuto questo errore in IE9 all'interno di una pagina che alla fine apre un iFrame.Finché iFrame non era aperto, potevo utilizzare localStorage.Una volta aperto e chiuso l'iFrame, non sono più riuscito a utilizzare localStorage a causa di questo errore.Per risolverlo, ho dovuto aggiungere questo codice nel Javascript che era all'interno dell'iFrame e utilizzare anche localStorage.

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

ho ricevuto questo errore in DHTMLX durante l'apertura di una finestra di dialogo e l'ID principale o l'ID della finestra corrente non sono stati trovati

        $(document).ready(function () {

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

});

Assicurati solo di inviare l'ID corretto della finestra corrente/principale durante l'apertura di una finestra di dialogo

Durante l'aggiornamento dell'src di iframe ricevo quell'errore.

Ho ricevuto quell'errore accedendo a un evento (fai clic nel mio caso) di un elemento nella finestra principale come questo (chiamando direttamente la finestra principale/esterna):

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

L'ho appena cambiato in questo modo e funziona bene (chiamando il genitore del genitore della finestra iframe):

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

Anche il mio iframe contenente la modale si trova all'interno di un altro iframe.

Le spiegazioni sono molto rilevanti nelle risposte precedenti.Sto solo cercando di fornire il mio scenario.Spero che questo possa aiutare gli altri.

stavamo usando:

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

, e chiamando altre funzioni nello script on onchange events ma writeln sovrascrive completamente l'HTML in IE dove ha un comportamento diverso in Chrome.

l'abbiamo cambiato in:

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

Quindi ho mantenuto lo script che ha risolto il problema.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top