Pregunta

Yo pensé que había encontrado la solución hace un tiempo (ver mi blog):

Si usted alguna vez el JavaScript (o debería ser JScript) de error "no se Puede ejecutar el código de un script liberado" - tratar de mover las etiquetas meta en la cabeza por lo que son antes de que sus etiquetas de secuencia de comandos.

...pero basado en uno de los más recientes comentarios del blog, la revisión sugerí puede no funcionar para todos.Pensé que esto sería una buena para abrirse a la StackOverflow de la comunidad....

¿Qué causa el error "no se Puede ejecutar el código de un script liberado" y cuáles son las soluciones o soluciones?

¿Fue útil?

Solución

Parece que hemos topado con un bug/problema en la forma en que las etiquetas se manejan o que tienen referencias a lanzado objetos sobre los que usted está tratando de ejecutar métodos.

En primer lugar me gustaría mover cualquier <meta> etiquetas antes de cualquier <script> etiquetas como se sugiere aquí y muchos otros lugares.

A continuación, comprobar para ver si usted tiene página/cuestiones de seguridad discutidos aquí.

Otros consejos

Usted recibe este mensaje de error cuando se llama a una función que se creó en una ventana o marco que ya no existe.

Si usted no sabe de antemano si la ventana todavía existe, se puede hacer un try/catch para detectarlo:

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

El error se produce cuando el 'padre' de la ventana de secuencia de comandos se elimina (ie:cerrado), sino una referencia a la secuencia de comandos que se celebra (como en otra ventana) se invoca. Aunque el 'objeto' es todavía vivo, el contexto en el que se quiere ejecutar no está.

Es un poco sucio, pero funciona para mi Windows Sidebar Gadget:

Aquí es la idea general:El 'principal' de la ventana se configura una función que será eval'uate algo de código, sí, es feo.A continuación, un "niño" puede llamar a esto "el generador de función" (que es el /limitadas al ámbito de la ventana principal/) y obtener una función que también está vinculado a la 'principal' de la ventana.Una desventaja obvia es, por supuesto, que la función de "rebote" no pueden cierre sobre el ámbito de aplicación es aparentemente definidas en...de todos modos, lo suficiente de la farfullando:

Esto es parcialmente pseudo-código, pero yo uso una variante de la misma en un Windows Sidebar Gadget (sigo diciendo esto porque Gadgets de la barra Lateral de ejecución en "sin restricciones de zona 0", lo que puede -- o no -- cambiar el escenario enormemente.)


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

Como una variante, la ventana principal debe ser capaz de pasar el functionBuilder función para el niño de la ventana, siempre y cuando el functionBuilder función está definida en la ventana principal de contexto!

Me siento como que he usado muchas palabras.YMMV.

Si usted está tratando de acceder a la JS objeto, la forma más fácil es crear una copia:

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

Espero que te ayudarán.

Este error puede producirse en MSIE cuando un niño ventana intenta comunicarse con una ventana padre que ya no está abierto.

(No es exactamente el más útil de error mensaje de texto en el mundo.)

He aquí un caso específico en el que he visto este comportamiento.Es reproducible para mí en IE6 y IE7.

Desde dentro de un iframe:

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

Luego, después de volver a cargar el iframe con nuevo contenido, en la ventana que contiene el iframe:

window.mySpecialHandler();

Esta convocatoria se produce el error de que no Puede ejecutar el código de un script liberado" porque mySpecialHandler se definió en un contexto (el iframe original DOM) que ya no sale.(Volver a cargar el iframe destruido este contexto).

Sin embargo, puede de forma segura "serializeable" valores (primitivos, los gráficos de objetos que no referencia a las funciones directamente) en la ventana principal.Si usted realmente necesita una ventana separada (en mi caso, un iframe) para especificar un poco de trabajo para un control remoto de la ventana, usted puede pasar el trabajo como una Cadena y "eval" en el receptor.Cuidado con esto, generalmente no hacen una limpieza o lograr la aplicación.

Comenzando en IE9 comenzamos a recibir este error al llamar .getTime() en un objeto Date almacena en un Array dentro de otro Objeto.La solución fue para asegurarse de que era una Fecha antes de llamar a métodos de Fecha:

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

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

Me encontré con este problema cuando se está dentro de un marco secundario he añadido un tipo de referencia al nivel superior de la ventana y trató de acceder a él después de que el niño de la ventana de reloaded

es decir,

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

Yo era capaz de resolver el problema mediante el uso de sólo los tipos primitivos

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

Esto no es realmente una respuesta, sino más bien un ejemplo de donde esta, precisamente, sucede.

Hemos marco de Una y marco B (esta no era mi idea, pero tengo que vivir con ella).Marco de Un nunca cambia, Frame B cambia constantemente.No podemos aplicar cambios de código directamente en el marco de Una, por lo que (según las instrucciones del vendedor) sólo podemos ejecutar código JavaScript en el cuadro B - el fotograma exacto que va a cambiar.

Tenemos un pedazo de JavaScript que necesita para que se ejecute cada 5 segundos, por lo que el JavaScript en el cuadro B de crear una nueva etiqueta de secuencia de comandos y se inserta en la sección head del cuadro B.El setInterval existe en esta nueva secuencias de comandos (el que se inyecta), así como la función a invocar.Aunque la inyección de JavaScript es técnicamente cargado por el marco de Una (ya que ahora contiene la etiqueta de script), una vez que B marco de los cambios, la función deja de ser accesible por el setInterval.

Tengo este error en IE9 dentro de una página que, finalmente, se abre un iFrame.Mientras el iFrame no estaba abierta, yo podría usar localStorage.Una vez que el iFrame se abría y se cerraba, yo no era capaz de utilizar el localStorage más, porque de este error.Para solucionarlo, he tenido que añadir este código en Javascript que estaba dentro del iFrame y también con el objeto localStorage.

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

tengo este error en DHTMLX, mientras que la apertura de un diálogo y padres de identificación o actual de identificación de la ventana no se encuentra

        $(document).ready(function () {

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

});

Sólo asegúrese de que usted está enviando correcta curr/matriz de identificación de la ventana, mientras que la apertura de un diálogo

Sobre la actualización de iframe src de que estoy recibiendo ese error.

Tengo ese error al acceder a un evento(haga clic en mi caso) de un elemento en la ventana principal como este (llamando a la principal y más exterior de la ventana directamente):

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

Acabo de cambiar de esta manera y funciona bien (llamar a los padres de los padres de la ventana iframe):

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

Mi iframe que contiene el modal es también dentro de un iframe.

Las explicaciones son muy relevantes en las respuestas anteriores.Tratando de dar mi escenario.Espero que esto pueda ayudar a otros.

estamos usando:

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

, y llamar a otras funciones en la secuencia de comandos en onchange de los eventos, pero writeln completamente reemplaza el código HTML en IE, donde, ya que está teniendo un comportamiento diferente en chrome.

cambiamos a:

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

Por lo tanto conserva la secuencia de comandos que se solucionó el problema.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top