Что вызывает ошибку " не удается выполнить код из освобожденного скрипта"
Я думал, что нашел решение некоторое время назад (см. Мой блог):
Если вы когда - нибудь получите ошибку JavaScript (или это должен быть JScript) "не удается выполнить код из освобожденного скрипта" - попробуйте переместить любые мета-теги в голове, чтобы они были перед тегами вашего скрипта.
...но, основываясь на одном из последних комментариев в блоге, я предложил Может не работать для всех. Я думал, что это будет хорошо, чтобы открыть для сайте StackOverflow сообщество....
что вызывает ошибку "не удается выполнить код из освобожденного скрипта" и каковы решения/обходные пути?
12 ответов:
похоже, что вы столкнулись с ошибкой/проблемой в том, как обрабатываются некоторые теги или что у вас есть ссылки на выпущенные объекты, на которых вы пытаетесь выполнить методы.
сначала я бы переехал любой
<meta>теги перед любым<script>теги, как предложил здесь и множество других мест.затем проверьте, если у вас есть страница/вопросы безопасности обсуждаются здесь.
вы получаете эту ошибку при вызове функции, которая была создана в окне или фрейме, который больше не существует.
Если вы не знаете заранее, если окно все еще существует, вы можете попробовать/поймать, чтобы обнаружить его:
try { f(); } catch(e) { if (e.number == -2146823277) // f is no longer available ... }
ошибка возникает, когда "родительское" окно скрипта удалено (т. е. закрыто), но ссылка на скрипт, который все еще удерживается (например, в другом окне), вызывается. хоть "объект" еще жив, контекст, в котором он хочет выполнить не.
это несколько грязно, но это работает для моего гаджета боковой панели Windows:
вот общая идея: "Главное" окно устанавливает функцию, которая будет evaluate некоторый код, да, это то, что уродливый. Затем " ребенок "может вызвать эту" функцию строителя "(которая /привязана к области главного окна/) и получить обратно функцию, которая также привязана к "главному" окну. Очевидным недостатком является, конечно, то, что функция, являющаяся "отскоком", не может закрывать область, в которой она, по-видимому, определена... во всяком случае, хватит бормотать:
это частично псевдокод, но я использую его вариант на гаджете боковой панели 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 определена в контексте главного окна!
Я чувствую, что использовал слишком много слов. МММ.
Если вы пытаетесь получить доступ к объекту JS, самый простой способ-создать копию:
var objectCopy = JSON.parse(JSON.stringify(object));надеюсь, что это поможет.
вот очень конкретный случай, в котором я видел такое поведение. Это воспроизводимо для меня в IE6 и IE7.
изнутри iframe:
window.parent.mySpecialHandler = function() { ...work... }затем, после перезагрузки iframe с новым содержимым, в окне, содержащем iframe:
window.mySpecialHandler();этот вызов завершается с ошибкой "не удается выполнить код из освобожденного скрипта", потому что mySpecialHandler был определен в контексте (исходный DOM iframe), который больше не завершается. (Перезагрузка iframe уничтожила это контекст.)
начиная с IE9 мы начали получать эту ошибку при вызове .getTime () для объекта даты, хранящегося в массиве внутри другого объекта. Решение состояло в том, чтобы убедиться, что это была дата перед вызовом методов даты:
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 (поскольку он теперь содержит тег script), после изменения фрейма 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 / родительского окна при открытии диалога
при обновлении 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.
Comments