Chrome, Javascript, window.open dans un nouvel onglet


110

Dans Chrome, cela s'ouvre dans un nouvel onglet:

<button onclick="window.open('newpage.html', '_blank')" />

cela s'ouvre dans une nouvelle fenêtre (mais j'aimerais que cela s'ouvre également dans un nouvel onglet:

<script language="javascript">
  window.open('newpage.html', '_blank');
</script>

Est-ce faisable?


2
Etes-vous sûr de ce que vous affirmez? Les deux fragments ont le même résultat.
Denys Séguret

1
Qu'une fenêtre s'ouvre dans un onglet ou une nouvelle fenêtre dépend du navigateur local et de la façon dont l'utilisateur configure son navigateur - ce n'est pas quelque chose que vous pouvez spécifier en javascript.
jfriend00

Réponses:


150

Vous ne pouvez pas contrôler cela directement, car c'est une option contrôlée par les utilisateurs d'Internet Explorer.

Ouvrir des pages à l'aide de Window.open avec un nom de fenêtre différent s'ouvrira dans une nouvelle fenêtre de navigateur comme une fenêtre contextuelle, OU s'ouvrira dans un nouvel onglet, si l'utilisateur a configuré le navigateur pour le faire.

ÉDITER:

Une explication plus détaillée:

1. Dans les navigateurs modernes, window.open s'ouvrira dans un nouvel onglet plutôt que dans une fenêtre contextuelle.

2. Vous pouvez forcer un navigateur à utiliser une nouvelle fenêtre ('popup') en spécifiant des options dans le 3ème paramètre

3. Si l'appel window.open ne faisait pas partie d'un événement initié par l'utilisateur, il s'ouvrira dans une nouvelle fenêtre.

4. Un «événement initié par l'utilisateur» n'a pas le même appel de fonction - mais il doit provenir de la fonction appelée par un clic utilisateur

5. Si un événement initié par l'utilisateur délègue ou diffère un appel de fonction (dans un écouteur d'événement ou un délégué non lié à l'événement de clic, ou en utilisant setTimeout par exemple), il perd son statut «initié par l'utilisateur».

6. Certains bloqueurs de popup autoriseront les fenêtres ouvertes à partir d'événements déclenchés par l'utilisateur, mais pas ceux ouverts autrement.

7. Si une fenêtre contextuelle est bloquée, celles normalement autorisées par un bloqueur (via des événements déclenchés par l'utilisateur) seront parfois également bloquées. Quelques exemples…

Forcer une fenêtre à s'ouvrir dans une nouvelle instance de navigateur, au lieu d'un nouvel onglet:

window.open('page.php', '', 'width=1000');

Ce qui suit serait considéré comme un événement déclenché par l'utilisateur, même s'il appelle une autre fonction:

function o(){
  window.open('page.php');
}
$('button').addEvent('click', o);

Ce qui suit ne serait pas considéré comme un événement déclenché par l'utilisateur, car setTimeout le reporte:

function g(){
  setTimeout(o, 1);
}
function o(){
  window.open('page.php');
}
$('button').addEvent('click', g);

2
Je veux juste ajouter qu'en testant dans Chrome et FF, j'ai découvert que l'utilisation de window.open dans ce que vous définissez comme un «événement initié par l'utilisateur» conserve l'action par défaut du navigateur. Je veux dire par là que si dans Chrome vous maintenez la touche Maj sur Chrome et cliquez sur une nouvelle fenêtre de navigateur apparaîtra, si vous maintenez la touche Ctrl (ou appuyez sur le bouton central de la souris), un nouvel onglet s'ouvrira en arrière-plan. Ce qui est très agréable, vous pouvez faire certaines choses sans avoir besoin de placer des balises d'ancrage partout.
Hoffmann

3
"Si l'appel window.open ne faisait pas partie d'un événement initié par l'utilisateur, il s'ouvrira dans une nouvelle fenêtre." Non, il ne sera certainement pas ouvert du tout.
TJ Crowder

3
Depuis le 29/09/2014, les derniers Firefox ESR et IE 11 ouvrent des liens _blank ou window.open dans une nouvelle fenêtre lorsque les appels js utilisent _blank comme nom de fenêtre. Chrome actuel n'est pas si simple. J'ai testé l'ouverture d'une nouvelle fenêtre en passant en haut, à gauche, la largeur, la hauteur, la barre d'outils, l'emplacement, les répertoires, le statut, la barre de menus, les barres de défilement et redimensionnable, et en omettant chacun d'eux à leur tour. Chrome les a tous ouverts dans un nouvel onglet, sauf lorsque l'état, la barre de menus ou les barres de défilement ont été omis. Cela semble tellement arbitraire que c'est difficile à croire, mais empiriquement, c'est ce qui s'est passé. Exemple ici: jsbin.com/mobiyeqojaha/1
énigment

34

Il est parfois utile de forcer l'utilisation d'un onglet, si l'utilisateur aime ça. Comme Prakash l'a indiqué ci-dessus, cela est parfois dicté par l'utilisation d'un événement non initié par l'utilisateur, mais il existe des moyens de contourner cela.

Par exemple:

$("#theButton").button().click( function(event) {
   $.post( url, data )
   .always( function( response ) {
      window.open( newurl + response, '_blank' );
   } );
} );

ouvrira toujours "newurl" dans une nouvelle fenêtre de navigateur car la fonction "toujours" n'est pas considérée comme lancée par l'utilisateur. Cependant, si nous faisons cela:

$("#theButton").button().click( function(event) {
   var newtab = window.open( '', '_blank' );
   $.post( url, data )
   .always( function( response ) {
      newtab.location = newurl + response;
   } );
} );

nous ouvrons la nouvelle fenêtre de navigateur ou créons le nouvel onglet, tel que déterminé par la préférence de l'utilisateur dans le bouton cliquez sur quel IS initié par l'utilisateur. Ensuite, nous définissons simplement l'emplacement sur l'URL souhaitée après le retour de la publication AJAX. Voila, on force l'utilisation d'un onglet si l'utilisateur aime ça.


J'ai remarqué que si vous avez un point d'arrêt défini dans chrome sur window.open, le navigateur ouvre une nouvelle fenêtre. Laisser le code ne pas casser semble entraîner l'ouverture d'un nouvel onglet.
skinnybrit51

C'est une solution de contournement OK à moins que votre window.open et le résultat de la fonction ne prennent environ 5/6/7 secondes. Considérez si la fonction publie des données sur un serveur qui génère un PDF qui prend 10 secondes. Le window.open à un onglet vide est immédiat et l'utilisateur regarde l'onglet vide pendant 10 secondes jusqu'à ce qu'il soit rempli par magie. Toujours sur iOS, c'est à peu près la seule solution.
Kevin Brown


11

Pour le moment (Chrome 39) j'utilise ce code pour ouvrir un nouvel onglet:

window.open('http://www.stackoverflow.com', '_blank', 'toolbar=yes, location=yes, status=yes, menubar=yes, scrollbars=yes');

Bien sûr, cela peut changer dans les futures versions de Chrome.

C'est une mauvaise idée de l'utiliser si vous ne pouvez pas contrôler le navigateur que vos utilisateurs utilisent. Cela peut ne pas fonctionner dans les versions futures ou avec des paramètres différents.


Selon le commentaire de jfriend00, la façon dont l'utilisateur configure le navigateur détermine comment les nouvelles fenêtres sont ouvertes, pas le code.
Lee Taylor

Je suis d'accord avec vous, que c'est une mauvaise idée de s'appuyer sur une telle solution si vous ne pouvez pas contrôler votre environnement. Mais il y a des situations où cela est possible (par exemple je l'utilise dans une application qui est livrée avec son propre Chrome portable). Pour rendre cela clair, j'ai édité mon anser.
Nico Wiedemann

2
Pour ceux qui se demandent, l'exécution de cet extrait de code ne fonctionne pas à cause de cette erreur:VM646 js:12 Blocked opening 'http://www.stackoverflow.com/' in a new window because the request was made in a sandboxed frame whose 'allow-popups' permission is not set.
Benjamin Crouzier

6

Cela ouvrira le lien dans un nouvel onglet dans Chrome et Firefox, et éventuellement dans d'autres navigateurs que je n'ai pas testés:

var popup  = $window.open("about:blank", "_blank"); // the about:blank is to please Chrome, and _blank to please Firefox
popup.location = 'newpage.html';

Il ouvre essentiellement un nouvel onglet vide, puis définit l'emplacement de cet onglet vide. Attention, il s'agit d'une sorte de hack, car le comportement des onglets / fenêtres du navigateur est en réalité le domaine, la responsabilité et le choix du navigateur et de l'utilisateur.

La deuxième ligne peut être appelée dans un rappel (après avoir effectué une requête AJAX par exemple), mais le navigateur ne la reconnaîtra pas comme un événement de clic initié par l'utilisateur et peut bloquer la fenêtre contextuelle.


1
$windowest juste la manière d'utiliser AngularJS window. Vous pouvez simplement utiliser à la windowplace. Plus d'infos: docs.angularjs.org/api/ng/service/$window
Magne

3

Mini-solution claire $('<form action="http://samedomainurl.com/" target="_blank"></form>').submit()


0

Vous pouvez utiliser ce code pour ouvrir dans un nouvel onglet.

function openWindow( url )
{
  window.open(url, '_blank');
  window.focus();
}

Je l'ai obtenu de stackoverflow .


1
Cela fonctionne, mais uniquement si vous êtes dans un gestionnaire de clics utilisateur. Sinon, cela ouvre une nouvelle fenêtre (mais Firefox au moins vous bloquera jusqu'à ce que l'utilisateur l'autorise).
djsmith

@djsmith, j'utilise ceci .. et je suis confronté à un problème uniquement dans IE7. Si vous avez une autre solution, veuillez suggérer .. Merci ..
Dilip Rajkumar

-2

Meilleure façon d'utiliser:

1- ajoutez un lien vers votre html:

<a id="linkDynamic" target="_blank" href="#"></a>

2- ajouter la fonction JS:

function OpenNewTab(href)
{
    document.getElementById('linkDynamic').href = href;
    document.getElementById('linkDynamic').click();
}

3- Appelez simplement la fonction OpenNewTab avec le lien souhaité

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.