2008-09-17 5 views
47

я думал, что я нашел решение некоторое время назад (см мой blog):Что вызывает ошибку «Не удается выполнить код из освобожденного сценария»

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

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

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

ответ

19

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

Сначала я переместил любые теги <meta> перед любыми <script> тегами как предложено here и многими другими городами.

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

+1

, я только что получил ошибку без любые метатеги на моей странице – 2012-09-27 11:22:22

3

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

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

+2

Или наоборот (от родителя к ребенку) – erlando 2008-09-17 14:15:52

+1

Я получаю это, когда дочернее окно вызывает функцию в родительском окне и передает ей аргумент, а затем закрывается. Кажется, что аргумент (объект, созданный дочерним элементом) сразу освобождается при закрытии дочернего элемента и, несмотря на то, что он уже передан родительскому объекту, родитель не может получить к нему доступ после закрытия дочернего элемента – 2016-05-26 17:18:42

31

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

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

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

будут ли это делать то же самое? (typeof f == "undefined") {/ * not avail * /} – TJR 2011-11-04 16:06:06

+0

Я не уверен, но я не стал бы рассчитывать на это. Я предполагаю, что typeof f будет вызывать ошибку или иначе возвращает «function» или «unknown». – 2011-11-05 12:53:36

16

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

Это несколько грязного, но это работает на мой Windows Sidebar Gadget:

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

Это частично псевдокод, но я использовать вариант этого на боковой панели Windows Gadget (Я все это говорю, потому что Sidebar Gadgets работать в «неограниченной зоне 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 дочернему окну - до тех пор, пока функция mainBuilder определена в контексте главного окна!

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

6

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

С в плавающем фрейме:

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

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

window.mySpecialHandler(); 

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

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

5

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

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

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

1

Это не совсем ответ, но еще пример того, где это происходит именно ,

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

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

0

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

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

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

т.е.

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

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

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

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

0

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

 $(document).ready(function() { 

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

}); 

Просто убедитесь, что вы отправляете правильный идентификатор ТОКА/родительское окно при открытии диалога

0

О обновление 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, содержащий модальных также внутри другого фрейма.

Смежные вопросы