2013-08-08 24 views
7

jestem otwierając okienko z mojej strony głównej z kodem tak:Jak odłączyć popup JavaScript z otwieraczem

<a href="http://external.domain.tld/" 
    onclick="window.open(this.href, '_blank', 
     'width=512,height=512,left=200,top=100');return false"> 
Open popup 
</a> 

Działa to dobrze, ale moim problemem jest to, że dokument, który jest ładowany w oknie popup ma pozwolenie na zmianę lokalizacji okna otwieracza. Działa to nawet wtedy, gdy dokument w wyskakującym okienku pochodzi z innej domeny. Nie ma uprawnień do odczytu lokalizacji, ale może zmienić lokalizację. Nie chcę tego. Chcę, aby popup był całkowicie odłączony od mojej strony głównej.

Nawet bez JavaScript nie działa. Kiedy otwieram drugą stronę w nowej karcie przy użyciu atrybutu target="_blank" wtedy karta jest nadal dozwolone, aby przejść do okna opener i zmienić jego lokalizację:

<a href="http://external.domain.tld/" target="_blank"> 
    Open in new tab 
</a> 

Jest to kod w otwartym dokumencie, który nie powinien wolno:

<script> 
    opener.location.href = "http://badsite.tld/"; 
</script> 

można zobaczyć na żywo pokaz here. Kliknij jedno z dwóch linków, aby otworzyć inną stronę w wyskakującym okienku lub nowej karcie, która następnie wczytuje trzecią stronę w oknie otwieracza. Właśnie tego staram się zapobiec.

Czy jest jakaś sztuczka, której mogę użyć do przerwania połączenia między oknem otwieracza a otwartym oknem? Idealnie otwarte okno nie powinno wiedzieć, że zostało otwarte w ogóle przez inne okno.

+0

Jesteś pewny nie masz żadnych ustawień w tych domenach. Jedna to poddomena drugiej, a dzięki określonym ustawieniom masz dostęp do innej domeny. – putvande

+0

@putvande Tak, jestem pewien. Wersja demonstracyjna używa różnych subdomen (ponieważ mam tylko dostęp do jednej domeny). Ale prawdziwy problem na serwerze produkcyjnym wykorzystuje zupełnie inne domeny i nigdzie nie ma żadnych specjalnych zasad. Otwarte okno nie ma uprawnień do odczytu lub wywoływania czegokolwiek z okna otwieracza, więc te same ograniczenia pochodzenia działają poprawnie. Po prostu nie mają zastosowania do ZMIENIENIA href lokalizacji okna otwieracza. – kayahr

Odpowiedz

14

Jeśli strona w oknie dziecko jest w twojej kontroli, można przypisać wartość null do otwieracza na stronie dziecka:

window.opener = null; 

Poprzez to jako pierwsze pismo w JavaScript.

Jeśli strona nie jest w kontroli lub znajduje się w innej domenie, a następnie zrobić to podczas otwierania:

popup = window.open(this.href, '_blank', 'width=512,height=512,left=200,top=100'); 
popup.opener = null; 
+0

Niestety to nie jest pod moją kontrolą.Próbowałem nawet najpierw otworzyć stronę pośrednią, która ustawia 'window.opener' na' null', a następnie ładuje drugą stronę. Nie działa, 'window.opener' jest przywracane przez przeglądarkę po załadowaniu nowej strony. – kayahr

+0

@kayahr Odpowiedź zaktualizowana. To powinno działać. – Abhitalks

+1

Prosty i elegancki. Działa świetnie. Dzięki! – kayahr