Не могу выполнить код из освобожденного скрипта - PullRequest
3 голосов
/ 07 декабря 2011

У меня есть функция, которая в другом кадре, которую мне нужно переопределить.Кроме того, мне нужно вызвать исходную функцию из моего переопределения.Для этого я использую следующее:

myFrame.SomeFunction = (function () {
    var originalSomeFunction = myFrame.SomeFunction;

    return function(arg1, arg2, arg3) {
        alert('In override!');
        originalSomeFunction(arg1, arg2, arg3);
    };
})();

Когда я выполняю этот код, я получаю «Не могу выполнить код из освобожденного скрипта».Есть лучший способ сделать это?Тестирование в IE 6,7,8 и 9.

Ответы [ 4 ]

4 голосов
/ 07 декабря 2011

Вы не можете сделать это в IE, вы обнаружили.Вы должны убедиться, что любые объекты, которые вы передаете между кадрами, являются нативными вещами, такими как строки.Даже экземпляры «Date» вызывали у меня проблемы, хотя это было на неясных версиях Windows 2000.

Под «освобожденным сценарием» IE подразумевает, что ваш контекст страницы, где был «рожден» объект"была перезаписана новой страницей.

2 голосов
/ 17 апреля 2014

Если вы приходите сюда из Google и ищете простое решение для решения этой проблемы в IE:

В нашем случае проблема возникла, потому что мы работали с событиями между iframes. Таким образом, возможно, что после изменения содержимого iframe в сочетании с инициированным событием он попытается вызвать сценарий для измененного документа iframe. это подняло исключение, о котором идет речь.

добавив

$(window).on("unload", function(){
    $(target).off(eventname, handler);
});

проблема перестала бы подниматься. Наконец, нет попытки / поймать из-за IE.

2 голосов
/ 07 декабря 2011

Я разобрался с решением.

По сути, вы берете весь код, который я ранее разместил, и выполняете его из контекста целевого фрейма с помощью функции eval (). Итак ...

myFrame.eval("SomeFunction = (function () {var originalSomeFunction = SomeFunction; return function (arg1, arg2, arg2) {alert('Inside override!'); originalSomeFunction(arg1, arg2, arg3);};})();");

Поскольку код теперь находится в целевом фрейме, он не выходит за рамки видимости, и мы больше не получаем «освобожденную» ошибку.

0 голосов
/ 11 мая 2018

Я знаю, что этот вопрос довольно старый, но в случае, если вы столкнетесь с этим, я предлагаю вам использовать JSON.parse для создания объекта в родительском фрейме, а не в eval, потому что eval - это зло (вызывает проблемы с безопасностью, я думаю, что он отключен по умолчанию в некоторых браузерах и сегодня)

Например,

, если вы хотите вызвать someFunction в кадре 1, передав ему объект JSON, используйте что-то вроде следующего:

var frame = window.frames[1];
frame.someFunction( frame.JSON.parse( '{ "attr": 7 }' ) );
...