2009-02-12 13 views
38

Der Client mit denen ich arbeite hat ein Frameset wie so ...Run JQuery im Rahmen eines anderen Rahmens

<frameset rows="100,*, 0"> 
    <frame name="theFrame" id="theFrame" src="blah.html" > 
    <frame name="theSecondFrame" id="theSecondFrame" src="foo.html" > 
    <frame name="importantFrame" id="importantFrame" src="myFrame.html" > 
</frameset> 

Wenn eine bestimmte Aktion stattfindet ich meinen Rahmen (importantframe die derzeit verborgen ist) müssen Meist übernehmen Sie die Seite und blockieren jegliche Interaktion mit den anderen Frames. Ich plane die Interaktion mit dem Jquery Block UI Plugin zu blockieren.

Das Problem ist, ich kann nicht wirklich die foo.html oder blah.html Dateien ändern. Der JS-Code kann also nicht dort leben. Was ich tun muss, ist meine jquery-Code im Kontext dieser Frames ausführen. Zur Erinnerung: Ich brauche meinen JQuery-Code, um in myFrame.html zu leben, aber im Kontext der anderen Frames. Wie kann ich das machen? Hoffnung, die Sinn macht.

Dank CDR

Antwort

0

ich über den Block-Plugin nicht sicher bin, aber man kann nicht habhaft des jeweiligen Rahmens und manipulieren sie die „frame Baum“, so etwas wie dies mit: (von innen importantFrame htm)

parent.theFrame.someProperty = someValue; 

zB:

parent.theFrame.location.href='anotherPage.html'; 

Von dem, was ich gelesen habe, könnte man JQuery auf der Zielseite müssen, aber man konnte somet versuchen Hängt wie:

parent.theFrame.block(); 

oder vielleicht:

$('#theFrame').block(); 
80

Die jQuery-Funktion, die Sie mit $ häufiger nennen, nimmt ein zweites Argument Kontext aufgerufen, die „das DOM-Element von jQuery-Objekt ist, soll ich Suche in ". In den meisten Fällen wird dieses Argument nicht angegeben, sodass der Kontext standardmäßig auf das aktuelle HTML-Dokument verweist. Wenn der Code im Iframe ausgeführt wird, wird das Dokument standardmäßig auf das Dokument dieses IFrames gesetzt. Aber Sie können das Dokument für einen der anderen Rahmen leicht greifen.

Zum Beispiel, setzen Sie dies in myFrame.html, und dies wird alle h1 Elemente aus dem Rahmen mit blah.html darin entfernen. Beachten Sie das zweite Argument $, was dem Ausdruck ist, der den bla Rahmen greift von innen wichtigen Rahmen:

<html> 
    <head> 
    <script type="text/javascript" src="/javascripts/jquery.js"></script> 
    <script type="text/javascript"> 
     function doIt() { 
     $('h1', window.parent.frames[0].document).remove() 
     } 
    </script> 
    </head> 
    <body> 
    <h1>My Frame</h1> 
    <a href="#" onclick="doIt()">Do It</a> 
    </body> 
</html> 
+0

Gute Antwort - ich war dabei, eine ähnliche Frage zu stellen! – CMPalmer

+2

Sie können den 'window.parent.frames [0] .document'-Teil auch als' window.parent.theFrame.document' schreiben, was mehr * verbose * ist. – joar

4

pjb3 Wie gesagt, stellen die jQuery Kontext. Wenn Sie verschachtelte Frames haben, wird Ihr Code wie folgt aussehen:

$('*',window.parent.frames[0].frames[0].document).size(); 

Oder, noch besser, eine Verknüpfung machen:

targetFrame = window.parent.frames[0].frames[0].document; 
$('*',targetFrame).size(); 
0

In Versionen von jQuery> = 1.7 keine Veranstaltungen alte Art und Weise bekommen

Ältere Versionen (< 1.7):

var events = $('#form').data('events'); 

1,7 und höher:

var events = $.fn.data($('#form'), 'events'); 
Verwandte Themen