2012-11-11 12 views
11

Moim głównym celem jest:Jak mogę wysłać zdarzenie z okna dziecko do swojego okna nadrzędnego

Idąc do mojej aplikacji, otworzyć odnośnik znajduje się w nowej karcie, zrobić coś w nowej karcie i wysłać zdarzenie do głównej zakładki, aby odświeżyć.

nauczyłem 2 technik, które nie robi dokładnie to, czego potrzebuję:

  1. postMessage - roboty o ile wiem, tylko na iframe, a nie na kartach
  2. window.opener - działa tylko z window.open (url), który otwiera tylko nowe okno, a nie nową kartę.

Jak przekazać wydarzenie od dziecka do rodzica za pomocą zakładek? Byłbym szczęśliwy z konkretnego przykładu kodu javascript w rodzicu i dziecku. Powinien działać w wielu domenach (na przykład: www.mydomain.com i bills.mydomain.com).

Czy brakuje mi rozwiązania jQuery?

+1

Wierzę, że 'window.open' powinien zwrócić nowy obiekt _Window_ i jeśli nie masz problemów z tą samą zasadą pochodzenia, możesz dołączyć detektora z obiektu nadrzędnego do tego obiektu lub ustawić interwał, który sprawdza pewną zmienną. –

+0

@PaulS., To window.open nie otwiera się w nowej karcie. – Alon

+0

@Alon Działa w Firefoksie. –

Odpowiedz

6

następujące prace dla mnie w Chrome, Firefox, IE (nie testowałem więcej przeglądarek)

zakładamy 3 dokumenty

  1. (www.mydomain.com/parent.html) strona, która zawiera dokument „main' z linkiem
  2. (bills.mydomain.com/child.html) strony, która zostanie otwarta przez link
  3. (www.mydomain.com/dispatcher.html) wyjaśnione później

najpierw ustawić domeny-własność wszystkich 3 dokumentach mydomain.com

<script> 
document.domain="mydomain.com"; 
</script> 

w Parent.html stworzenia ukryty element iframe z właściwością name np "ukryta ramka". Utwórz także funkcję, która może później otrzymać odpowiedź.

Parent.html powinna teraz wyglądać następująco:

<script> 
document.domain="mydomain.com"; 
function fx(msg)//receives the response 
{ 
    alert(msg) 
} 
</script> 
<iframe name="hiddenframe" style="display:none"></iframe> 
<a href="http://bills.mydomain.com/child.html" target="_blank">click</a> 

W Child.html będziesz teraz w stanie załadować dokument do ukrytego iframe wewnątrz Parent.html

<script> 
document.domain="mydomain.com"; 
window.open('http://www.mydomain.com/dispatcher.html','hiddenframe'); 
</script> 

(nie mylić w obliczu korzystania z window.open() tutaj, nie otworzy się nowe okno, strona zostanie załadowana do elementu iframe w parent.html)


W dispatcher.html możesz teraz wywołać funkcję wewnątrz rodzica.html

<script> 
document.domain="mydomain.com"; 
parent.fx('you just got some response'); 
</script> 

Kiedy tylko trzeba przeładować Parent.html to jest trochę łatwiej.

ponownie ustawić document.domain-Nieruchomości w Parent.html i Child.html (nie trzeba iframe w Parent.html i dispatcher.html)

W Parent.html ustawić także nazwa-właściwości okna, np

<script> 
    window.name="parentTab"; 
</script> 

W Child.html teraz może otworzyć (TAB) parentTab -window

<script> 
    document.domain="mydomain.com"; 
    window.open('http://www.mydomain.com/parent.html','parentTab'); 
</script> 

... lub po prostu użyć "parentTarget" jako docelową-własność linku lub w postaci dziecka. html

0

Co zrobiłem dla siebie, wdrożyłem jakiś ajax, aby przesłać zmiany z okna2 do bazy danych. I implemeted JSON ciągnąć nowych danych z bazy z powrotem do Window1

0

widząc jak similar questions tylko mówić o window.open (których nie chcesz używać) i jako AFAIK nie ma łatwego sposobu na get all windows on the same domain, o co chcesz, to prawdopodobnie trzeba pisać swoje własne ramy to zrobić przy użyciu window.sessionStorage.
Nie sądzę, że uzyskasz dostęp do subdomen za jego pomocą, a zdecydowanie nie do innych domen.


Praktyczne pomysły na okna wiadomości specyficzne przechodząc używając sessionStorage ..
można przekazać rzeczy w adresie URL (GET), więc sposób, aby przekazać wiadomości może być rodzic, aby wygenerować unikalny identyfikator dla siebie parentID , unikalny identyfikator dla dziecka childID (który jest wstawiany pod adresem URL wraz z parentID w przypadku kliknięcia, jeśli używasz <a> lub ukrytego pola, jeśli nie masz nic przeciwko <form method="GET">), a następnie sessionStorage zapisuje wiadomości do rodzic używający kluczy takich jak parentID.childID.timeStamp, ma przedział czasu zarówno dla rodzica, jak i dla dziecka, który szuka sessionStoragek eys począwszy od identyfikatora okna, a następnie . (tj. rodzic szuka parentID.) na kopii meczu wartość klucza & do nowego var, delete (więc nie zostanie znaleziony ponownie), a następnie parsować zgodnie z potrzebami.

Wiem, że jest to nieco rozwlekłe, ale myślę, że jest to prawdopodobnie łatwiejsze do wyjaśnienia jako koncepcja niż pisanie przykładowego kodu.

Powiązane problemy