JavaScript otwiera się w nowym oknie, a nie na karcie

364

Mam pole wyboru, które wywołuje window.open(url)po wybraniu elementu. Firefox domyślnie otworzy stronę w nowej karcie. Chciałbym jednak, aby strona otworzyła się w nowym oknie, a nie w nowej karcie.

Jak mogę to osiągnąć?

Adam
źródło
3
patrz przykład na „ jsfiddle.net/HLbLu
Michael Freidgeim
Możesz użyć github.com/reduardo7/xpopup
Eduardo Cuomo

Odpowiedzi:

456

Nadaj oknu parametr „specs” o szerokości / wysokości. Zobacz tutaj wszystkie możliwe opcje.

window.open(url, windowName, "height=200,width=200");

Po określeniu szerokości / wysokości zostanie ona otwarta w nowym oknie zamiast karty.

DNS
źródło
5
Dobra wskazówka. Myślę, że Opera nadal otworzy to w zakładce :).
Kevin Tighe
7
Praca w IE6, FF 3.6, Chrome 9.0
James Westgate
3
Już nie działa w FF 11.0, patrz moje pytanie ! @James
TMS
14
Nie działa w dzisiejszych przeglądarkach. Domyślnie wszystkie otwierają nowe okna w nowej karcie bieżącego okna. To zależy również od opcji przeglądarki. Nie możesz kontrolować tego za pomocą JavaScript.
Pavel Hodek
3
To NIE jest fakt, że wpisujesz „wysokość = 200, szerokość = 200”, które otwierają się w nowym oknie. Jest to po prostu fakt wprowadzenia dodatkowego parametru (lokalizacja, status itp. ... to nie ma znaczenia)
Peter
110

Nie musisz używać wysokości, po prostu upewnij się, że używasz. _blankBez niej otwiera się w nowej karcie.

W przypadku pustego okna:

window.open('', '_blank', 'toolbar=0,location=0,menubar=0');

W przypadku konkretnego adresu URL:

window.open('http://www.google.com', '_blank', 'toolbar=0,location=0,menubar=0');
nwbrad
źródło
3
Ale co jeśli też chcę nadać jej nazwę?
Aditi,
Przynajmniej w Chrome location=0jest konieczne, gdy JS jest wywoływany z przycisku lub elementu kotwicy.
Ohad Schneider,
działało idealnie. musiał także podać lokalizację = 0 w firefoxie.
Rick James
@nwbrad jesteś pewien części „_blank”, ponieważ o ile wiem, „_blank” jest wartością domyślną, gdy nie określamy żadnej innej wartości. W twoim przypadku otwarcie nowego okna zamiast nowej karty musi coś zrobić z dostarczeniem trzeciego parametru do funkcji window.open. W twoim przypadku jest to „pasek narzędzi = 0, lokalizacja = 0, pasek menu = 0”. Możesz to zweryfikować, pomijając ten trzeci parametr i pozostawiając „_blank” jako drugi parametr.
user1451111,
Działa doskonale w nowoczesnych przeglądarkach, takich jak Firefox 76 i Internet Explorer 11. Wskazówka polega na dodawaniu location=0parametrów. Proponuję również nazwać okno zamiast używać _blankcelu, aby to samo okno zostało użyte ponownie, jeśli użytkownik kliknie kilkakrotnie element otwierający wyskakujące okno, i połączenie go w focus()taki sposób, aby już otwarte wyskakujące okno window.open('http://stackoverflow.com', 'Stack_Overflow','location=0').focus();
stało się aktywne
82

Mogę się mylić, ale z tego, co rozumiem, jest to kontrolowane przez preferencje przeglądarki użytkownika i nie sądzę, że można to zmienić.

Jordan S. Jones
źródło
1
Masz rację, użytkownik może ustawić preferencję „about: config” browser.tabs.opentabfor.windowopen ”na true, ale jest to ustawienie globalne i nie chcę zmieniać globalnego zachowania naszych przeglądarek użytkowników;)
adam
45
Mówiłem ci, że mam kod, który działa. Wpisałem to do konsoli Firebug: window.open ("", "poop", "height = 200, width = 200, modal = yes, alwaysRaised = yes"); i zgadnij co??? to działa!!!!!!
24
Tak, to działa, ale wydaje się to trochę hack. Firefox jest napisany w taki sposób, że otwarcie nowego okna vs zakładka jest preferencją przeglądarki, a nie preferencją javascript. Dlatego możliwe jest, że twoja sugestia nie zadziała tak samo w późniejszej wersji Firefoksa. Wolałbym nie polegać na hacku.
adam
2
Mówiąc wprost, nie mam na myśli hakowania w javascript. Dodawanie wysokości i szerokości okna jest wyraźnie cechą metody js window.open ( w3schools.com/HTMLDOM/met_win_open.asp ) Mam na myśli hack w sensie manipulowania zamierzonym zachowaniem firefoxa.
adam
2
Tak naprawdę nie nazwałbym tego hackem. Po prostu narażasz się na zachowanie, które naprawdę chciałbyś mieć, i zamiast tego wdrażasz to.
Matchu,
15

Próbować:

window.open("", [window name], "height=XXX,width=XXX,modal=yes,alwaysRaised=yes");

Mam kod, który robi to, co mówisz, ale zawiera wiele parametrów. Myślę, że są to absolutne minimum, daj mi znać, jeśli to nie zadziała, opublikuję resztę.

arulmr
źródło
Działa to w FF 31 i Chrome 36 przy użyciu tylko opcji „modal = yes”. Wszystkie określone opcje również działają. Mam również opcję „Otwórz nowe okna w nowych kartach” w moich preferencjach FF. Bez otwartych opcji okna otwierają się w nowej karcie.
Clint Pachl
Po dalszych testach wydaje się, że prawie wszystkie parametry ―, o ile jest co najmniej jeden ―, otworzy nowe okno zamiast zakładki. Na przykład po prostu „top = 0” działa nawet w FF 31 i Chrome 36. To jest na OpenBSD przy użyciu menedżera okien cwm. Więc wyniki mogą się różnić.
Clint Pachl
Czy mogę wiedzieć, co to jest [nazwa okna]?
szt.
10

OK, po wykonaniu wielu testów, oto mój wniosek:

Kiedy wykonujesz:

     window.open('www.yourdomain.tld','_blank');
     window.open('www.yourdomain.tld','myWindow');

lub cokolwiek wstawisz w polu docelowym, nic to nie zmieni: nowa strona zostanie otwarta w nowej karcie (więc zależy od preferencji użytkownika)

Jeśli chcesz, aby strona była otwierana w nowym „prawdziwym” oknie, musisz wprowadzić dodatkowy parametr. Lubić:

window.open('www.yourdomain.tld', 'mywindow','location=1,status=1,scrollbars=1, resizable=1, directories=1, toolbar=1, titlebar=1');

Po przetestowaniu wydaje się, że używasz dodatkowego parametru, to nie ma znaczenia: to nie jest fakt, że wstawiasz „ten parametr” lub „ten inny”, które tworzą nowe „prawdziwe okno”, ale fakt, że są nowe parametry (s ).

Ale coś jest zdezorientowane i może wyjaśniać wiele błędnych odpowiedzi:

To:

 win1 = window.open('myurl1', 'ID_WIN');
 win2 = window.open('myurl2', 'ID_WIN', 'location=1,status=1,scrollbars=1');

I to:

 win2 = window.open('myurl2', 'ID_WIN', 'location=1,status=1,scrollbars=1');
 win1 = window.open('myurl1', 'ID_WIN');

NIE da tego samego rezultatu.

W pierwszym przypadku, gdy otworzysz stronę bez dodatkowego parametru, otworzy się w nowej karcie . W tym przypadku drugie połączenie zostanie otwarte również w tej zakładce z powodu podanej nazwy.

W drugim przypadku, gdy pierwsze połączenie zostanie wykonane z dodatkowym parametrem, strona zostanie otwarta w nowym „ prawdziwym oknie ”. W takim przypadku, nawet jeśli drugie wywołanie zostanie wykonane bez dodatkowego parametru, zostanie również otwarte w tym nowym „ prawdziwym oknie ” ... ale w tej samej zakładce!

Oznacza to, że pierwsze połączenie jest ważne, ponieważ decyduje, gdzie umieścić stronę.

Piotr
źródło
Ta odpowiedź powinna zawierać wiele ++++
Mitch VanDuyn
9

Nie powinieneś. Pozwól użytkownikowi mieć dowolne preferencje.

Firefox robi to domyślnie, ponieważ otwieranie strony w nowym oknie jest denerwujące i nigdy nie powinno się na to zezwalać, jeśli nie jest to pożądane przez użytkownika. (Firefox pozwala otwierać karty w nowym oknie, jeśli ustawisz to w ten sposób).

CookieOfFortune
źródło
31
jesteś w wielkim błędzie. a przy okazji, powiedzenie „nie powinieneś” nie jest właściwe, szczególnie jeśli jest to coś, czego szef chce
8
Spróbujmy, aby komentarze były praktyczne i pomocne. Możemy się nie zgodzić, nie obrażając.
adam
17
@theman_on_vista: Przekonanie szefa jest twoim obowiązkiem. Twoja firma nałożyła na ciebie odpowiedzialność za rozwiązywanie problemów projektowych. Obejmuje to wskazywanie niewłaściwych pomysłów projektowych.
EFraim
2
Tak prawdziwe. Ekran należy do użytkownika i nikogo innego.
Christopher Creutzig
12
Wybór projektora lub zakładki należy do króla projektanta. Chociaż jestem użytkownikiem, który zawsze woli karty, zdaję sobie sprawę, że czasami projekt naprawdę wymaga wyskakującego okienka lub naprawdę karty. Powinno to być w sferze programisty, aby było to możliwe. Odkładając na bok różnice filozoficzne, ten rodzaj komentarza jest całkowicie nieodpowiedni dla strony z programowaniem. I w tym przypadku nie jest to „powinienem?” pytanie. To jest „jak mam?”
jbenet,
9

Możesz wypróbować następującą funkcję:

<script type="text/javascript">
function open(url)
{
  var popup = window.open(url, "_blank", "width=200, height=200") ;
  popup.location = URL;
}
</script>

Kod HTML do wykonania:

<a href="#" onclick="open('http://www.google.com')">google search</a>
jgray
źródło
2
Jaki jest cel tego popup.location = URL;? window.open()Połączenie powinno otworzyć go do odpowiedniego adresu URL, a w przykładzie kodu, URLnie jest określona tak, że będzie spadać z powrotem do experimental (i nie są powszechnie support) URL obiektu . Chociaż korzystanie z niego do tego jest dyskusyjne, jestem ciekawy, jakie są motywacje do jego wykorzystania tutaj?
Ken
Solidna odpowiedź i nauczyła mnie, jak zrobić lokalizację, której nie można edytować. dzięki
VirtualProdigy
6

Kluczem są parametry:

Jeśli podasz Parametry [Wysokość = "", Szerokość = ""], to otworzy się w nowych oknach.

Jeśli NIE podasz parametrów, otworzy się w nowej karcie.

Testowane w Chrome i Firefox

MuniR
źródło
1
newwin = window.open ('test.aspx', '', ''); testowane w Chrome: 26
MuniR
5

Co ciekawe, odkryłem, że jeśli podasz pusty ciąg (w przeciwieństwie do ciągu zerowego lub listy właściwości) dla trzeciego atrybutu window.open, otworzy się w nowej karcie dla Chrome, Firefox i IE. Jeśli nie było, zachowanie było inne.

Oto moje nowe wezwanie:

 window.open(url, windowName, '');
Tom Lianza
źródło
Czy jednak oryginalny plakat nie próbuje otwierać wyskakujących okienek w nowym oknie? Ponadto w IE 11 podany fragment kodu otworzy nowe okno lub kartę na podstawie preferencji przeglądarki użytkownika.
4

wypróbuj tę metodę .....

function popitup(url) {
       //alert(url);
       newwindow=window.open("http://www.zeeshanakhter.com","_blank","toolbar=yes,scrollbars=yes, resizable=yes, top=500, left=500, width=400, height=400");
       newwindow.moveTo(350,150);
   if (window.focus) 
          {
             newwindow.focus()
          }
   return false;
  }
Zeeshan Akhter
źródło
3

Dla mnie rozwiązaniem było mieć

"location=0"

w 3. parametrze. Testowany na najnowszym FF / Chrome i starej wersji IE11

Pełne wywołanie metody, którego używam, jest poniżej (ponieważ lubię używać zmiennej szerokości):

window.open(url, "window" + id, 'toolbar=0,location=0,scrollbars=1,statusbar=1,menubar=0,resizable=1,width=' + width + ',height=800,left=100,top=50');
DAustin
źródło
2

Właśnie próbowałem tego z IE (11) i Chrome (54.0.2794.1 kanarek SyzyASan):

window.open(url, "_blank", "x=y")

... i otworzyło się w nowym oknie.

Co oznacza, że Clint pachl miał rację, gdy powiedział, że podanie jednego parametru spowoduje otwarcie nowego okna.

- i najwyraźniej nie musi to być uzasadniony parametr!

(YMMV - jak powiedziałem, przetestowałem go tylko w dwóch miejscach ... a kolejna aktualizacja może w jakikolwiek sposób unieważnić wyniki)

ETA: Właśnie zauważyłem - w IE okno nie ma dekoracji.

theGleep
źródło
1

Odpowiedziałem tutaj . Ale opublikowanie go ponownie w celach informacyjnych.

window.open()nie otworzy się w nowej karcie, jeśli nie dzieje się to podczas rzeczywistego zdarzenia kliknięcia. W podanym przykładzie adres URL jest otwierany podczas faktycznego zdarzenia kliknięcia. Działa to pod warunkiem, że użytkownik ma odpowiednie ustawienia w przeglądarce.

<a class="link">Link</a>
<script  type="text/javascript">
     $("a.link").on("click",function(){
         window.open('www.yourdomain.com','_blank');
     });
</script>

Podobnie, jeśli próbujesz wykonać wywołanie ajax w ramach funkcji kliknięcia i chcesz otworzyć okno sukcesu, upewnij się, że wykonujesz wywołanie ajax z async : falsezestawem opcji.

Venkat Kotra
źródło
1

Myślę, że nie jest to problem z właściwościami docelowymi HTML, ale odznaczono opcję „otwórz nowe okna nw w nowej karcie zamiast” opcję w zakładce „karta” w menu „Opcje” Firefoksa. sprawdź i spróbuj ponownie.

wprowadź opis zdjęcia tutaj

shihab mm
źródło
0

Miałem to samo pytanie, ale znalazłem stosunkowo proste rozwiązanie.

W JavaScript sprawdzałem, window.opener !=null;czy okno jest wyskakujące. Jeśli używasz podobnego kodu wykrywającego w celu ustalenia, czy okno, w którym wyświetlana jest witryna, jest wyskakujące, możesz łatwo „wyłączyć”, gdy chcesz otworzyć „nowe” okno za pomocą nowego JavaScript JavaScript.

Wystarczy umieścić to u góry strony, aby zawsze było „nowym” oknem.

<script type="text/javascript">
    window.opener=null;
</script>

Używam tego na stronie logowania w mojej witrynie, aby użytkownicy nie otrzymywali wyskakujących okienek, jeśli używają wyskakującego okienka do nawigacji do mojej witryny.

Możesz nawet utworzyć prostą stronę przekierowującą, która to zrobi, a następnie przejdzie do podanego adresu URL. Coś jak,

JavaScript na stronie nadrzędnej:

window.open("MyRedirect.html?URL="+URL, "_blank");

A następnie za pomocą trochę javascript z tutaj można uzyskać adres URL i przekierowanie do niego.

JavaScript na stronie przekierowania:

 <script type="text/javascript">
        window.opener=null;

    function getSearchParameters() {
          var prmstr = window.location.search.substr(1);
          return prmstr != null && prmstr != "" ? transformToAssocArray(prmstr) : {};
    }

    function transformToAssocArray( prmstr ) {
        var params = {};
        var prmarr = prmstr.split("&");
        for ( var i = 0; i < prmarr.length; i++) {
            var tmparr = prmarr[i].split("=");
            params[tmparr[0]] = tmparr[1];
        }
        return params;
    }

    var params = getSearchParameters();
    window.location = params.URL;
    </script>
Dan
źródło