119 votes

Chrome, Javascript, window.open in new tab

En 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 votes

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

1 votes

Le fait qu'une fenêtre s'ouvre dans un onglet ou dans 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.

153voto

Prakash Chennupati Points 1062

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

L'ouverture de pages à l'aide de Window.open avec un nom de fenêtre différent s'ouvrira dans une nouvelle fenêtre du navigateur comme une fenêtre pop-up, OU dans un nouvel onglet, si l'utilisateur a configuré le navigateur à cet effet.

EDITAR:

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 fait 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" ne doit pas nécessairement être le même appel de fonction, mais il doit provenir de la fonction invoquée par un clic de l'utilisateur.

5. Si un événement initié par l'utilisateur délègue ou reporte 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 d'événement "initié par l'utilisateur".

6. Certains bloqueurs de fenêtres intempestives autorisent les fenêtres ouvertes à l'initiative de l'utilisateur, mais pas celles ouvertes autrement.

7. Si un popup est bloqué, ceux qui sont normalement autorisés par un bloqueur (via des événements initiés par l'utilisateur) seront parfois également bloqués. Quelques exemples

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

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

L'exemple suivant est considéré comme un événement initié par l'utilisateur, même s'il appelle une autre fonction :

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

L'événement suivant ne serait pas qualifié d'événement initié par l'utilisateur, puisque le setTimeout le reporte :

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

2 votes

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 shift et cliquez sur une nouvelle fenêtre de navigateur, si vous maintenez ctrl (ou appuyez sur le bouton central de la souris) un nouvel onglet s'ouvrira en arrière-plan. Ce qui est très bien, vous pouvez faire certaines choses sans avoir besoin de placer des balises d'ancrage partout.

3 votes

"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 est presque certain qu'il ne sera pas ouvert du tout.

3 votes

Depuis le 29 septembre 2014, les derniers Firefox ESR et IE 11 ouvrent les 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 aussi simple. J'ai testé l'ouverture d'une nouvelle fenêtre en passant par le haut, la gauche, la largeur, la hauteur, la barre d'outils, l'emplacement, les répertoires, le statut, la barre de menu, les barres de défilement et le redimensionnement, et en omettant chacun de ces éléments à tour de rôle. Chrome les a toutes ouvertes dans un nouvel onglet, sauf si l'on a omis l'état, la barre de menus ou les barres de défilement. Cela semble si arbitraire que c'est difficile à croire, mais c'est empiriquement ce qui s'est passé. Exemple ici : jsbin.com/mobiyeqojaha/1

35voto

Frank A Tinker Points 131

Il est parfois utile de forcer l'utilisation d'un onglet, si l'utilisateur le souhaite. Comme Prakash l'a dit plus haut, 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 du navigateur puisque la fonction "always" n'est pas considérée comme une initiative de l'utilisateur. Cependant, si nous faisons ceci :

$("#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 du navigateur ou créons le nouvel onglet, comme déterminé par la préférence de l'utilisateur dans le clic du bouton qui EST initié par l'utilisateur. Ensuite, il suffit de définir l'emplacement sur l'URL souhaitée après le retour du message AJAX. Voilà, nous forçons l'utilisation d'un onglet si l'utilisateur le souhaite.

0 votes

J'ai remarqué que si vous avez un point d'arrêt défini dans chrome sur le window.open, le navigateur ouvre une nouvelle fenêtre. Le fait de laisser le code ne pas s'interrompre semble entraîner l'ouverture d'un nouvel onglet à la place.

0 votes

Il s'agit d'une solution de rechange acceptable, sauf si votre window.open et le résultat de la fonction prennent environ 5/6/7 secondes. Imaginez que la fonction envoie des données à un serveur qui génère un PDF, ce qui prend 10 secondes. L'ouverture de la fenêtre vers un onglet vide est immédiate et l'utilisateur fixe l'onglet vide pendant 10 secondes jusqu'à ce qu'il soit rempli comme par magie. Pourtant, sur iOS, c'est à peu près la seule solution.

11voto

Nico Wiedemann Points 34

Pour l'instant (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 utilisé par vos utilisateurs. Il se peut qu'elle ne fonctionne pas dans les futures versions ou avec des paramètres différents.

0 votes

Conformément au commentaire de jfriend00, la façon dont l'utilisateur configure le navigateur détermine la façon dont les nouvelles fenêtres sont ouvertes, et non le code.

0 votes

Je suis d'accord avec vous, c'est une mauvaise idée de compter 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 que cela soit clair, j'ai modifié ma réponse.

2 votes

Pour ceux qui se posent la question, 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.

3voto

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

0voto

Dilip Rajkumar Points 3162

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 votes

Cela fonctionne, mais seulement 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).

0 votes

@djsmith, j'utilise ceci et je rencontre le problème seulement dans IE7. Si vous avez une autre solution, veuillez me la suggérer Merci.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X