2009-02-12 18 views
38

klient Pracuję z ramek ma jak tak ...Run JQuery w kontekście innej ramki

<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> 

Kiedy pewna akcja odbywa Potrzebuję ramki (importantframe który obecnie jest ukryty) do przeważnie przejmują stronę i blokują interakcję z innymi ramkami. Planuję blokować interakcję za pomocą wtyczki bloku jquery UI.

Problem polega na tym, że nie mogę zmienić plików foo.html ani blah.html. Tak więc kod JS nie może tam mieszkać. Co muszę zrobić, to wykonać mój kod jquery w kontekście tych ramek. Tak więc, aby podsumować, potrzebuję mojego kodu JQuery, aby żyć w myFrame.html, ale wykonać w kontekście innych ramek. Jak mogę to zrobić? Mam nadzieję, że ma to sens.

Dzięki CDR

Odpowiedz

0

nie jestem pewien o wtyczki bloku, ale nie można zdobyć odpowiedniej ramy i manipulować za pomocą „drzewa klatek”, mniej więcej tak: (od wewnątrz importantFrame htm)

parent.theFrame.someProperty = someValue; 

np

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

z tego co czytałem, może być konieczne Jquery na stronie docelowej, ale można spróbować SOMET hing jak:

parent.theFrame.block(); 

czy może:

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

The jQuery funkcję, którą powszechnie nazywamy z $, bierze drugi argument o nazwie kontekście, który „który DOM element obiektu jQuery mam szukaj w ". W większości przypadków ten argument jest pomijany, więc kontekst jest domyślnie ustawiony na bieżący dokument HTML. Gdy kod jest wykonywany w elemencie iframe, dokument domyślnie przyjmuje ten dokument iframe. Ale możesz łatwo pobrać dokument dla jednej z pozostałych ramek.

Na przykład, umieść to w myFrame.html, a to usunie wszystkie elementy h1 z ramki z blah.html w tym. Zauważ, że drugi argument $, które jest wyrażeniem chwyta od wewnątrz ramki bla ważne ramy:

<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

Dobra odpowiedź - już miałem zadać podobne pytanie! – CMPalmer

+2

Możesz również napisać fragment 'window.parent.frames [0] .document' jako' window.parent.theFrame.document', który jest bardziej * verbose *. – joar

4

jak pjb3 że ustawić kontekst jQuery. Jeśli masz zagnieżdżone ramek, Twój kod będzie wyglądać następująco:

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

Albo, jeszcze lepiej, utworzyć skrót:

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

W wersjach jQuery> = 1,7 nie możemy uzyskać wydarzeń staremu

Starsze wersje (< 1.7):

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

1.7 i nowsze:

var events = $.fn.data($('#form'), 'events'); 
Powiązane problemy