Kan geen code uitvoeren vanuit een bevrijd script

Ik heb een functie die in een ander frame moet worden overschreven. Bovendien moet ik vanuit mijn override de oorspronkelijke functie aanroepen. Om dit te doen, gebruik ik het volgende:

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

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

Wanneer ik deze code uitvoer, krijg ik "Can not execute code from a freed script".

Gedachten? Is er een betere manier om dit te doen? Testen in IE 6,7,8 en 9.

2
werkt prima voor mij in FF, Chrome en IE .. in welke browser wordt dit uitgevoerd? Het kan een ander deel in uw code zijn dat dit veroorzaakt ..
toegevoegd de auteur Gabriele Petrioli, de bron
Het frame bestaat waarschijnlijk niet meer op het moment dat u het probeert te openen. Zie: stackoverflow.com/questions/83132/…
toegevoegd de auteur Wayne Burkett, de bron
Ik heb nodig om te weten wat een bevrijd script betekent!
toegevoegd de auteur Pierre, de bron
Jongens, "freed script" is onderdeel van de foutmelding die ik krijg van IE. Als je niet weet wat "bevrijd script" betekent, reageer dan niet op mijn vraag.
toegevoegd de auteur RMD, de bron
Ter verduidelijking: "myFrame" wordt tijdens deze uitvoering niet opnieuw geladen.
toegevoegd de auteur RMD, de bron
IE 6,7,8 en 9.
toegevoegd de auteur RMD, de bron
Bevrijd in deze context betekent bevrijd van het geheugen, dus verwijderd/vermist. Ik kwam uit de opmerking van @ iwburk
toegevoegd de auteur Dead.Rabit, de bron

4 antwoord

Dat kun je niet doen in IE, je hebt het ontdekt. U moet ervoor zorgen dat objecten die u tussen frames doorgeeft, inheemse dingen zijn, zoals tekenreeksen. Zelfs "Datum" -instanties hebben me problemen bezorgd, hoewel dat vroeger op obscure versies van Windows 2000 gebeurde.

Met "freed script" betekent IE dat uw paginacontext waarin een object is "geboren" is overschreven door een nieuwe pagina.

4
toegevoegd
Ja, dat kan, maar het probleem doet zich voor als je een "oud" object hebt dat op een andere pagina is geboren. Zodra uw code het probeert aan te raken, realiseert IE zich dat het prototype-object (en etc.) verdwenen is. Het is gewoon de manier waarop het JScript-mechanisme lijkt te werken.
toegevoegd de auteur Pointy, de bron
Nou, het heeft waarschijnlijk iets te maken met dingen heen en weer tussen de pagina's. Of misschien als u de functie in het andere frame opheft en dan wordt het frame waarvan u dat doet, overschreven. Nu, als je frames volledig statisch zijn en ze nooit worden herladen met nieuwe pagina's van de server, dan is dat een nieuwe voor mij.
toegevoegd de auteur Pointy, de bron
Dus er is geen manier om een ​​functie in een ander frame in IE op te heffen? Wat vreemd is, is dat zelfs als ik variabelen gebruik in "myFrame" om de functie-aanwijzers vast te houden, ik toch deze fout krijg.
toegevoegd de auteur RMD, de bron
Wat staat er in mijn code voor het "oude" object? Hoe kan ik deze code wijzigen om te voorkomen dat dit gebeurt?
toegevoegd de auteur RMD, de bron

Als je hier komt via Google en op zoek bent naar een eenvoudige oplossing om dit probleem op te lossen in IE:

In ons geval is het probleem opgetreden, omdat we werkten met gebeurtenissen tussen iframes. Door dit te doen was het mogelijk dat, bij het wijzigen van de iframe-inhoud in combinatie met een getriggerde gebeurtenis, het zou proberen om het script in het nu gewijzigde iframe-document te roepen. dit bracht de uitzondering in kwestie naar voren.

door toe te voegen

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

het probleem zou ophouden te worden verhoogd. Eindelijk geen try/catch vanwege IE.

2
toegevoegd
handler is optioneel - u kunt dus (bijvoorbeeld) .off ('klik') doen als u alle jQuery-klikhandlers op het doelelement kunt wissen.
toegevoegd de auteur Stan, de bron

Ik heb de oplossing bedacht.

In principe neemt u alle code die ik eerder heb gepost, en voert u deze uit binnen de context van het doelframe met behulp van de functie eval (). Zo...

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

Omdat de code zich nu binnen het doelkader bevindt, valt deze niet buiten het bereik en krijgen we de "bevrijde" fout niet meer.

2
toegevoegd

Ik weet dat deze vraag vrij oud is, maar in het geval dat je dit tegenkomt, zou ik voorstellen om JSON.parse te gebruiken om een ​​object op het bovenliggende frame te maken in plaats van eval omdat eval slecht is (veroorzaakt beveiligingsproblemen, ik denk dat het standaard is uitgeschakeld in sommige browsers tegenwoordig ook)

Als u bijvoorbeeld someFunction in frame 1 wilt aanroepen en een JSON-object wilt doorgeven, gebruikt u zoiets als het onderstaande:

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