2010-05-27 8 views
26

mam 2 ramek w jedną stronę, jak to (/home.html)Jak do ramy (nie iframe) zawartość z jQuery

<frameset rows="50%, 50%"> 
     <frame id="treeContent" src="treeContent.html" /> 
     <frame id="treeStatus" src="treeStatus.html" /> 
</frameset> 

a następnie w jednej ramce (treeStatus.html) I mieć coś takiego jakChcę z górnego okna manipulować div znajdującym się w ramce podrzędnej poprzez jquery (np. pokaż i ukryj).

Widziałem severalquestionslikethis i sugerują następujące

$(document).ready(function(){ 

      $('#treeStatus').contents().find("#statusText").hide(); 
    }); 

ja nie wiem, czy to działa z iframe, ale w moim przypadku, gdy mam proste ramki nie wydają się działać. Kod jest umieszczony wewnątrz strony home.html

Oto wyjście z konsoli firebug

>>> $('#treeStatus') 
[frame#treeStatus] 
>>> $('#treeStatus').contents() 
[] 
>>> $('#treeStatus').children() 
[] 

Więc jak mam dostęp do elementów ramowych z górnej ramki? Czy coś mi umyka?

Odpowiedź

Po połączeniu obu odpowiedzi tutaj, prawidłowy sposób jest

$('#statusText',top.frames["treeStatus"].document).hide(); 

Aby to działało rama musi mieć nazwę atrybut oprócz id, tak:

<frameset rows="50%, 50%"> 
      <frame id="treeContent" src="treeContent.html" /> 
      <frame name="treeStatus" id="treeStatus" src="treeStatus.html" /> 
    </frameset> 
+0

Tylko uwaga : dlaczego używasz ramek, kiedy możesz użyć 'position: fixed', aby dodać pasek stanu (lub log sugerowany przez rozmiar) zawsze w dolnej części okna ekranu ... obsługującego starą przeglądarkę? – alex

+0

@alex to tylko minimalny przykład, który stworzyłem dla stackoverflow. Prawdziwa aplikacja jest zupełnie inna. Jest to bardziej skomplikowane niż proste paski stanu. Ramki są wymagane (nie pytaj!). – kazanaki

+0

OK, bez obaw. Pomyślałem, że dodam to (niektórzy ludzie nie wiedzą o 'position: fixed'). – alex

Odpowiedz

11

Można pobrać ramkę i div, które chcesz manipulować i przekazać go do zmiennej.

var statusText = top.frames["treeStatus"].document.getElementById('statusText'); 

Następnie można zrobić wszystko, co chcesz, za pośrednictwem jQuery.

$(statusText).whatever(); 

Choć czasami po prostu nie można ominąć konieczności korzystania z ramek, należy pamiętać, że znacznik <frame> jest zastąpiony w HTML5. Jeśli kiedykolwiek planujesz przejść na HTML5, musisz użyć iFrame.

+0

Nie dokładnie to, co chciałem, ponieważ wierzę, że celem jQuery jest uniknięcie getElementById. Jednak twoja odpowiedź pomogła mi zrobić to, co chcę, więc akceptuję to. – kazanaki

+0

wielki człowiek post, pracował jak urok –

5

Musisz podać odniesienie do ramki, którą masz Aby uzyskać dostęp:

$("some selector", top.frames["treeStatus"])) 
+2

Próbowałem tego i to nie działa samodzielnie. Po zobaczeniu przenośnej odpowiedzi, zadziałałem z $ ("jakiś selektor", top.frames ["treeStatus"]. Document)), a także dodając "treeStatus" jako nazwę oprócz id – kazanaki

4

Mam ramki zagnieżdżone.W moim przypadku, aby to działało użyłem komendy:

var statusText = 
top.document.getElementById("treeStatus").contentDocument.getElementById("statusText"); 

Potem, jak Charles już odpowiedział, można zrobić wszystko, co chcesz do niego poprzez jQuery:

$(statusText).whatever(); 
+0

contentDocument jest tym, czego szukam! Ja też mam zagnieżdżone ramki, dzięki za ten post! – NetWave

2

Dla czystego roztworu jquery (który nie wymaga top.frames etc), następujące wydaje się działać:

$('some selector for item from frame' ,$('frame selector')[0].contentDocument) 

Ma to tę zaletę, że działa dla zagnieżdżonych ramek:

$('inner frame item selector', $('inner frame selector', $('outer frame selector')[0].contentDocument)[0].contentDocument)