Что вызывает ошибку "не удается выполнить код из освобожденного скрипта"

Я думал, что нашел решение некоторое время назад (см. Мой блог):

Если вы когда - нибудь получите ошибку JavaScript (или это должен быть JScript) "не удается выполнить код из освобожденного скрипта" - попробуйте переместить любые мета-теги в голове, чтобы они были перед вашими тегами скрипта.

...но на основе одного из последних комментариев в блоге исправление, которое я предложил, Может работать не для всех. Я думал, что это будет хорошо, чтобы открыть для сайте StackOverflow сообщество....

что вызывает ошибку "не удается выполнить код из освобожденного скрипта" и каковы решения/обходные пути?

12 ответов


похоже, вы столкнулись с ошибкой/проблемой в том, как обрабатываются некоторые теги или что у вас есть ссылки на выпущенные объекты, на которых вы пытаетесь выполнить методы.

сначала я бы переехал любой <meta> теги перед любым <script> теги, как предложил здесь и множество других мест.

затем проверьте, есть ли у вас проблемы с страницей/безопасностью здесь.


вы получаете эту ошибку при вызове функции, которая была создана в окне или фрейме, который больше не существует.

Если вы не знаете заранее, если окно все еще существует, вы можете сделать try / catch, чтобы обнаружить его:

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

ошибка возникает, когда "родительское" окно скрипта удалено (т. е. закрыто), но ссылка на скрипт, который все еще удерживается (например, в другом окне), вызывается. хоть "объект" еще жив, контекст, в котором он хочет выполнить не.

это несколько грязно, но он работает для моего гаджета боковой панели Windows:

вот общая идея: "Главное" окно устанавливает функцию, которая будет оценивать некоторый код, да, это так уродливый. Затем " ребенок "может вызвать эту" функцию builder "(которая /привязана к области главного окна/) и вернуть функцию, которая также привязана к "главному" окну. Очевидным недостатком является, конечно, то, что функция "отскок" не может закрываться над областью, в которой она, по-видимому, определена... во всяком случае, хватит бормотать:

это частично псевдо-код, но я использую его вариант на гаджете боковой панели Windows (я продолжаю говорить это, потому что гаджеты боковой панели работают "неограниченная зона 0", которая может-или не может-сильно изменить сценарий.)


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

в качестве варианта главное окно должно иметь возможность передавать функцию functionBuilder в дочернее окно - до тех пор, пока функция functionBuilder определена в контексте главного окна!

Я чувствую, что я использовал слишком много слов. YMMV.


Если вы пытаетесь получить доступ к объекту JS, самый простой способ-создать копию:

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

надеюсь, это поможет.


вот очень конкретный случай, в котором я видел это поведение. Он воспроизводим для меня в IE6 и IE7.

изнутри iframe:

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

затем, после перезагрузки iframe с новым содержимым, в окне, содержащем iframe:

window.mySpecialHandler();

этот вызов завершается с ошибкой "не удается выполнить код из освобожденного скрипта", потому что mySpecialHandler был определен в контексте (исходный DOM iframe), который больше не выходит. (Перезагрузка iframe уничтожила это контекст.)

однако вы можете безопасно установить "сериализуемые" значения (примитивы, графы объектов, которые не ссылаются на функции напрямую) в Родительском окне. Если вам действительно нужно отдельное окно (в моем случае iframe), чтобы указать некоторую работу в удаленном окне, вы можете передать работу как строку и "eval" ее в приемнике. Будьте осторожны с этим, как правило, это не делает для чистой или безопасной реализации.


начиная с IE9 мы начали получать эту ошибку при вызове .getTime () для объекта Date, хранящегося в массиве внутри другого объекта. Решение состояло в том, чтобы убедиться, что это дата перед вызовом методов даты:

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

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


эта ошибка может возникнуть в MSIE, когда дочернее окно пытается связаться с родительским окном, которое больше не открыто.

(не совсем самый полезный текст сообщения об ошибке в мире.)


я столкнулся с этой проблемой, когда внутри дочернего фрейма я добавил ссылочный тип в окно верхнего уровня и попытался получить к нему доступ после перезагрузки дочернего окна

то есть

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

я смог решить проблему, используя только примитивные типы

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

Это на самом деле не ответ, а скорее пример того, где именно это происходит.

У нас есть рамка A и рамка B (это была не моя идея, но я должен жить с ней). Кадр A никогда не меняется, кадр B постоянно меняется. Мы не можем применить изменения кода непосредственно к кадру A, поэтому (согласно инструкциям поставщика) мы можем запускать JavaScript только в кадре B - точном кадре, который продолжает меняться.

У нас есть фрагмент JavaScript, который должен выполняться каждые 5 секунд, поэтому JavaScript в фрейме B создает новый тег скрипта и вставляет его в головную часть фрейма B. В этом новом скрипте существует setInterval (тот, который вводится), а также функция для вызова. Несмотря на то, что введенный JavaScript технически загружен кадром A (поскольку теперь он содержит тег скрипта), после изменения кадра B функция больше не доступна setInterval.


Я получил эту ошибку в IE9 на странице, которая в конечном итоге открывает iFrame. Пока iFrame не был открыт, я мог использовать localStorage. Как только iFrame был открыт и закрыт, я больше не мог использовать localStorage из-за этой ошибки. Чтобы исправить это, мне пришлось добавить этот код в Javascript, который был внутри iFrame, а также использовать localStorage.

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

получил эту ошибку в DHTMLX при открытии диалога & Родительский идентификатор или текущий идентификатор окна не найден

        $(document).ready(function () {

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

});

просто убедитесь, что вы отправляете правильный идентификатор окна curr / parent при открытии диалога


при обновлении src iframe я получаю эту ошибку.

получил эту ошибку, обратившись к событию (нажмите в моем случае) элемента в главном окне, как это (вызов главного / крайнего окна напрямую):

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

Я просто изменил его так, и он отлично работает (вызывая родителя родителя окна iframe):

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

мой iframe, содержащий модальный, также находится внутри другого iframe.