2013-05-25 23 views
8

Mam mały fragment javascript przeznaczony do otwierania dwóch lub więcej kart. Działa to dobrze w FF i IE, ale chrome otwiera drugi w nowym oknie zamiast na karcie. Nie jest zależny od adresu URL, ponieważ próbowałem go z dwoma identycznymi adresami URL. Najpierw otwiera się w zakładce, druga w nowym oknie.zachowanie window.open w chrome tabs/windows

Oto mój fragment kodu:

for(var i=0 ; i<sites.length ;i++) 
{ 
    window.open(sites[i].Url); 
} 
+0

Czy możesz być bardziej czysty? Nie rozumiem Twojego pytania. –

+0

@LightStyle Jego kod otwiera nowe okna zamiast nowych kart w Chrome. – Juampi

+0

Po prostu łatwiej zrozumieć, oto strona testowa: http://www.bosmaadvies.com/chrometest.html – user1151653

Odpowiedz

11

Chrome automatycznie otwiera URL w nowej karcie tylko wtedy, gdy jest to użytkownik generowane działania, ograniczony do jednej karcie na działania użytkownika. W każdym innym przypadku adres URL zostanie otwarty w nowym oknie (które BTW jest domyślnie blokowane w Chrome).
window.open musi być wywoływana w wywołania zwrotnego, który jest wyzwalane przez działania użytkownika (na przykład onclick) dla strony, aby otworzyć w nowej karcie, a nie w oknie.

W tym przykładzie próbujesz otworzyć karty N po akcji użytkownika. Ale tylko pierwsza jest otwierana w nowej karcie (ponieważ jest to działanie wygenerowane przez użytkownika). Następnie każdy inny adres URL zostanie otwarty w nowym oknie.

Podobne pytanie: force window.open() to create new tab in chrome (patrz odpowiedź przez maclema)

+1

Dzięki, bałem się, że to będzie coś takiego . Złożyłem raport na temat google jako błędu, ponieważ uważam, że funkcja powinna zachowywać się spójnie i nie zmieniać zachowania przy drugim jej wywołaniu. Poza tym inne przeglądarki po prostu otwierają zakładki. – user1151653

+1

Wierzę, że jest to zgodne z projektem, ponieważ nowe okna mają mechanizm blokowy, a nowe karty nie. Ta sama historia, co w przypadku alertów. Jeśli masz kilka kolejnych alertów (w tym samym zakresie/kontekście) - pierwsza z nich będzie wyświetlana normalnie, a wszystkie następujące alerty będą miały pole wyboru "zapobiegaj dalszym dialogom". –

+1

Rozumiem rozważania, ale, szczerze mówiąc, myślę, że to głupi pomysł, jeśli prowadzi do nieoczekiwanego zachowania. Chciałbym wiedzieć, co wywołuje funkcja, a jeśli jedno wywołanie window.open prowadzi do zupełnie innych wyników z innego połączenia, projekt jest błędny. Poza tym zarówno FF, jak i IE mają blokery wyskakujące i implementują je poprawnie. – user1151653

0

natknąłem to pytanie What is the (function() { })() construct in JavaScript? co daje wyjaśnienie na Iife. Myślę, że można z tego skorzystać. Proszę o cierpliwość Nie mam głębokiej wiedzy o javascript. Ale próbowałem jak poniżej i działa.

var sites = [{"url" : "http://www.google.com"} , {"url" : "http://www.yahoo.com"} , {"url" : "http://www.msn.com"}]; 
console.log(sites); 
for(var i=0 ; i < sites.length ;i++) { 
    (function(i) { 
     console.log(i); 
     window.open(sites[i].url , "_blank"); 
    })(i); 
} 

Otwiera adres URL w nowych zakładkach w chrome.