Pergunta

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

Se você já teve a JavaScript (ou que deveria ser JScript) de erro "Não é possível executar código de um script liberado" - tente mover quaisquer meta tags na cabeça de modo que eles estão diante de seus tags de script.

... mas com base em um dos mais recentes comentários do blog, a correção sugeri podem não funcionar para todos. Eu pensei que esta seria uma boa para se abrir para a comunidade StackOverflow ....

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

Foi útil?

Solução

Parece que você bateu um bug / problema na forma como algumas tags são manipulados ou que você tem referências a objetos lançados no qual você está tentando executar métodos.

Primeiro eu mover quaisquer etiquetas <meta> antes de qualquer marca <script> como sugerido aqui numerosos outros lugares.

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

Outras dicas

Você recebe este erro quando você chamar uma função que foi criado em uma janela ou o quadro que já não existe.

Se você não sabe com antecedência se a janela ainda existe, você pode fazer um try / catch para detectá-lo:

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

O erro é causado quando a janela 'mãe' do roteiro é disposto (por exemplo: fechada) mas uma referência para o script que ainda é mantido (tal como em outra janela) é invocado Mesmo. embora o 'objeto' ainda está vivo, o contexto em que se deseja executar não é.

É um pouco sujo, mas funciona para o meu Windows Sidebar Gadget:

Aqui está a idéia geral: Os 'principais' sets janela até uma função que irá eval'uate algum código, sim, é que feio. Em seguida, uma 'criança' pode chamar essa função "construtor" (que é / vinculado ao escopo da janela principal /) e voltar uma função que também está vinculado à janela 'main'. Uma desvantagem óbvia é, naturalmente, que a função de ser 'rebote' não pode fechamento sobre o escopo é aparentemente definido na ... de qualquer maneira, o suficiente do gibbering:

Isto é parcialmente pseudo-código, mas eu usar uma variante do mesmo em um Windows Sidebar Gadget (Eu continuo dizendo isso porque Sidebar Gadgets corrida na "zona sem restrições 0", o que pode - ou não - mudar o cenário muito.)


// 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 uma variante, a janela principal deve ser capaz de passar a função functionBuilder para a janela de criança - desde que a função functionBuilder é definido no contexto principal janela

Eu sinto que eu usei palavras demais. YMMV.

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

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

Hope ele vai ajudar.

Este erro pode ocorrer em MSIE quando uma janela filho tenta se comunicar com uma janela pai que não é mais aberto.

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

Aqui está um caso muito específico em que eu já vi esse comportamento. É reprodutí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 novos conteúdos, na janela que contém o iframe:

window.mySpecialHandler();

Esta chamada falhar com "Não é possível executar código de um script liberado", porque mySpecialHandler foi definida em um contexto (DOM original do iframe) que há saídas mais longas. (Recarregar o iframe destruída neste contexto.)

No entanto, pode definir com segurança valores "serializeable" (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 remoto, você pode passar o trabalho como uma String e "eval"-lo no receptor. Tenha cuidado com isso, geralmente não faz para uma implementação limpa ou seguro.

A partir de IE9 começamos a receber este erro ao chamar .getTime () em um objeto Data armazenados em uma matriz dentro de outro objeto. A solução era ter certeza de que era um encontro antes de chamar métodos Data:

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

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

Eu corri para este problema quando dentro de um quadro filho eu adicionei um tipo de referência para a janela de nível superior e tentaram acessá-lo após a janela de criança Reloaded

i.

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

Eu era capaz de resolver o problema usando somente tipos primitivos

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

Isto não é realmente uma resposta, mas mais um exemplo de onde isso precisamente acontece.

Temos quadro A e quadro B (esta ideia não foi minha, mas eu tenho que viver com ele). Quadro Um nunca muda, Quadro B muda constantemente. Não podemos aplicar alterações de código diretamente no quadro A, então (por instruções do fornecedor) que só pode executar JavaScript no quadro B -. O quadro exato que continua a mudar

Temos um pedaço de JavaScript que precisa ser executado a cada 5 segundos, de modo que o JavaScript no quadro B criar uma nova marca de script e se insere na seção de cabeçalho de quadro B. O setInterval existe nesta novos scripts (aquele injetados ), bem como a função de chamar. Mesmo que o injectado JavaScript é tecnicamente carregado por quadro A (uma vez que agora contém o tag de script), uma vez que as alterações quadro B, a função não está mais acessível pelo setInterval.

Eu tenho esse erro no IE9 dentro de uma página que eventualmente abre um iFrame. Enquanto o iFrame não estava aberto, eu poderia usar localStorage. Uma vez que o iFrame foi aberta e fechada, eu não era capaz de usar mais o localStorage por causa deste erro. Para corrigi-lo, eu tive que adicionar este código no Javascript que estava dentro do iFrame e também usando o localStorage.

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

tenho esse erro em DHTMLX ao abrir um diálogo e pai id ou corrente id janela não encontrada

        $(document).ready(function () {

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

});

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

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

Got esse erro ao acessar um evento (clique no meu caso) de um elemento na janela principal assim (chamando a principal janela / outmost diretamente):

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

Eu só mudou como este e ele funciona muito 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.

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

estávamos usando:

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

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

mudamos para:

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

Assim, manteve o script que corrigiu o problema.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top