it-swarm-pt.tech

O que causa o erro "Não é possível executar o código de um script liberado"

Eu pensei que tinha encontrado a solução há um tempo atrás (veja meu blog ):

Se você tiver o erro JavaScript (ou deveria ser JScript) "Não é possível executar o código de um script liberado" - tente mover quaisquer metatags na cabeça para que fiquem antes das tags do script. 

... mas com base em um dos comentários mais recentes do blog, a correção sugerida pode não funcionar para todos. Eu pensei que isso seria um bom para abrir a comunidade StackOverflow ....

O que causa o erro "Não é possível executar o código de um script liberado" e quais são as soluções/soluções alternativas?

57
Tom Robinson

Parece que você acertou um bug/problema na forma como algumas tags são manipuladas ou que você tem referências a objetos liberados nos quais você está tentando executar métodos.

Primeiro eu movia qualquer tag <meta> antes de qualquer tag <script> como sugerido aqui e em vários outros lugares.

Em seguida, verifique se você tem problemas de página/segurança discutidos aqui .

19
Joe Skora

Você recebe esse erro quando chama uma função que foi criada em uma janela ou quadro que não existe mais. 

Se você não sabe de antemão se a janela ainda existe, você pode tentar/detectar:

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

O erro é causado quando a janela 'pai' do script é descartada (isto é: fechada), mas uma referência ao script que ainda está em espera (como em outra janela) é invocada. Mesmo que o 'objeto' ainda esteja ativo, o contexto no qual ele deseja executar não é.

Está um pouco sujo, mas funciona para o meu Gadget da Barra Lateral do Windows:

Aqui está a idéia geral: A janela 'principal' configura uma função que irá avaliar alguns códigos, sim, é tão feia. Então uma 'criança' pode chamar isso de "função construtora". "(que é/ligado ao escopo da janela principal /) e retorna uma função que também é ligada à janela 'main'. Uma desvantagem óbvia é, claro, que a função que está sendo 'rebatida' não pode ser encerrada no escopo que ela aparentemente está definida ... de qualquer maneira, o suficiente do gibber:

Isso é parcialmente pseudo-código, mas eu uso uma variante dele em um Gadget da Barra Lateral do Windows (eu continuo dizendo isso porque os Gadgets da Barra Lateral são executados em "zona irrestrita 0", o que pode - ou não) mudar muito o cenário.)


// 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 variante, a janela principal deve ser capaz de passar a função functionBuilder para a janela filho - desde que a função functionBuilder esteja definida no contexto da janela principal!

Eu sinto que usei muitas palavras. YMMV.

18
user166390

Se você está tentando acessar o objeto JS, a maneira mais fácil é criar uma cópia:

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

Espero que ajude.

8
Grzegorz Ciwoniuk

Aqui está um caso muito específico em que eu vi esse comportamento. É reproduzível para mim no IE6 e IE7.

De dentro de um iframe:

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

Em seguida, depois de recarregar o iframe com novo conteúdo, na janela que contém o iframe:

window.mySpecialHandler();

Essa chamada falha com "Não é possível executar código de um script liberado" porque mySpecialHandler foi definido em um contexto (o DOM original do iframe) que não sai mais. (Recarregar o iframe destruiu esse contexto.)

No entanto, você pode definir com segurança valores "serializáveis" (primitivos, gráficos de objetos que não fazem referência a funções diretamente) na janela pai. Se você realmente precisa de uma janela separada (no meu caso, um iframe) para especificar algum trabalho para uma janela remota, você pode passar o trabalho como uma String e "eval" no receptor. Tenha cuidado com isso, geralmente não garante uma implementação limpa ou segura.

6
aaron

A partir do IE9, começamos a receber esse erro ao chamar .getTime () em um objeto Date armazenado em uma matriz dentro de outro objeto. A solução era certificar-se de que era uma data antes de chamar métodos de data:

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

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

5
Tom

Este erro pode ocorrer no MSIE quando uma janela filho tenta se comunicar com uma janela pai que não está mais aberta.

(Não é exatamente o texto de mensagem de erro mais útil do mundo.)

3
pcorcoran

Eu corri para este problema quando dentro de um frame filho eu adicionei um tipo de referência para a janela de nível superior e tentou acessá-lo após a janela filho recarregada

isto é.

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

Consegui resolver o problema usando apenas tipos primitivos

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

Isso não é realmente uma resposta, mas mais um exemplo de onde isso acontece com precisão.

Temos quadro A e quadro B (isso não foi ideia minha, mas tenho que conviver com isso). O quadro A nunca muda, o quadro B muda constantemente. Não podemos aplicar alterações de código diretamente no quadro A, então (de acordo com as instruções do fornecedor) só podemos executar JavaScript no quadro B - o quadro exato que continua mudando.

Temos um pedaço de JavaScript que precisa ser executado a cada 5 segundos, portanto, o JavaScript no quadro B cria uma nova tag de script e é inserido na seção de cabeçalho do quadro B. O setInterval existe neste novo script (o injetado), como bem como a função de invocar. Mesmo que o JavaScript injetado seja tecnicamente carregado pelo quadro A (já que agora contém a tag de script), uma vez que o quadro B muda, a função não é mais acessível pelo setInterval.

1
Nathan Crause

Eu tenho esse erro no IE9 dentro de uma página que, eventualmente, abre um iFrame. Contanto que o iFrame não estivesse aberto, eu poderia usar o localStorage. Depois que o iFrame foi aberto e fechado, não consegui mais usar o localStorage devido a esse erro. Para corrigi-lo, eu tive que adicionar esse código no Javascript que estava dentro do iFrame e também usando o localStorage.

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

Na atualização do src do iframe eu estou recebendo esse erro.

Obtive esse erro, acessando um evento (clique no meu caso) de um elemento na janela principal como este (chamando a janela principal/outmost diretamente): 

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

Eu apenas mudei assim e funciona bem (chamando o pai do pai da janela do iframe):

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

Meu iframe contendo o modal também está dentro de outro iframe.

0
Chan

As explicações são muito relevantes nas respostas anteriores. Apenas tentando fornecer meu cenário. Espero que isso possa ajudar os outros.

nós estávamos usando:

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

e chamando outras funções no script em eventos onchange, mas o writeln sobrescreve completamente o HTML em IE onde ele está tendo um comportamento diferente no chrome.

nós mudamos para:

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

Assim, reteve o script que corrigiu o problema.

0
pavan kumar

recebi este erro em DHTMLX ao abrir um diálogo & ID pai ou ID da janela atual não encontrado 

        $(document).ready(function () {

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

});

Apenas certifique-se de que você está enviando a ID da janela atual/pai correta ao abrir um diálogo

0
panky sharma