JavaScript si apre in una nuova finestra, non in una scheda


364

Ho una casella di selezione che chiama window.open(url)quando viene selezionato un elemento. Firefox aprirà la pagina in una nuova scheda per impostazione predefinita. Tuttavia, vorrei che la pagina si aprisse in una nuova finestra, non in una nuova scheda.

Come posso farlo?




Risposte:


456

Dai alla finestra un parametro 'specs' con larghezza / altezza. Vedi qui per tutte le possibili opzioni.

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

Quando specifichi una larghezza / altezza, la aprirà in una nuova finestra anziché in una scheda.


5
Buona dritta. Penso che Opera lo aprirà comunque in una scheda però :).
Kevin Tighe,

7
Funziona in IE6, FF 3.6, Chrome 9.0
James Westgate il

3
Non funziona più in FF 11.0, vedi la mia domanda ! @James
TMS

14
Non funziona nei browser di oggi. Per impostazione predefinita, tutti aprono una nuova finestra in una nuova scheda della finestra corrente. Dipende anche dalle opzioni del browser. Non puoi controllarlo utilizzando JavaScript.
Pavel Hodek,

3
Questo NON è il fatto che hai messo "height = 200, width = 200" che esegue l'apertura in una nuova finestra. Questo è semplicemente il fatto di mettere un parametro extra (posizione, stato ecc .... non importa)
Peter

110

Non è necessario utilizzare l'altezza, ma assicurati di utilizzare _blank, senza di essa, si apre in una nuova scheda.

Per una finestra vuota:

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

Per un URL specifico:

window.open('http://www.google.com', '_blank', 'toolbar=0,location=0,menubar=0');

3
E se volessi dargli anche un nome?
Aditi,

Almeno in Chrome, location=0è necessario quando JS viene richiamato da un pulsante o elemento di ancoraggio.
Ohad Schneider,

ha funzionato perfettamente. ha dovuto includere anche location = 0 in firefox.
Rick James,

@nwbrad sei sicuro della parte '_blank' perché per quanto ne so '_blank' è il valore predefinito quando non specifichiamo nessun altro valore. Nel tuo caso, l'apertura di una nuova finestra anziché di una nuova scheda ha a che fare con la fornitura del terzo parametro alla funzione window.open. Nel tuo caso è 'barra degli strumenti = 0, posizione = 0, barra dei menu = 0'. Puoi verificarlo omettendo questo terzo parametro e lasciando '_blank' lì come secondo parametro.
user1451111

Funziona perfettamente con i browser moderni come Firefox 76 e Internet Explorer 11. Il suggerimento sta aggiungendo location=0i parametri. Vorrei anche suggerire di nominare la finestra invece di utilizzare la _blankdestinazione, in modo che la stessa finestra venga utilizzata di nuovo se l'utente fa clic più volte sull'elemento che apre il popup e concatenarsi in focus()modo che già un popup aperto ottenga lo stato window.open('http://stackoverflow.com', 'Stack_Overflow','location=0').focus();
attivo

82

Potrei sbagliarmi, ma da quello che ho capito, questo è controllato dalle preferenze del browser dell'utente e non credo che questo possa essere ignorato.


1
Hai ragione, l'utente può impostare la preferenza "about: config" "browser.tabs.opentabfor.windowopen" su true, ma questa è un'impostazione globale e non voglio cambiare il comportamento globale dei browser dei nostri utenti;)
Adamo

45
Ti ho detto che ho un codice che funziona. Ho digitato questo nella console firebug: window.open ("", "poop", "height = 200, width = 200, modal = yes, alwaysRaised = yes"); e indovina cosa??? Funziona!!!!!!

24
Sì, funziona, ma questo sembra essere un po 'un trucco. Firefox è scritto in modo tale che l'apertura di una nuova finestra rispetto alla scheda sia una preferenza del browser, non una preferenza javascript. Pertanto è possibile che il tuo suggerimento non funzionerà allo stesso modo in una versione successiva di Firefox. Preferirei non fare affidamento su un hack.
Adamo,

2
E per essere chiari, non intendo dire che è un hack javascript. L'aggiunta di altezza e larghezza della finestra sono chiaramente caratteristiche del metodo js window.open ( w3schools.com/HTMLDOM/met_win_open.asp ) Intendo hack nel senso di manipolare il comportamento previsto di Firefox.
Adamo,

2
Non lo definirei davvero un hack, di per sé. Stai solo scendendo a compromessi su quale comportamento ti piacerebbe effettivamente avere e implementandolo, invece.
Matchu,

15

Provare:

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

Ho del codice che fa quello che dici, ma ci sono molti parametri. Penso che questi siano il minimo indispensabile, fammi sapere se non funziona, posterò il resto.


Funziona con FF 31 e Chrome 36 usando solo l'opzione "modal = yes". Anche tutte le opzioni specificate funzionano. Ho anche selezionato "Apri nuove finestre in nuove schede" nelle mie preferenze FF. Senza opzioni aperte, le finestre si aprono in una nuova scheda.
Clint Pachl,

Dopo alcuni altri test, sembra che quasi tutti i parametri long fintanto che ce n'è almeno uno open apriranno una nuova finestra anziché una scheda. Ad esempio, solo "top = 0" funziona anche in FF 31 e Chrome 36. Questo è su OpenBSD usando il gestore di finestre cwm. Quindi i risultati possono variare.
Clint Pachl,

Posso sapere che cos'è [nome finestra]?
pezzi

10

OK, dopo aver fatto molti test, ecco la mia conclusione:

Quando ti esibisci:

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

o qualunque cosa tu inserisca nel campo di destinazione, questo non cambierà nulla: la nuova pagina verrà aperta in una nuova scheda (quindi dipende dalle preferenze dell'utente)

Se si desidera aprire la pagina in una nuova finestra "reale", è necessario inserire un parametro aggiuntivo. Piace:

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

Dopo il test, sembra il parametro extra che usi, non importa davvero: questo non è il fatto che hai messo "questo parametro" o "quest'altro" che crea la nuova "finestra reale" ma il fatto che ci sono nuovi parametri ).

Ma qualcosa è confuso e può spiegare molte risposte sbagliate:

Questo:

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

E questo:

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

NON darà lo stesso risultato.

Nel primo caso, quando si apre per la prima volta una pagina senza parametro aggiuntivo, si aprirà in una nuova scheda . E in questo caso, anche la seconda chiamata verrà aperta in questa scheda a causa del nome assegnato.

Nel secondo caso, poiché la prima chiamata viene effettuata con un parametro aggiuntivo, la pagina verrà aperta in una nuova " finestra reale ". E in tal caso, anche se la seconda chiamata viene effettuata senza il parametro aggiuntivo, verrà aperta anche in questa nuova " finestra reale " ... ma stessa scheda!

Ciò significa che la prima chiamata è importante in quanto ha deciso dove posizionare la pagina.


Questa risposta dovrebbe avere un sacco di ++++
Mitch VanDuyn

9

Non dovresti averne bisogno. Consenti all'utente di avere qualsiasi preferenza desideri.

Firefox lo fa di default perché l'apertura di una pagina in una nuova finestra è fastidiosa e una pagina non dovrebbe mai essere autorizzata a farlo se non è quello che desidera l'utente. (Firefox ti consente di aprire le schede in una nuova finestra se lo imposti in questo modo).


31
hai torto così tanto. e a proposito, dire "non dovresti" non è appropriato, specialmente se è qualcosa che il capo vuole

8
Proviamo a mantenere i commenti pratici e utili. Siamo in disaccordo senza essere offensivi.
Adamo,

17
@theman_on_vista: convincere il tuo capo è una tua responsabilità. La tua azienda ti ha conferito la responsabilità di risolvere i problemi di progettazione. Ciò include evidenziare idee di design sbagliate.
EFraim,

2
Così vero. Lo schermo appartiene all'utente e nessun altro.
Christopher Creutzig,

12
È nel regno del designer scegliere popup o tab. Mentre sono un utente che preferisce sempre le schede, riconosco che a volte, il design richiede davvero un popup o richiede davvero una scheda. Dovrebbe essere nel regno del programmatore per renderlo possibile. Mettendo da parte le differenze filosofiche, questo tipo di commento è del tutto inappropriato per un sito di riferimento di programmazione. E in questo caso, non è un "dovrei?" domanda. È "come faccio?"
jbenet,

9

Potresti provare la seguente funzione:

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

Il codice HTML per l'esecuzione:

<a href="#" onclick="open('http://www.google.com')">google search</a>

2
Qual è lo scopo di popup.location = URL;? La window.open()chiamata dovrebbe aprirlo all'URL corretto e, nel tuo esempio di codice, URLnon è definito, quindi tornerà all'oggetto URL sperimentale (e non ampiamente supportato) . Mentre lo uso per questo è discutibile, sono curioso di sapere quali sono le motivazioni per il suo utilizzo qui?
Ken,

Risposta solida e mi ha insegnato come rendere la posizione non modificabile. grazie
VirtualProdigy il

6

La chiave è i parametri:

Se fornite parametri [Altezza = "", Larghezza = ""], si aprirà in nuove finestre.

Se NON fornisci parametri, si aprirà in una nuova scheda.

Testato su Chrome e Firefox


1
newwin = window.open ('test.aspx', '', ''); testato in Chrome: 26
MuniR

5

È interessante notare che ho scoperto che se si passa una stringa vuota (anziché una stringa nulla o un elenco di proprietà) per il terzo attributo di window.open, si aprirà in una nuova scheda per Chrome, Firefox e IE. Se assente, il comportamento era diverso.

Quindi, questa è la mia nuova chiamata:

 window.open(url, windowName, '');

Il poster originale non sta cercando di aprire i popup in una nuova finestra? Inoltre, in IE 11, lo snippet di codice fornito aprirà una nuova finestra o scheda in base alle preferenze del browser dell'utente.

4

prova quel metodo .....

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;
  }

3

Per me la soluzione era quella di avere

"location=0"

nel 3o parametro. Testato sull'ultima versione di FF / Chrome e su una versione precedente di IE11

La chiamata di metodo completa che utilizzo è di seguito (poiché mi piace utilizzare una larghezza variabile):

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');

2

Ho appena provato questo con IE (11) e Chrome (54.0.2794.1 canarino SyzyASan):

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

... e si aprì in una nuova finestra.

Ciò significa che Clint Pachl aveva ragione quando ha detto che fornire un parametro qualsiasi farà aprire la nuova finestra.

- e apparentemente non deve essere un parametro legittimo!

(YMMV - come ho detto, l'ho testato solo in due punti ... e il prossimo aggiornamento potrebbe invalidare i risultati, in ogni caso)

ETA: Ho appena notato, però - in IE, la finestra non ha decorazioni.


1

Risposto qui . Ma pubblicandolo di nuovo per riferimento.

window.open()non si aprirà in una nuova scheda se non sta accadendo nell'evento di clic effettivo. Nell'esempio dato, l'URL viene aperto sull'evento click effettivo. Questo funzionerà a condizione che l'utente abbia le impostazioni appropriate nel browser.

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

Allo stesso modo, se si sta tentando di effettuare una chiamata Ajax all'interno della funzione clic e si desidera aprire una finestra in caso di successo, assicurarsi di eseguire la chiamata Ajax con l' async : falseopzione impostata.


1

Penso che non sia un problema di proprietà di destinazione html ma hai deselezionato l'opzione "apri finestre nw in una nuova scheda" invece "opzione nella scheda" scheda "nel menu" opzioni "di firefox. controllalo e riprova.

inserisci qui la descrizione dell'immagine


0

Ho avuto la stessa domanda ma ho trovato una soluzione relativamente semplice.

In JavaScript stavo verificando window.opener !=null;se la finestra fosse pop-up. Se si utilizza un codice di rilevamento simile per determinare se la finestra in cui si sta visualizzando il sito è un pop-up, è possibile "disattivarlo" facilmente quando si desidera aprire una "nuova" finestra utilizzando il nuovo JavaScript di Windows.

Metti questo nella parte superiore della tua pagina e vuoi essere sempre una "nuova" finestra.

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

Lo uso nella pagina di accesso del mio sito in modo che gli utenti non ottengano comportamenti a comparsa se utilizzano una finestra a comparsa per accedere al mio sito.

Potresti persino creare una semplice pagina di reindirizzamento che lo fa e quindi passa all'URL che gli hai fornito. Qualcosa di simile a,

JavaScript nella pagina principale:

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

E poi usando un po 'di javascript da qui puoi ottenere l'URL e reindirizzare ad esso.

JavaScript nella pagina di reindirizzamento:

 <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>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.