Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

Ответ 3

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

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

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

Это частично псевдокод, но я использую его вариант в гаджете боковой панели 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 
// 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.

Ответ 4

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

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

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

Ответ 5

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

Изнутри iframe:

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

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

window.mySpecialHandler();

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

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

Ответ 6

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

Ошибка: rowTime = wl.rowData[a][12].getTime()

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

Ответ 7

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

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

Ответ 8

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

то есть.

// 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());

Ответ 9

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

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

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

Ответ 10

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

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

Ответ 11

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

        $(document).ready(function () {

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

});

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

Ответ 12

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

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

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

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

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

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