JavaScript s'ouvre dans une nouvelle fenêtre, pas dans un onglet

364

J'ai une boîte de sélection qui appelle window.open(url)lorsqu'un élément est sélectionné. Firefox ouvrira la page dans un nouvel onglet par défaut. Cependant, je voudrais que la page s'ouvre dans une nouvelle fenêtre, pas un nouvel onglet.

Comment puis-je accomplir cela?

Adam
la source
3
voir l'exemple sur " jsfiddle.net/HLbLu
Michael Freidgeim
Vous pouvez utiliser github.com/reduardo7/xpopup
Eduardo Cuomo

Réponses:

456

Donnez à la fenêtre un paramètre «spécifications» avec largeur / hauteur. Voir ici pour toutes les options possibles.

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

Lorsque vous spécifiez une largeur / hauteur, il l'ouvrira dans une nouvelle fenêtre au lieu d'un onglet.

DNS
la source
5
Bon conseil. Je pense que Opera ouvrira toujours cela dans un onglet :).
Kevin Tighe
7
Travailler dans IE6, FF 3.6, Chrome 9.0
James Westgate
3
Ne fonctionne plus dans FF 11.0, voir ma question ! @James
TMS
14
Ne fonctionne pas dans les navigateurs actuels. Par défaut, ils ouvrent tous une nouvelle fenêtre dans un nouvel onglet de la fenêtre actuelle. Cela dépend également des options du navigateur. Vous ne pouvez pas le contrôler en utilisant JavaScript.
Pavel Hodek
3
Ce n'est PAS le fait que vous mettez "hauteur = 200, largeur = 200" qui effectuent l'ouverture dans une nouvelle fenêtre. C'est tout simplement le fait de mettre des paramètres supplémentaires (emplacement, statut etc .... ça n'a pas d'importance)
Peter
110

Vous n'avez pas besoin d'utiliser la hauteur, assurez-vous simplement que vous l'utilisez _blank, sans elle, elle s'ouvre dans un nouvel onglet.

Pour une fenêtre vide:

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

Pour une URL spécifique:

window.open('http://www.google.com', '_blank', 'toolbar=0,location=0,menubar=0');
nwbrad
la source
3
Mais que se passe-t-il si je veux lui donner un nom également?
Aditi
Au moins dans Chrome, location=0est nécessaire lorsque le JS est appelé à partir d'un bouton ou d'un élément d'ancrage.
Ohad Schneider
a parfaitement fonctionné. devait également inclure location = 0 dans Firefox.
Rick james
@nwbrad êtes-vous sûr de la partie '_blank' car pour autant que je sache, '_blank' est la valeur par défaut lorsque nous ne spécifions aucune autre valeur. Dans votre cas, ouvrir une nouvelle fenêtre au lieu d'un nouvel onglet doit faire quelque chose en fournissant le 3e paramètre à la fonction window.open. Dans votre cas, il s'agit de "barre d'outils = 0, emplacement = 0, barre de menus = 0". Vous pouvez le vérifier en omettant ce troisième paramètre et en y laissant «_blank» comme 2e paramètre.
user1451111
Fonctionne parfaitement dans les navigateurs modernes comme Firefox 76 et Internet Explorer 11. L'astuce ajoute location=0des paramètres. Je suggérerais également de nommer la fenêtre au lieu d'utiliser à l'aide de la _blankcible, de sorte que la même fenêtre soit utilisée à nouveau si l'utilisateur clique plusieurs fois sur l'élément qui ouvre la fenêtre contextuelle, et de l'enchaîner avec de focus()telle sorte que déjà une fenêtre contextuelle ouverte soit mise en window.open('http://stackoverflow.com', 'Stack_Overflow','location=0').focus();
évidence
82

Je peux me tromper, mais d'après ce que je comprends, cela est contrôlé par les préférences du navigateur de l'utilisateur, et je ne pense pas que cela puisse être annulé.

Jordan S. Jones
la source
1
Vous avez raison, l'utilisateur peut définir la valeur "about: config" préférence "browser.tabs.opentabfor.windowopen" sur true, mais il s'agit d'un paramètre global et je ne souhaite pas modifier le comportement global des navigateurs de nos utilisateurs;)
Adam
45
Je vous ai dit que j'avais un code qui fonctionnait. J'ai tapé ceci dans la console Firebug: window.open ("", "merde", "hauteur = 200, largeur = 200, modal = oui, alwaysRaised = oui"); et devine quoi??? Ça marche!!!!!!
24
Oui, cela fonctionne, mais cela semble être un peu un hack. Firefox est écrit de telle manière que l'ouverture d'une nouvelle fenêtre vs onglet soit une préférence de navigateur, pas une préférence javascript. Par conséquent, il est possible que votre suggestion ne fonctionne pas de la même manière dans une version ultérieure de Firefox. Je préfère ne pas compter sur un hack.
Adam le
2
Et pour être clair, je ne veux pas dire que c'est un hack javascript. L'ajout de la hauteur et de la largeur de la fenêtre est clairement une caractéristique de la méthode js window.open ( w3schools.com/HTMLDOM/met_win_open.asp ). Je veux dire pirater dans le sens de manipuler le comportement prévu de firefox.
Adam le
2
Je ne dirais pas vraiment que c'est un hack, en soi. Vous ne faites que faire des compromis sur le comportement que vous aimeriez réellement avoir et vous l'implémentez à la place.
Matchu
15

Essayer:

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

J'ai du code qui fait ce que vous dites, mais il contient beaucoup de paramètres. Je pense que ce sont le strict minimum, faites-moi savoir si cela ne fonctionne pas, je posterai le reste.

arulmr
la source
Cela fonctionne dans FF 31 et Chrome 36 en utilisant uniquement l'option "modal = yes". Toutes les options spécifiées fonctionnent également. J'ai également "Ouvrir de nouvelles fenêtres dans de nouveaux onglets" dans mes préférences FF. Sans options ouvertes, les fenêtres s'ouvrent dans un nouvel onglet.
Clint Pachl
Après quelques tests supplémentaires, il semble que presque tous les paramètres - tant qu'il y en a au moins un - ouvriront une nouvelle fenêtre au lieu d'un onglet. Par exemple, "top = 0" fonctionne même dans FF 31 et Chrome 36. C'est sur OpenBSD en utilisant le gestionnaire de fenêtres cwm. Les résultats peuvent donc varier.
Clint Pachl
Puis-je savoir ce qu'est [nom de la fenêtre]?
pcs
10

OK, après avoir fait beaucoup de test, voici ma conclusion:

Lorsque vous effectuez:

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

ou quoi que vous mettiez dans le champ de destination, cela ne changera rien: la nouvelle page sera ouverte dans un nouvel onglet (dépend donc des préférences de l'utilisateur)

Si vous voulez que la page soit ouverte dans une nouvelle "vraie" fenêtre, vous devez mettre un paramètre supplémentaire. Comme:

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

Après le test, il semble que le paramètre supplémentaire que vous utilisez n'a pas vraiment d'importance: ce n'est pas le fait que vous mettez "ce paramètre" ou "cet autre" qui crée la nouvelle "vraie fenêtre" mais le fait qu'il y a un nouveau paramètre (s ).

Mais quelque chose est confus et peut expliquer beaucoup de mauvaises réponses:

Cette:

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

Et ça:

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

ne donnera PAS le même résultat.

Dans le premier cas, lorsque vous ouvrez une page sans paramètre supplémentaire, elle s'ouvre dans un nouvel onglet . Et dans ce cas, le deuxième appel sera également ouvert dans cet onglet raison du nom que vous donnez.

Dans le second cas, comme votre premier appel est effectué avec un paramètre supplémentaire, la page sera ouverte dans une nouvelle " vraie fenêtre ". Et dans ce cas, même si le deuxième appel est effectué sans le paramètre supplémentaire, il sera également ouvert dans cette nouvelle " vraie fenêtre" " ... mais même onglet!

Cela signifie que le premier appel est important car il a décidé où placer la page.

Peter
la source
Cette réponse devrait avoir beaucoup de ++++
Mitch VanDuyn
9

Vous ne devriez pas en avoir besoin. Permettez à l'utilisateur d'avoir les préférences qu'il souhaite.

Firefox fait cela par défaut car ouvrir une page dans une nouvelle fenêtre est ennuyeux et une page ne devrait jamais être autorisée à le faire si ce n'est pas ce que souhaite l'utilisateur. (Firefox vous permet d'ouvrir des onglets dans une nouvelle fenêtre si vous le définissez de cette façon).

CookieOfFortune
la source
31
Tu as tellement tort. et en passant, dire "vous ne devriez pas avoir besoin de" n'est pas approprié, surtout si c'est quelque chose que le patron veut
8
Essayons de garder les commentaires pratiques et utiles. Nous pouvons être en désaccord sans être insultant.
Adam le
17
@theman_on_vista: Convaincre votre patron est de votre responsabilité. Votre entreprise vous a confié la responsabilité de résoudre les problèmes de conception. Cela inclut de signaler les mauvaises idées de conception.
EFraim
2
Tellement vrai. L'écran appartient à l'utilisateur et à personne d'autre.
Christopher Creutzig
12
Il appartient au concepteur de choisir un popup ou un onglet. Bien que je sois un utilisateur qui préfère toujours les onglets, je reconnais que parfois, la conception appelle vraiment une fenêtre contextuelle ou appelle vraiment un onglet. Cela devrait être du domaine du programmeur pour le rendre possible. Mis à part les différences philosophiques, ce type de commentaire est tout à fait inapproprié pour un site de référence de programmation. Et dans ce cas, ce n'est pas un "devrais-je?" question. C'est "comment faire?"
jbenet
9

Vous pouvez essayer la fonction suivante:

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

Le code HTML pour l'exécution:

<a href="#" onclick="open('http://www.google.com')">google search</a>
jgray
la source
2
Quel est le but du popup.location = URL;? L' window.open()appel doit l'ouvrir à l'URL appropriée et, dans votre exemple de code, URLn'est pas défini, il va donc revenir à l' objet URL expérimental (et non largement pris en charge) . Tout en l'utilisant pour cela est discutable, je suis curieux de savoir quelles sont les motivations de son utilisation ici?
ken
Réponse solide et m'a appris à rendre l'emplacement non modifiable. merci
VirtualProdigy
6

La clé est les paramètres:

Si vous fournissez paramètres [Height = "", Width = ""], il s'ouvrira dans de nouvelles fenêtres.

Si vous ne fournissez PAS de paramètres, il s'ouvrira dans un nouvel onglet.

Testé dans Chrome et Firefox

MuniR
la source
1
newwin = window.open ('test.aspx', '', ''); testé dans Chrome: 26
MuniR
5

Fait intéressant, j'ai trouvé que si vous passez dans un vide chaîne (par opposition à une chaîne nulle ou une liste de propriétés) pour le troisième attribut de window.open, il s'ouvrirait dans un nouvel onglet pour Chrome, Firefox et IE. S'il était absent, le comportement était différent.

Voici donc mon nouvel appel:

 window.open(url, windowName, '');
Tom Lianza
la source
Mais l'affiche originale n'essaye-t-elle pas d'ouvrir des popups dans une nouvelle fenêtre? De plus, dans IE 11, l'extrait de code que vous avez donné ouvrira une nouvelle fenêtre ou un nouvel onglet en fonction des préférences du navigateur de l'utilisateur.
4

essayez cette méthode .....

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
la source
3

Pour moi, la solution était d'avoir

"location=0"

dans le 3ème paramètre. Testé sur la dernière FF / Chrome et une ancienne version d'IE11

L'appel de méthode complet que j'utilise est ci-dessous (comme j'aime utiliser une largeur variable):

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
la source
2

Je viens d'essayer cela avec IE (11) et Chrome (54.0.2794.1 canary SyzyASan):

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

... et il s'est ouvert dans une nouvelle fenêtre.

Ce qui signifie que Clint pachl avait raison quand il a dit que fournir n'importe quel paramètre entraînerait l'ouverture de la nouvelle fenêtre.

- et apparemment, cela ne doit pas être un paramètre légitime!

(YMMV - comme je l'ai dit, je ne l'ai testé qu'à deux endroits ... et la prochaine mise à niveau pourrait invalider les résultats, de toute façon)

ETA: Je viens de remarquer, cependant - dans IE, la fenêtre n'a pas de décorations.

theGleep
la source
1

Répondu ici . Mais le poster à nouveau pour référence.

window.open()ne s'ouvrira pas dans le nouvel onglet s'il ne se produit pas lors d'un événement de clic réel. Dans l'exemple donné, l'URL est ouverte lors d'un événement de clic réel. Cela fonctionnera à condition que l'utilisateur dispose des paramètres appropriés dans le navigateur.

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

De même, si vous essayez de faire un appel ajax dans la fonction de clic et que vous souhaitez ouvrir une fenêtre en cas de succès, assurez-vous de faire l'appel ajax avec le async : falsejeu d'options.

Venkat Kotra
la source
1

Je pense que ce n'est pas le problème des propriétés cibles html mais vous avez décoché "ouvrir les fenêtres nw dans un nouvel onglet à la place" option dans l'onglet "onglet" sous le menu "options" de Firefox. vérifiez-le et réessayez.

entrez la description de l'image ici

shihab mm
la source
0

J'avais cette même question mais j'ai trouvé une solution relativement simple.

En JavaScript, je cherchais pour window.opener !=null;déterminer si la fenêtre était une fenêtre contextuelle. Si vous utilisez un code de détection similaire pour déterminer si la fenêtre dans laquelle votre site est affiché est une fenêtre contextuelle, vous pouvez facilement la "désactiver" lorsque vous souhaitez ouvrir une "nouvelle" fenêtre en utilisant le nouveau JavaScript de la fenêtre.

Il suffit de mettre cela en haut de votre page, vous voulez toujours être une "nouvelle" fenêtre.

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

Je l'utilise sur la page de connexion de mon site afin que les utilisateurs n'obtiennent pas de comportement contextuel s'ils utilisent une fenêtre contextuelle pour accéder à mon site.

Vous pouvez même créer une page de redirection simple qui fait cela, puis se déplace vers l'URL que vous lui avez donnée. Quelque chose comme,

JavaScript sur la page parent:

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

Et puis en utilisant un peu de javascript à partir d' ici, vous pouvez obtenir l'URL et y rediriger.

JavaScript sur la page de redirection:

 <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
la source