Mam funkcję, która w innej ramce, którą muszę zastąpić. Ponadto muszę zadzwonić do pierwotnej funkcji z mojego nadpisania. Aby to zrobić, używam następujących czynności:

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

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

Kiedy wykonuję ten kod, otrzymuję "Nie można wykonać kodu z freed script".

Myśli? Czy jest lepszy sposób na to? Testowanie w IE 6,7,8 i 9.

3
RMD 7 grudzień 2011, 03:23

4 odpowiedzi

Najlepsza odpowiedź

Zrozdziałem rozwiązanie.

Zasadniczo bierzesz cały kod, który wcześniej wysłałem, a wykonaj go z w kontekście ramy docelowej za pomocą funkcji Eval (). Więc...

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

Ponieważ kod jest teraz w ramce docelowej, nie wychodzi z zakresu, a nie otrzymujemy już błędu "Uwolnione".

2
RMD 7 grudzień 2011, 15:50

Wiem, że to pytanie jest dość stare, ale na wypadek, gdybyś wpadł w to, sugeruję, abyś użył JSON.PARSE, aby utworzyć obiekt na ramie nadrzędnej, a nie eval, ponieważ eval jest zła (powoduje problemy z bezpieczeństwem, myślę, że domyślnie jest wyłączony Niektóre przeglądarki też są obecnie)

Na przykład, jeśli chcesz zadzwonić someFunction na ramce 1, przekazując go JSON obiekt, użyj czegoś takiego jak poniżej:

var frame = window.frames[1];
frame.someFunction( frame.JSON.parse( '{ "attr": 7 }' ) );
0
Dead.Rabit 11 maj 2018, 09:49

Nie możesz tego zrobić w IE, odkryłeś. Musisz upewnić się, że przechodzą jakieś obiekty między ramkami, są rodzimymi rzeczami jak ciągłe. Nawet instancje "Date" spowodowały, że problemy, choć było to na niejasnych wersjach systemu Windows 2000 z powrotem w ciągu dnia.

Przez "Freed Script", co oznacza, że twój kontekst strony, w którym obiekt był "urodzony" został nadpisany nową stronę.

4
Pointy 6 grudzień 2011, 23:31

Jeśli przychodzisz tutaj z Google i szukasz łatwego rozwiązania, aby rozwiązać ten problem w IE:

W naszym przypadku wystąpił problem, ponieważ pracowaliśmy z wydarzeniami Inbetween IFrames. W ten sposób było to możliwe, że po zmianie zawartości IFRAME w połączeniu z wyzwalanym wydarzeniem próbował wywołać skrypt na teraz zmienionym dokumencie IFRAME. Uniósł to pytanie o wyjątek.

Poprzez dodanie

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

Problem przestanieby zostać podniesiony. Wreszcie nie spróbuj / połów z powodu IE.

3
Dbl 17 kwiecień 2014, 15:31